目次

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 を統合したデータ統合プラットフォーム。


目次

  1. 概要
  2. Glue が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. コアコンポーネント
  6. Glue Data Catalog
  7. Crawler(自動スキーマ検出)
  8. Glue ETL Jobs
  9. Glue Streaming
  10. 主要ユースケース
  11. Glue Studio(ビジュアル)
  12. [Glue DataBrew(ノーコード)](#glue-databrew ノーコード)
  13. Glue Data Quality
  14. Glue Schema Registry
  15. Iceberg / Hudi / Delta Lake サポート
  16. Worker Type & Auto Scaling
  17. Job Bookmark(増分処理)
  18. Workflow とイベント駆動
  19. セキュリティ
  20. モニタリング
  21. コスト
  22. 関連 AWS サービス連携
  23. 類似ツールとの比較
  24. クライアントとエコシステム
  25. ベストプラクティス
  26. トラブルシューティング
  27. 2025-2026 最新動向
  28. 学習リソース
  29. 実装例・活用シーン
  30. 導入ロードマップ
  31. 実装チェックリスト
  32. まとめ
  33. 参考文献

概要

初心者向けメモ: 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 実行フロー:

  1. データソースをスキャン
  2. ファイル形式・パーティション・カラムを自動推測
  3. Data Catalog にテーブル・パーティション登録
  4. スキーマ変更を検知 → 自動更新 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 で再利用

アンチパターン

避けるべき:

  1. Crawler を本番前に毎回実行 ⟹ ✅ スキーマ確定後は 1 日 1 回
  2. 小規模データに Spark ETL ⟹ ✅ Python Shell / Lambda 推奨
  3. Job Bookmark 未設定で全スキャン ⟹ ✅ 増分処理で DPU 削減
  4. Data Catalog なしで各サービスで個別定義 ⟹ ✅ SSOT に統一
  5. PII データを暗号化なしで S3 保存 ⟹ ✅ KMS/Lake Formation

トラブルシューティング

よくあるエラー

エラー 原因 解決策
OutOfMemory ワーカーメモリ不足 G.1X → G.2X にアップグレード
Timeout ジョブ実行時間超過 Timeout パラメータ増加 / パーティション調整
AccessDenied IAM 権限不足 glue:* / s3:* 権限確認
SchemaValidationException スキーマ型不一致 型キャスト処理追加
Job Bookmark Failed チェックポイント破損 --job-bookmark-optionjob-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 関連ドキュメント

  1. AWS Glue 5.1 - Spark 3.5 サポート
  2. AWS Glue Release Notes
  3. AWS Glue Version Support Policy

オープンテーブルフォーマット

  1. Apache Iceberg
  2. Apache Hudi
  3. Linux Foundation Delta Lake
  4. AWS Glue Iceberg Integration

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 公式ドキュメント

  1. AWS Glue - What is Glue?
  2. AWS Glue Developer Guide
  3. AWS Glue - Data Catalog
  4. AWS Glue - ETL Jobs
  5. AWS Glue Data Quality
  6. AWS Glue Streaming
  7. AWS Glue Pricing
  8. AWS Glue Features
  9. AWS Glue Schema Registry
  10. AWS Glue Jupyter Notebook Tutorials

関連サービス


最終更新:2026 年 4 月 26 日
ドキュメント版:1.0 - AWS Glue 完全ガイド