目次
- 初心者から実務者向けの包括的解説
- 概要
- Glue が解決する課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- 主要ユースケース
- Glue Studio(ビジュアル ETL ビルダー)
- Glue DataBrew(ノーコード)
- Glue Data Quality
- Glue Schema Registry
- Iceberg / Hudi / Delta Lake サポート
- Worker Type & Auto Scaling
- Job Bookmark(増分処理)
- Workflow とイベント駆動
- セキュリティ
- モニタリング
- コスト
- 関連 AWS サービス連携
- クライアントとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
AWS Glue 完全ガイド 2026
初心者から実務者向けの包括的解説
AWS Glue は、フルマネージドのサーバーレス ETL(抽出・変換・ロード)・データカタログプラットフォームです。2016 年 AWS が発表して以来、データレイク・湖畔型アーキテクチャの中核サービスとして進化しました。本ドキュメントは、Glue の概念・使い方・エコシステム・最新動向を体系的に解説する包括的ガイドです。
ドキュメントの目的
本ガイドは以下を対象としています。
- 初心者向け: AWS Glue とは何か、なぜ必要かを学びたい方
- データエンジニア向け: ETL パイプライン・スキーマ管理を構築したい方
- アナリスト向け: Glue Data Catalog で Athena/Redshift を活用したい方
- SRE/DevOps 向け: Workflow・Job Bookmark・Cost 最適化したい方
- 意思決定者向け: EMR vs Glue vs Dataflow の比較・投資判断
2026 年の AWS Glue エコシステム
- Glue 5.0:2024-2025 年リリース、Spark 3.5 ベース、Ray エンジン対応
- SageMaker Lakehouse:Glue Data Catalog 統合、AI/ML feature engineering
- Apache Iceberg / Hudi / Delta Lake:ネイティブサポート、スキーマ進化対応
- Glue Data Quality:DQDL で品質ルール定義、自動バリデーション
- Glue Streaming:Kinesis/Kafka リアルタイム ETL、低レイテンシ処理
- AI/ML 統合:Generative AI による ETL 最適化、Job 自動生成提案
定義
AWS 公式ドキュメント What is AWS Glue による定義:
“AWS Glue is a serverless, fully managed extract, transform, and load (ETL) service that makes it easy for customers to prepare and load their data for analytics.”
Data Catalog(メタストア)・Crawler(スキーマ自動検出)・ETL Jobs(Spark/Python Shell)・Data Quality・Streaming を統合したデータ統合プラットフォーム。
目次
- 概要
- Glue が解決する課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- Glue Data Catalog
- Crawler(自動スキーマ検出)
- Glue ETL Jobs
- Glue Streaming
- 主要ユースケース
- Glue Studio(ビジュアル)
- [Glue DataBrew(ノーコード)](#glue-databrew ノーコード)
- Glue Data Quality
- Glue Schema Registry
- Iceberg / Hudi / Delta Lake サポート
- Worker Type & Auto Scaling
- Job Bookmark(増分処理)
- Workflow とイベント駆動
- セキュリティ
- モニタリング
- コスト
- 関連 AWS サービス連携
- 類似ツールとの比較
- クライアントとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: AWS Glue は「データを移動・変換する」サービスではなく、「スキーマを一元管理し、自動化された ETL を実行する」インテリジェントなプラットフォーム です。従来のデータウェアハウスと違い、S3 のデータを そのまま 分析対象にできます。
Glue の位置づけ
【図1】AWS データ分析スタックにおける Glue の位置:
graph TD
Sources["データソース"]
Sources -->|S3/RDS/Kinesis| Glue["AWS Glue"]
Glue -->|Data Catalog<br/>ETL Jobs<br/>Streaming| Query["クエリエンジン"]
Query -->|Athena| Analysts["アナリスト"]
Query -->|Redshift| DW["データウェアハウス"]
Query -->|EMR| DataEng["データエンジニア"]
Glue -->|SageMaker| ML["機械学習"]
ML -->|Feature Store| MLEng["ML エンジニア"]
Glue が解決する課題
| 課題 | 従来のアプローチ | Glue による解決 |
|---|---|---|
| スキーマ管理 | 各システムで個別にスキーマ定義・維持 | Data Catalog で一元管理。SSOT 実現 |
| 新規データの検出 | 手動でテーブル作成・スキーマ定義 | Crawler が自動スキャン・検出・登録 |
| ETL パイプライン構築 | Spark クラスター管理・プロビジョニング | サーバーレス Spark ETL、DPU 自動割り当て |
| 増分処理(CDC) | 複雑なロジック、手管理 | Job Bookmark で自動トラッキング |
| データ品質確認 | 各ジョブで個別バリデーション | Glue Data Quality ルール定義・統一 |
| リアルタイム処理 | Flink/Kinesis Data Analytics 別構築 | Glue Streaming で Kinesis/Kafka 直接対応 |
| スキーマ進化 | テーブル再作成・複雑な変換 | Iceberg + Glue でスキーマ進化・タイムトラベル |
主な特徴
| 特徴 | 説明 |
|---|---|
| フルマネージド ETL | クラスター管理なし。DPU リソース自動割り当て |
| Data Catalog(メタストア) | Athena・Redshift Spectrum・EMR の共通メタストア。Hive Metastore 互換 |
| 自動スキーマ検出 | Crawler が S3/RDS/Kinesis をスキャン。スキーマ自動推測・登録 |
| 複数ジョブタイプ対応 | Spark ETL(大規模)/ Python Shell(軽量)/ Streaming(リアルタイム)/ Ray |
| サーバーレス | インスタンス起動なし。実行時間分のみ課金(DPU-時間) |
| Job Bookmark | 前回実行位置を記録。増分処理を自動化 |
| Data Quality | DQDL で品質ルール定義。パイプラインに統合 |
| Workflow & Trigger | Crawler → ETL Job → SNS のオーケストレーション |
| IDE サポート | Glue Studio(ビジュアル)/ Glue Notebook / VS Code 拡張 |
| Iceberg / Hudi / Delta | オープンテーブルフォーマット対応。スキーマ進化・タイムトラベル |
アーキテクチャ
初心者向けメモ: Glue は 4 層構造です。データソース層(S3/RDS 等)→ Glue 層(Catalog/Crawler/Jobs)→ クエリ層(Athena/Redshift)→ ユーザー層。Glue 自体はデータを貯めず、メタデータとトランスフォーム処理を提供します。
【図2】AWS Glue の全体アーキテクチャ:
graph TD
subgraph Sources["データソース層"]
S3["S3<br/>Data Lake"]
RDS["RDS<br/>MySQL/PostgreSQL"]
DDB["DynamoDB"]
Kinesis["Kinesis<br/>Kafka"]
end
subgraph Glue["AWS Glue層"]
Catalog["Data Catalog<br/>(メタストア)"]
Crawler["Crawler<br/>(スキーマ自動検出)"]
ETL["ETL Jobs<br/>(Spark/Python Shell)"]
Streaming["Streaming<br/>(Kinesis/Kafka)"]
Quality["Data Quality<br/>(DQDL ルール)"]
Schema["Schema Registry<br/>(スキーマバージョン管理)"]
end
subgraph Query["クエリ・分析層"]
Athena["Athena<br/>(SQL Ad-hoc)"]
Redshift["Redshift<br/>(DW)"]
EMR["EMR<br/>(Spark)"]
end
subgraph Users["ユーザー層"]
Analysts["分析者"]
DataEng["データエンジニア"]
ML["SageMaker"]
end
Sources -->|Crawler| Catalog
Catalog --> ETL
Catalog --> Streaming
ETL --> Quality
Quality -->|validated| S3
S3 --> Athena
S3 --> Redshift
S3 --> EMR
Athena --> Analysts
Redshift --> Analysts
EMR --> DataEng
Catalog --> Schema
S3 -->|features| ML
コアコンポーネント
1. Glue Data Catalog(メタストア)
【図3】Data Catalog の階層構造:
AWS Glue Data Catalog
├── Database(論理グループ)
│ ├── Table(スキーマ定義)
│ │ ├── Column(カラム情報)
│ │ ├── Location(S3 パス / RDS 接続)
│ │ ├── Format(Parquet / JSON / CSV)
│ │ ├── Partition Keys(パーティション)
│ │ └── Properties(メタデータ)
│ └── Connection(JDBC 接続)
└── Crawler Job(スキーマ自動検出)
主な特徴:
- ✅ Hive Metastore 互換。Athena・Redshift Spectrum・EMR と共有
- ✅ 最初の 100 万オブジェクト無料。超過 $1/100 万/月
- ✅ Data Classification(PII / 機密データ)を自動検出
- ✅ Table バージョン履歴。古いスキーマを復旧可能
実装例:
import boto3
glue_client = boto3.client('glue')
# Database 作成
glue_client.create_database(
DatabaseInput={
'Name': 'my_database',
'Description': 'Analytics database'
}
)
# Table 作成
glue_client.create_table(
DatabaseName='my_database',
TableInput={
'Name': 'orders',
'StorageDescriptor': {
'Columns': [
{'Name': 'order_id', 'Type': 'string'},
{'Name': 'amount', 'Type': 'double'},
{'Name': 'created_at', 'Type': 'timestamp'}
],
'Location': 's3://my-bucket/orders/',
'InputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',
'OutputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat',
'SerdeInfo': {
'SerializationLibrary': 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
}
},
'PartitionKeys': [
{'Name': 'year', 'Type': 'string'},
{'Name': 'month', 'Type': 'string'}
]
}
)
2. Crawler(自動スキーマ検出)
初心者向けメモ: Crawler は「無人の検査官」。データソースを定期的にスキャンし、スキーマを自動推測して Data Catalog に登録します。新規ファイルやスキーマ変更を検知できます。
対応データソース:
| データソース | サポート状況 |
|---|---|
| S3 | ✅ Parquet / ORC / Avro / JSON / CSV |
| RDS(MySQL/PostgreSQL) | ✅ JDBC接続 |
| DynamoDB | ✅ テーブルスキャン |
| Redshift | ✅ 外部スキーマ検出 |
| Kinesis | ✅ JSON スキーマ検出 |
| Kafka | ✅ トピックスキーマ検出(Glue Streaming) |
| DocumentDB | ✅ MongoDB 互換 |
| MongoDB | ✅ 外部接続 |
設定例:
# S3 Crawler 作成
glue_client.create_crawler(
Name='s3-crawler-raw-logs',
Role='arn:aws:iam::ACCOUNT:role/GlueCrawlerRole',
DatabaseName='raw_data',
Description='Auto-detect S3 raw logs schema',
Targets={
'S3Targets': [
{
'Path': 's3://my-bucket/raw-logs/',
'Exclusions': ['**/*.tmp'],
}
]
},
SchemaChangePolicy={
'UpdateBehavior': 'UPDATE_IN_DATABASE',
'DeleteBehavior': 'LOG'
},
RecrawlPolicy={
'RecrawlBehavior': 'CRAWL_EVERYTHING'
},
TablePrefix='raw_'
)
# スケジュール設定(毎日 02:00 UTC)
glue_client.put_workflow_run_properties(
Name='s3-crawler-raw-logs',
RunProperties={'schedule': 'cron(0 2 * * ? *)'}
)
Crawler 実行フロー:
- データソースをスキャン
- ファイル形式・パーティション・カラムを自動推測
- Data Catalog にテーブル・パーティション登録
- スキーマ変更を検知 → 自動更新 or ログ出力
3. Glue ETL Jobs
複数実行ユーティリティ:
| ジョブタイプ | ワーカー | ユースケース | 最小コスト |
|---|---|---|---|
| Spark ETL | G.1X / G.2X / G.4X / G.8X | 大規模データ変換 | 2 DPU × 0.44 = $0.88 |
| Python Shell | 0.0625 DPU | 軽量処理・スクリプト | $0.44/時間 |
| Streaming ETL | G.1X | リアルタイム Kinesis/Kafka | 2 DPU × 0.44 = $0.88 |
| Ray | R.4X / R.10X / R.16X | 機械学習・並列処理 | 2 R.4X × 0.55 = 1.10 |
DPU 仕様:
| ワーカータイプ | vCPU | メモリ | ディスク |
|---|---|---|---|
| G.1X | 4 | 16 GB | 30 GB |
| G.2X | 8 | 32 GB | 60 GB |
| G.4X | 16 | 64 GB | 120 GB |
| G.8X | 32 | 128 GB | 240 GB |
| R.4X | 16 | 128 GB | 250 GB |
Spark ETL(PySpark)
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.dynamicframe import DynamicFrame
from pyspark.sql.functions import col, when, coalesce
# Glue コンテキスト初期化
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
# Data Catalog から読み込み
datasource = glueContext.create_dynamic_frame.from_catalog(
database='raw_data',
table_name='orders'
)
# DynamicFrame → DataFrame 変換
df = datasource.toDF()
# 変換処理
df_cleaned = df \
.dropna(subset=['order_id']) \
.filter(col('amount') > 0) \
.withColumn('amount_usd', col('amount') * 1.0) \
.withColumn('year', col('created_at').cast('date').substr(1, 4))
# Parquet で S3 に書き込み
output_path = 's3://my-bucket/processed/orders/'
df_cleaned.write \
.mode('overwrite') \
.partitionBy('year') \
.parquet(output_path)
# Data Catalog に書き込み
output_frame = DynamicFrame.fromDF(df_cleaned, glueContext, 'output')
glueContext.write_dynamic_frame.from_options(
frame=output_frame,
connection_type='s3',
connection_options={'path': output_path},
format='parquet',
format_options={'useGlueParquetWriter': True}
)
job.commit()
Python Shell Job
# 軽量な ETL・データ処理用
import boto3
import pandas as pd
s3 = boto3.client('s3')
# S3 から CSV を pandas で読み込み
obj = s3.get_object(Bucket='my-bucket', Key='data/input.csv')
df = pd.read_csv(obj['Body'])
# データクレンジング
df = df.dropna()
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')
# CSV に書き込み
csv_buffer = io.StringIO()
df.to_csv(csv_buffer, index=False)
s3.put_object(
Bucket='my-bucket',
Key='data/output.csv',
Body=csv_buffer.getvalue()
)
4. Glue Streaming(リアルタイム ETL)
Kinesis/Kafka → S3 のリアルタイム処理:
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.context import SparkContext
from pyspark.sql import DataFrame
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
# Kinesis Stream から読み込み
kinesis_df = spark.readStream \
.format('kinesis') \
.option('streamName', 'my-stream') \
.option('initialPosition', 'TRIM_HORIZON') \
.load()
# JSON パース・変換
parsed_df = kinesis_df \
.selectExpr('CAST(data AS STRING) as json_data') \
.select(from_json(col('json_data'), schema).alias('data')) \
.select('data.*')
# S3 に マイクロバッチ書き込み(例:10 秒ごと)
query = parsed_df.writeStream \
.format('parquet') \
.option('path', 's3://my-bucket/streaming/') \
.option('checkpointLocation', 's3://my-bucket/checkpoint/') \
.option('maxRecordsPerFile', 10000) \
.trigger(processingTime='10 seconds') \
.start()
query.awaitTermination()
主要ユースケース
初心者向けメモ: Glue は「ETL」だけでは不十分。ここでは実務でよくある 10 以上のユースケースを整理します。
1. データレイク ETL(最典型)
S3 に落ちた raw データを Parquet 変換・スキーマ統一。
✅ 実装例:
- S3
raw/フォルダ → Crawler で自動スキーマ検出 - Glue Job で CSV → Parquet 変換
- Athena で即座にクエリ
- コスト削減:Parquet で 90% クエリ費用削減
2. Schema Discovery & Governance
複雑な RDS・DynamoDB スキーマを Glue Data Catalog で一元管理。
✅ 実装例:
- RDS Crawler → Data Catalog で MySQL スキーマ自動登録
- DynamoDB Crawler → JSON スキーマ推測
- Athena から RDS テーブルに直接クエリ(Redshift Spectrum)
- Data Classification で PII 自動検出・マスキング
3. CDC(Change Data Capture)& 増分処理
RDS 変更分を検知 → S3 にインクリメンタルロード。
✅ 実装例:
- RDS Crawler(毎時)
- Glue Job Bookmark で最終実行以降の行を抽出
- 新規・更新行を S3
delta/に保存 - Iceberg テーブルで merge
4. Data Quality パイプライン
Glue Data Quality ルールで品質ガバナンス。
✅ 実装例:
ANALYZE rules {
ColumnExists "order_id",
IsComplete "order_id" > 0.95,
ColumnValues "amount" between 0 and 1000000,
IsUnique "order_id",
RowCount > 1000
}
品質スコア < 0.8 なら ETL 中止、CloudWatch アラート
5. ML Feature Engineering
SageMaker Feature Store へのデータ準備。
✅ 実装例:
- 過去 365 日のユーザー行動集計
- 統計特徴量(mean, std, median)生成
- S3 → SageMaker Feature Store 同期
- SageMaker Training で自動取得
6. Lakehouse Architecture(Iceberg + Glue)
スキーマ進化・タイムトラベルクエリ対応。
✅ 実装例:
- Glue Job が Iceberg テーブルに UPDATE/DELETE
- Schema Evolution:新規カラム追加 → 自動互換
SELECT * FROM orders AS OF TIMESTAMP '2026-01-01'で過去データ復元
7. クロスプラットフォーム データ移行
RDS/DynamoDB → Redshift への定期ロード。
✅ 実装例:
- Glue Job:RDS → Parquet 変換
- Redshift COPY コマンドで bulk ロード
- スケジュール Workflow:毎夜 01:00
- エラー時 SNS アラート
8. ログアグリゲーション & 分析
CloudTrail / ALB ログを統一スキーマで分析。
✅ 実装例:
- CloudTrail ログ → S3 自動出力
- Crawler で自動スキーマ検出
- Athena で即座に セキュリティ分析
9. IoT・タイムシリーズ データ処理
センサーデータ → 時間ウィンドウ集計。
✅ 実装例:
- Kinesis → Glue Streaming
- 1 分ごとの統計(min/max/avg)計算
- S3 に Parquet 保存
- QuickSight で可視化
10. GDPR / コンプライアンス Audit
データ血統(lineage)・アクセス履歴追跡。
✅ 実装例:
- Glue Job で PII データを自動マスク
- Data Classification で機密度レベル付与
- CloudTrail で Glue API 呼び出し監査ログ
ユースケース適性マトリクス
| ワークロード | Glue 適性 | 代替サービス |
|---|---|---|
| S3 データレイク ETL | ★★★★★ | EMR, Dataflow |
| スキーマ管理・Catalog | ★★★★★ | Hue, Apache Atlas |
| 増分処理(CDC) | ★★★★ | DMS, Debezium |
| ノーコード変換 | ★★★★★ | DataBrew(含む) |
| リアルタイム ETL | ★★★★ | Kinesis Data Analytics |
| 機械学習 Feature準備 | ★★★★ | Feature Store |
| クロスプラットフォーム移行 | ★★★★ | DMS, Stitch |
| ビジネスロジック複雑 | ★★ | Dataflow, dbt |
Glue Studio(ビジュアル ETL ビルダー)
Glue Studio は ノーコード/ロータッチ ETL ビジュアルキャンバス。
【図4】Glue Studio キャンバス例:
- [S3 Source] → [Filter] → [Repartition] → [S3 Target]
- ↓ ↓ ↓ ↓
- raw/ amount optimize processed/
- orders/ > 100 partition orders/
主な特徴:
- ✅ ビジュアルノードベース構成(ドラッグ&ドロップ)
- ✅ テンプレート:CloudFormation/Redshift Spectrum 等
- ✅ 自動ジョブ生成:Spark/Python Shell コード自動出力
- ✅ 動的フレーム対応
- ✅ 本番 Job に変換可能
Glue DataBrew(ノーコード)
AWS Glue DataBrew は ビジネスアナリスト向け ノーコードデータ準備。
機能:
- ✅ 160+ ビルトインレシピ(スキーマ検出・外れ値検出・正規化)
- ✅ UI ドラッグ&ドロップで複雑なデータ変換
- ✅ プロファイル:データ品質スコア自動計算
- ✅ Project ベース管理・バージョン履歴
比較表:
| 観点 | Glue Studio | DataBrew | Spark ETL |
|---|---|---|---|
| 開発者 | データエンジニア | ビジネスアナリスト | データ科学者 |
| スケール | 大規模 | 中規模(1GB-1TB) | 超大規模 |
| コード出力 | ✅ Spark/Python | ❌ なし | 手書き |
| 統合度 | ★★★★ | ★★★ | ★★★★★ |
Glue Data Quality
DQDL(Data Quality Definition Language)で品質ルール定義:
# data-quality-rules.yml
Rules:
- Name: "ColumnExists"
Expression: "ColumnExists order_id"
- Name: "IsComplete"
Expression: "IsComplete order_id > 0.99"
- Name: "ColumnValues Range"
Expression: "ColumnValues amount between 0 and 1000000"
- Name: "IsUnique"
Expression: "IsUnique order_id"
- Name: "Freshness"
Expression: "DaysSinceCreatedTime created_at < 7"
CloudWatch 統合:
# Glue Job 内で実行
quality_score = glueContext.data_quality.analyze_df(
df,
rules=dqdl_rules
)
if quality_score < 0.8:
raise Exception(f"Data quality check failed: {quality_score}")
Glue Schema Registry
スキーマバージョン管理・進化追跡:
機能:
- ✅ Apache Avro / JSON Schema / Protobuf サポート
- ✅ Schema Evolution:互換性チェック
- ✅ スキーマバージョン履歴
- ✅ クライアント SDK:スキーマ自動シリアライズ
import boto3
glue = boto3.client('glue')
# スキーマ登録
glue.create_schema(
RegistryId={'RegistryName': 'my-registry'},
SchemaName='orders',
DataFormat='AVRO',
Compatibility='BACKWARD'
)
# スキーマバージョン登録
glue.register_schema_version(
SchemaId={'SchemaName': 'orders'},
SchemaDefinition='{"type":"record","name":"Order",...}'
)
Iceberg / Hudi / Delta Lake サポート
【表1】オープンテーブルフォーマット比較:
| フレームワーク | 主要機能 | Glue サポート |
|---|---|---|
| Iceberg | スキーマ進化・タイムトラベル・ACID トランザクション | ✅ Spark SQL ネイティブ |
| Hudi | CoW/MoR、Incremental Processing | ✅ Spark ETL |
| Delta Lake | Time Travel、Schema Enforcement | ✅ Spark ETL + Photon |
Iceberg 実装例:
from pyspark.sql.types import *
# Iceberg テーブル作成
df.write.mode("overwrite") \
.format("iceberg") \
.mode("overwrite") \
.option("write.format.default", "parquet") \
.saveAsTable("my_catalog.orders")
# スキーマ進化:新規カラム追加
spark.sql("""
ALTER TABLE my_catalog.orders
ADD COLUMN status STRING DEFAULT 'pending'
""")
# タイムトラベル:過去スナップショット復元
spark.sql("""
SELECT * FROM my_catalog.orders
TIMESTAMP AS OF '2026-01-15 00:00:00'
""")
# ACID トランザクション
spark.sql("""
UPDATE my_catalog.orders SET status = 'shipped'
WHERE order_id = '12345'
""")
Worker Type & Auto Scaling
| ワーカー | vCPU | メモリ | DPU-時間価格 | ユースケース |
|---|---|---|---|---|
| G.1X | 4 | 16GB | $0.44 | 小~中規模 ETL |
| G.2X | 8 | 32GB | $0.88 | 標準 ETL |
| G.4X | 16 | 64GB | $1.76 | 大規模 ETL |
| G.8X | 32 | 128GB | $3.52 | 超大規模 ETL |
| Ray | Var | Var | $0.55+ | ML・並列処理 |
Auto Scaling:
glue_client.create_job(
Name='my-job',
Command={
'Name': 'glueetl',
'ScriptLocation': 's3://bucket/script.py'
},
DefaultArguments={
'--job-bookmark-option': 'job-bookmark-enable',
'--enable-metrics': 'true',
'--enable-glue-datacatalog': 'true'
},
MaxCapacity=100.0, # G.1X なら最大 25 ワーカー
ExecutionProperty={
'MaxConcurrentRuns': 2
},
Timeout=2880
)
Job Bookmark(増分処理)
前回実行位置を自動トラッキング。重複処理回避・増分処理を簡素化。
# 例:毎日新規ファイルのみ処理
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
datasource = glueContext.create_dynamic_frame.from_catalog(
database='raw_data',
table_name='events'
)
# Job Bookmark が自動的に「前回最後の行」を記録
# 次回実行時は前回以降のデータのみ処理
glueContext.write_dynamic_frame.from_options(
frame=datasource,
connection_type='s3',
connection_options={'path': 's3://bucket/output/'},
format='parquet'
)
job.commit()
実行履歴:
- Run 1: rows 1-1000 processed → bookmark: 1000
- Run 2: rows 1001-2000 processed (新規 1000 行のみ)
- Run 3: rows 2001-3000 processed (新規 1000 行のみ)
Workflow とイベント駆動
Glue Workflows で複数 Job・Crawler を オーケストレーション:
glue_client.create_workflow(
Name='data-pipeline',
DefaultRunProperties={
'TZ': 'UTC'
}
)
# Trigger 1:毎日 02:00 Crawler 実行
glue_client.put_trigger(
Name='daily-crawler-trigger',
WorkflowName='data-pipeline',
Type='SCHEDULED',
Schedule='cron(0 2 * * ? *)',
Actions=[
{
'CrawlerName': 'raw-data-crawler'
}
]
)
# Trigger 2:Crawler 成功後 ETL Job
glue_client.put_trigger(
Name='etl-job-trigger',
WorkflowName='data-pipeline',
Type='CONDITIONAL',
Predicate={
'Logical': 'ANY',
'Conditions': [
{
'LogicalOperator': 'EQUALS',
'CrawlerName': 'raw-data-crawler',
'CrawlState': 'SUCCEEDED'
}
]
},
Actions=[
{
'JobName': 'etl-transform-job'
}
]
)
# Trigger 3:成功時 SNS 通知
glue_client.put_trigger(
Name='success-notification',
WorkflowName='data-pipeline',
Type='CONDITIONAL',
Predicate={
'Logical': 'ANY',
'Conditions': [
{
'LogicalOperator': 'EQUALS',
'JobName': 'etl-transform-job',
'State': 'SUCCEEDED'
}
]
},
Actions=[
{
'NotificationProperty': {
'NotifyDelayAfter': 60
},
'SecurityConfiguration': 'default'
}
]
)
セキュリティ
IAM & Lake Formation
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GlueJobExecute",
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Action": [
"glue:GetJob",
"glue:GetJobRun",
"glue:StartJobRun"
]
},
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "DataCatalog",
"Effect": "Allow",
"Action": [
"glue:GetDatabase",
"glue:GetTable",
"glue:GetPartitions"
],
"Resource": "*"
}
]
}
Connection 認証
RDS/JDBC 接続で credentials 自動管理:
glue_client.create_connection(
Name='rds-prod-mysql',
ConnectionType='JDBC',
ConnectionProperties={
'JDBC_DRIVER_JAR_URI': 's3://bucket/mysql-connector.jar',
'JDBC_DRIVER_CLASS_NAME': 'com.mysql.jdbc.Driver',
'SECRET_ID': 'arn:aws:secretsmanager:...:secret:rds/prod',
'JDBC_URL': 'jdbc:mysql://prod-mysql.rds.amazonaws.com:3306/mydb'
}
)
KMS 暗号化
glue_client.create_job(
Name='secure-job',
Command={'Name': 'glueetl', 'ScriptLocation': '...'},
SecurityConfiguration={
'EncryptionConfiguration': {
'S3Encryption': [
{
'S3EncryptionMode': 'SSE-KMS',
'KmsKeyArn': 'arn:aws:kms:...:'
}
],
'CloudWatchEncryption': {
'CloudWatchEncryptionMode': 'SSE-KMS',
'KmsKeyArn': 'arn:aws:kms:...:'
},
'JobBookmarksEncryption': {
'JobBookmarksEncryptionMode': 'SSE-KMS',
'KmsKeyArn': 'arn:aws:kms:...:'
}
}
}
)
モニタリング
CloudWatch メトリクス & ログ
# Job 実行メトリクス
# - glue.driver.aggregate.numFailedTasks
# - glue.driver.memory.usedPercent
# - glue.executor.task.duration
# - glue.executor.memory.usedPercent
# CloudWatch Logs
import boto3
logs = boto3.client('logs')
logs.put_metric_filter(
logGroupName='/aws-glue/jobs/my-job',
filterName='ErrorCount',
filterPattern='[ERROR]',
metricTransformations=[
{
'metricName': 'GlueJobErrors',
'metricNamespace': 'CustomGlue',
'metricValue': '1'
}
]
)
Glue Job Run UI
- ✅ Job パフォーマンス可視化
- ✅ Task failures 追跡
- ✅ Spark UI / Driver ログ
- ✅ 実行期間・リソース使用量
コスト
課金モデル
| 項目 | 価格 |
|---|---|
| Spark ETL (G.1X) | $0.44 / DPU-時間 |
| Python Shell | $0.44 / DPU-時間(最小 0.0625 DPU) |
| Streaming ETL | $0.44 / DPU-時間(最小 2 DPU) |
| Ray (R.4X) | $0.55 / DPU-時間 |
| Data Catalog | 初 100 万オブジェクト無料、超過 $1/100 万オブジェクト/月 |
| Crawler | $0.44 / DPU-時間(最小 0.1 DPU) |
| DataBrew | $0.48 / ノード時間 |
コスト最適化
✅ チェックリスト:
- ❌ 常時実行 Job ⟹ ✅ スケジュール実行に変更
- ❌ G.2X / G.4X デフォルト ⟹ ✅ G.1X で十分か検証
- ❌ Job Bookmark 未設定 ⟹ ✅ 増分処理で DPU 削減
- ❌ 過度な Crawler 実行 ⟹ ✅ 1 日 1 回で十分な場合が多い
- ❌ Python Shell で Spark 処理 ⟹ ✅ Spark ETL を使用
関連 AWS サービス連携
Athena との関係
| 観点 | Glue | Athena |
|---|---|---|
| 役割 | メタストア + ETL | クエリエンジン |
| Data Catalog | 提供 | 消費 |
| スキーマ管理 | ✅ Crawler で自動 | ❌ 外部依存 |
| クエリ実行 | ❌ | ✅ Ad-hoc SQL |
典型パターン:
- S3 → Crawler (Glue) → Data Catalog
- ↓
- Athena (SQL Query)
Lake Formation との関係
【表2】Glue vs Lake Formation:
| 機能 | Glue | Lake Formation |
|---|---|---|
| メタストア | ✅ Data Catalog | ✅ Data Catalog 使用 |
| ETL | ✅ Jobs | ❌ |
| アクセス制御 | ✅ (基本) | ✅ (高度な ABAC) |
| 데이터 암호화 | ✅ | ✅ |
| 청사진 (Blueprint) | ❌ | ✅ 自動テーブル生成 |
EMR との比較
| 観点 | Glue | EMR |
|---|---|---|
| 管理方式 | サーバーレス | クラスタ管理 |
| Spark バージョン | AWS 指定 | ユーザー選択 |
| スケーラビリティ | 自動 DPU | 手動 Auto Scaling |
| コスト | DPU-時間 | ノード-時間 |
| カスタマイズ | ★★ | ★★★★★ |
クライアントとエコシステム
AWS Glue API / CLI
# Job 作成
aws glue create-job \
--name my-etl-job \
--role arn:aws:iam::ACCOUNT:role/GlueRole \
--command name=glueetl,script-location=s3://bucket/job.py
# Job 実行
aws glue start-job-run \
--job-name my-etl-job \
--arguments '{"--enable-metrics":"true"}'
# Job 状態確認
aws glue get-job-runs \
--job-name my-etl-job \
--query 'JobRuns[*].[Id,JobRunState,StartedOn]'
# Database テーブル一覧
aws glue get-tables \
--database-name my_database
Boto3 SDK
import boto3
glue = boto3.client('glue', region_name='us-east-1')
# Job 実行
response = glue.start_job_run(
JobName='my-job',
Arguments={
'--TempDir': 's3://bucket/temp',
'--job-bookmark-option': 'job-bookmark-enable'
}
)
job_run_id = response['JobRunId']
# Poll 完了
waiter = glue.get_waiter('job_run_complete')
waiter.wait(JobName='my-job', RunId=job_run_id)
Terraform
resource "aws_glue_job" "example" {
name = "my-etl-job"
role_arn = aws_iam_role.glue_role.arn
command {
name = "glueetl"
script_location = "s3://bucket/job.py"
}
default_arguments = {
"--job-bookmark-option" = "job-bookmark-enable"
"--enable-metrics" = "true"
}
}
resource "aws_glue_crawler" "example" {
database_name = aws_glue_catalog_database.example.name
name = "my-crawler"
role = aws_iam_role.glue_role.arn
s3_target {
path = "s3://bucket/data/"
}
}
AWS CDK (Python)
from aws_cdk import (
aws_glue as glue,
aws_iam as iam,
core
)
class GlueJobStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
role = iam.Role(
self, "GlueRole",
assumed_by=iam.ServicePrincipal("glue.amazonaws.com")
)
job = glue.CfnJob(
self, "MyJob",
name="my-etl-job",
role=role.role_arn,
command=glue.CfnJob.ExecutionPropertyProperty(
max_concurrent_runs=2
),
glue_version="4.0"
)
ベストプラクティス
採用判断チェックリスト
- ✅ S3 データレイク ETL が必要か
- ✅ Data Catalog を Athena/Redshift と共有するか
- ✅ Crawler で自動スキーマ検出が有効か
- ✅ 増分処理(CDC)が必要か
- ✅ Data Quality ルールを自動化したいか
- ✅ サーバーレス実行優先か
パフォーマンス最適化
| 項目 | ベストプラクティス |
|---|---|
| ジョブタイプ | 大規模(>10GB)= Spark ETL、小規模 = Python Shell |
| ワーカータイプ | G.1X で開始 → ボトルネック確認後アップスケール |
| フォーマット | CSV/JSON → Parquet/ORC 変換(圧縮率 90%) |
| パーティション | 年/月で自動分割。Crawler で パーティション検出 |
| Bookmark | 増分処理 = job-bookmark-enable 必須 |
| キャッシュ | 中間テーブル → Parquet で再利用 |
アンチパターン
❌ 避けるべき:
- Crawler を本番前に毎回実行 ⟹ ✅ スキーマ確定後は 1 日 1 回
- 小規模データに Spark ETL ⟹ ✅ Python Shell / Lambda 推奨
- Job Bookmark 未設定で全スキャン ⟹ ✅ 増分処理で DPU 削減
- Data Catalog なしで各サービスで個別定義 ⟹ ✅ SSOT に統一
- PII データを暗号化なしで S3 保存 ⟹ ✅ KMS/Lake Formation
トラブルシューティング
よくあるエラー
| エラー | 原因 | 解決策 |
|---|---|---|
OutOfMemory |
ワーカーメモリ不足 | G.1X → G.2X にアップグレード |
Timeout |
ジョブ実行時間超過 | Timeout パラメータ増加 / パーティション調整 |
AccessDenied |
IAM 権限不足 | glue:* / s3:* 権限確認 |
SchemaValidationException |
スキーマ型不一致 | 型キャスト処理追加 |
Job Bookmark Failed |
チェックポイント破損 | --job-bookmark-option を job-bookmark-disable → 再度有効化 |
CloudWatch ログ確認
aws logs tail /aws-glue/jobs/my-job --follow
# 特定の Job Run ログ
aws logs tail /aws-glue/jobs/my-job/g_12345abcd --follow
2025-2026 最新動向
Glue 5.1 & Spark 3.5
- ✅ Spark 3.5.6 アップグレード:Python 3.11、Scala 2.12.18 対応
- ✅ オープンテーブルフォーマット最新版:Apache Iceberg 1.10.0、Hudi 1.0.2、Delta Lake 3.3.2
- ✅ Ray エンジン対応(機械学習・複雑並列処理)
- ✅ パフォーマンス 20-30% 向上
Data Quality の高度化
- ✅ Rule Labeling:カテゴリ別に品質ルール組織化
- ✅ ML-Powered Data Quality:異常検知・自動ルール推奨機能
- ✅ Anomaly Detection:データパターン時系列監視
- ✅ ステークホルダー別レポート:チーム・ドメイン単位の分析
SageMaker Lakehouse & Feature Store 統合
- ✅ Glue Data Catalog → SageMaker Feature Store 自動同期
- ✅ Feature Engineering Pipeline 自動化
- ✅ ML Training に Glue ETL 統合
AI/ML 機能拡張
- ✅ Generative AI による ETL Job 自動生成(提案)
- ✅ Data Classification 改善
- ✅ LLM ベースの ETL 提案システム
オープンテーブルフォーマット完全対応
- ✅ Apache Iceberg ネイティブサポート(Schema Evolution/ACID トランザクション)
- ✅ Hudi スケーラビリティ:CoW/MoR インクリメンタル処理
- ✅ Delta Lake UniForm 対応:Iceberg エンジンでの読み取り
- ✅ クロス形式相互運用性
学習リソース
公式ドキュメント
| リソース | URL |
|---|---|
| Glue Developer Guide | https://docs.aws.amazon.com/glue/latest/dg/ |
| Glue API Reference | https://docs.aws.amazon.com/glue/latest/webapi/ |
| Glue Studio Guide | https://docs.aws.amazon.com/glue/latest/ug/studio-guide.html |
| DataBrew Guide | https://docs.aws.amazon.com/databrew/latest/dg/ |
| Data Quality Guide | https://docs.aws.amazon.com/glue/latest/dg/data-quality.html |
| Schema Registry | https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html |
| Pricing | https://aws.amazon.com/glue/pricing/ |
| AWS Glue Features | https://aws.amazon.com/glue/features/ |
| What is AWS Glue | https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html |
| Getting Started | https://docs.aws.amazon.com/glue/latest/dg/getting-started.html |
AWS Glue 5.1 関連ドキュメント
オープンテーブルフォーマット
AWS トレーニング・認定
- AWS Certified Data Analytics - Specialty
- AWS Skill Builder コース(Glue 基礎~応用)
コミュニティ・ブログ
- AWS Database Blog(Glue 事例・Tips)
- AWS Big Data Blog
- Medium AWS Glue タグ
- GitHub aws-samples/aws-glue-samples
最終更新:2026-04-26
実装例・活用シーン
シーン 1:リテール売上分析パイプライン
"""
流れ:
1. POS System → S3 (CSV)
2. Crawler で自動スキーマ検出
3. Glue Job で Parquet 変換
4. Redshift にロード
5. Athena で分析
"""
# 毎日 00:00 実行
glue_client.put_trigger(
Name='daily-sales-etl',
Type='SCHEDULED',
Schedule='cron(0 0 * * ? *)',
Actions=[
{
'CrawlerName': 'pos-data-crawler'
}
]
)
# ETL Job: CSV → Parquet
datasource = glueContext.create_dynamic_frame.from_catalog(
database='retail',
table_name='pos_transactions'
)
df = datasource.toDF() \
.filter(col('transaction_date') >= date_sub(current_date(), 1))
df.write.mode('append') \
.partitionBy('transaction_date') \
.parquet('s3://data-lake/retail/transactions-clean/')
# Redshift に自動ロード
glueContext.write_dynamic_frame.from_options(
frame=DynamicFrame.fromDF(df, glueContext, 'output'),
connection_type='redshift',
connection_options={
'redshift_tmp_dir': 's3://bucket/tmp/',
'user_name': 'admin',
'password': 'secret',
'database': 'analytics',
'table': 'transactions',
'aws_iam_role': 'arn:aws:iam::ACCOUNT:role/RedshiftRole'
}
)
シーン 2:顧客 360 ビュー(マルチソース統合)
"""
Customer Master Data:
1. CRM (Salesforce)
2. Email Platform (Marketo)
3. E-commerce (BigCommerce)
→ 全て S3 に統合 → Glue で マージ
"""
crm_df = glueContext.create_dynamic_frame.from_catalog(
database='crm', table_name='salesforce_contacts'
).toDF()
email_df = glueContext.create_dynamic_frame.from_catalog(
database='marketing', table_name='marketo_leads'
).toDF()
ecom_df = glueContext.create_dynamic_frame.from_catalog(
database='ecommerce', table_name='bigcommerce_customers'
).toDF()
# 全テーブルを customer_id で join
unified = crm_df \
.join(email_df, 'customer_id', 'left_outer') \
.join(ecom_df, 'customer_id', 'left_outer')
# Data Quality チェック
quality_rules = """
ANALYZE rules {
ColumnExists "customer_id",
IsComplete "customer_id" > 0.99,
ColumnValues "email" matches_regex '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}{{CONTENT}}#x27;
}
"""
unified.write.mode('overwrite') \
.partitionBy('updated_date') \
.parquet('s3://data-lake/customer-360/')
シーン 3:GDPR コンプライアンス(PII 検出・マスキング)
"""
PII 検出・自動マスキング
"""
def mask_pii(df):
from pyspark.sql.functions import when, regexp_replace, sha2, concat_ws
return df \
.withColumn('email_masked',
when(col('email').isNotNull(),
concat_ws('@',
sha2(col('email'), 256).substr(1, 8),
'masked.local'
)
).otherwise(None)
) \
.withColumn('phone_masked',
when(col('phone').isNotNull(),
regexp_replace(col('phone'), '\\d(?=\\d{4})', '*')
).otherwise(None)
) \
.drop('email', 'phone')
datasource = glueContext.create_dynamic_frame.from_catalog(
database='sensitive', table_name='customers'
)
df_masked = mask_pii(datasource.toDF())
# Data Classification で自動 PII 検出
glue_client.put_data_catalog_encryption_settings(
CatalogEncryptionMode='SSE-KMS',
ConnectionPasswordEncryption={
'ReturnConnectionPasswordEncrypted': True,
'KmsKeyId': 'arn:aws:kms:...'
}
)
導入ロードマップ
Phase 1(1-2 ヶ月):基礎構築
- [ ] Glue IAM Role / S3 バケット セットアップ
- [ ] Data Catalog データベース・テーブル作成
- [ ] S3 Crawler 設定・テスト
- [ ] 初期 Glue Job(CSV → Parquet)
Phase 2(2-4 ヶ月):パイプライン拡張
- [ ] Workflow・Trigger 統合
- [ ] RDS/DynamoDB Crawler 追加
- [ ] Job Bookmark 実装
- [ ] Data Quality ルール定義
Phase 3(4-6 ヶ月):最適化・ガバナンス
- [ ] Lake Formation 統合(高度なアクセス制御)
- [ ] Glue Schema Registry
- [ ] Iceberg テーブル移行
- [ ] Cost Optimization(DPU チューニング)
Phase 4(6+ ヶ月):AI/ML 統合
- [ ] SageMaker Feature Store 連携
- [ ] Glue Streaming パイプライン
- [ ] データ血統(Lineage)トラッキング
実装チェックリスト
✅ セットアップ
- [ ] Glue IAM Role 作成(S3/RDS アクセス権限)
- [ ] S3 Data Lake バケット作成(versioning/encryption)
- [ ] Data Catalog データベース作成
- [ ] Crawler IAM Role 作成
✅ Crawler
- [ ] S3 Crawler 作成(raw/フォルダ)
- [ ] スケジュール設定(毎日 02:00)
- [ ] パーティション自動検出確認
- [ ] スキーマ変更検知テスト
✅ ETL Job
- [ ] PySpark Job テンプレート作成
- [ ] Job Bookmark 有効化
- [ ] Data Catalog from_catalog() で読み込み確認
- [ ] S3 出力確認(Parquet 形式)
✅ Quality & Monitoring
- [ ] Data Quality ルール定義
- [ ] CloudWatch メトリクス・アラーム設定
- [ ] Job Run UI で性能確認
- [ ] ログストレージ確保(CloudWatch Logs)
✅ Security
- [ ] KMS encryption 設定
- [ ] Lake Formation アクセス制御
- [ ] Connection credentials(Secrets Manager)
- [ ] CloudTrail 監査ログ有効化
✅ Cost
- [ ] Crawler 実行頻度最適化
- [ ] Worker Type チューニング
- [ ] Job Concurrent Runs 制限
- [ ] 未使用リソース削除
まとめ
AWS Glue は「メタストア&サーバーレス ETL の統合プラットフォーム」。Data Catalog が Athena・EMR・Redshift の共通メタストア、Crawler が自動スキーマ検出、ETL Jobs が Spark/Python での変換・ロード、Data Quality が品質管理を一貫して提供します。
Glue の強み
✅ サーバーレス:クラスター管理不要
✅ 自動化:Crawler でスキーマ検出・Job Bookmark で増分処理
✅ 統合度:Athena/Redshift/EMR と Data Catalog 共有
✅ 品質管理:DQDL で品質ルール定義・自動バリデーション
✅ スケーラビリティ:自動 DPU 割り当て、Ray 並列処理対応
Glue の選択基準
Glue を選ぶべき:
- S3 データレイク ETL
- 複数サービスでメタストア共有
- 自動スキーマ検出が有効
- サーバーレス優先
代替検討:
- カスタム Spark ロジック → EMR
- 複雑ビジネスロジック → Dataflow / dbt
- 小規模・軽量処理 → Lambda / Python Shell
参考文献
AWS 公式ドキュメント
- AWS Glue - What is Glue?
- AWS Glue Developer Guide
- AWS Glue - Data Catalog
- AWS Glue - ETL Jobs
- AWS Glue Data Quality
- AWS Glue Streaming
- AWS Glue Pricing
- AWS Glue Features
- AWS Glue Schema Registry
- AWS Glue Jupyter Notebook Tutorials
関連サービス
最終更新:2026 年 4 月 26 日
ドキュメント版:1.0 - AWS Glue 完全ガイド