AWS Glue

作成: 2026.03.22更新: 2026.03.22

1. 概要

AWS Glue は、データの抽出・変換・ロード(ETL)を行うためのフルマネージドなサーバーレスデータ統合サービス

データ分析の世界では、データはさまざまなソース(データベース、ログ、SaaS アプリケーション等)に散在しており、そのままでは分析に使えない。Glue はこの「データを集めて、整えて、分析基盤に投入する」というパイプライン全体を構築・運用するためのサービスである。

Glue の核となる機能は大きく 2 つある。

  • Data Catalog(データカタログ) — データソースのスキーマやロケーションなどのメタデータを一元管理するリポジトリ。Athena、Redshift Spectrum、EMR など他の AWS サービスからも参照できるため、AWS のデータ分析基盤における「メタデータのハブ」として機能する
  • ETL エンジン — Apache Spark ベースのサーバーレスな分散処理エンジン。サーバーのプロビジョニングやクラスタ管理なしに、大量データの変換処理を実行できる

責任共有モデルにおける位置づけ

Glue はサーバーレスサービスに分類される。インフラの管理(サーバーのプロビジョニング、パッチ適用、スケーリング)はすべて AWS が担当する。ユーザーが責任を持つのは、ETL スクリプトのロジック、Data Catalog のアクセス制御(IAM ポリシー、リソースポリシー)、データそのもののセキュリティ(暗号化設定)である。

2. ユースケース

  • データレイクを構築したいとき — S3 にさまざまなソースのデータを集約し、Data Catalog でスキーマを管理する。Crawler で自動的にスキーマを検出できるため、新しいデータソースを追加するたびに手動でスキーマ定義をする手間が省ける
  • データウェアハウスへのロード前にデータを変換・クレンジングしたいとき — 不要なカラムの削除、データ型の変換、NULL 値の補完、重複レコードの排除などの前処理を、Spark ベースのジョブでスケーラブルに実行できる
  • 複数のデータソースを結合・統合したいとき — RDS、DynamoDB、S3、JDBC 接続可能な外部 DB など異なるソースからデータを取得し、1 つのデータセットに統合する
  • 定期的なバッチ ETL パイプラインを構築したいとき — ワークフロー機能やスケジューラ(EventBridge / cron 式)を使って、毎日・毎時の定期実行パイプラインを構築できる
  • Athena や Redshift Spectrum で S3 のデータにクエリしたいとき — Data Catalog にテーブル定義を登録することで、SQL による分析が可能になる。Glue を直接使わなくても、Data Catalog の恩恵を受けるケースは多い

3. 基本概念

用語説明
Data Catalogデータソースのメタデータ(スキーマ、ロケーション、パーティション情報)を一元管理するリポジトリ。リージョン単位で存在し、AWS アカウント内の共有リソースとして機能する
Database(カタログ DB)Data Catalog 内でテーブルをグループ化する論理コンテナ。RDS のデータベースとは異なり、メタデータの管理単位にすぎない
Table(カタログテーブル)データのスキーマ(カラム名、型)、ロケーション(S3 パスなど)、入出力フォーマットを定義したメタデータ。実データは持たない
Crawlerデータソースを自動的にスキャンし、スキーマを推定して Data Catalog にテーブル定義を登録・更新するコンポーネント
ConnectionJDBC、MongoDB、Kafka など外部データソースへの接続情報(ホスト、ポート、認証情報)をまとめたもの
JobETL 処理の実行単位。Spark(Python / Scala)または Python Shell で記述する。ジョブ実行時に DPU(Data Processing Unit)を割り当てて処理する
DPU(Data Processing Unit)Glue ジョブの処理能力の単位。1 DPU = 4 vCPU + 16 GB メモリ。割り当て DPU 数を増やすと並列度が上がり処理速度が向上するが、コストも比例して増加する
Triggerジョブの起動条件を定義するコンポーネント。スケジュール(cron 式)、イベント、オンデマンドの 3 種類がある
Workflow複数のジョブと Crawler を依存関係付きでまとめ、一連の ETL パイプラインとして管理・実行する仕組み
Bookmark(ジョブブックマーク)前回のジョブ実行で処理済みのデータを記録し、次回実行時に差分データのみを処理するための仕組み。大量データの増分処理に不可欠

4. アーキテクチャ概要

代表構成(データレイク ETL パイプライン)

以下は、複数のデータソースから S3 データレイクにデータを集約し、分析基盤から参照する典型的な構成。Glue Crawler がソースのスキーマを検出し、Glue Job がデータを変換して分析用のフォーマット(Parquet 等)で S3 に書き出す。Athena や Redshift Spectrum は Data Catalog のテーブル定義を通じてデータにクエリする。

[データソース群]
  ├── RDS (MySQL / PostgreSQL)
  ├── DynamoDB
  └── S3 (CSV / JSON ログ)
         ↓
[Glue Crawler] ── スキーマ検出 ──→ [Glue Data Catalog]
         ↓                                ↑ 参照
[Glue ETL Job] ── 変換・クレンジング      │
         ↓                                │
[S3 データレイク (Parquet)]               │
         ↓                                │
[Athena / Redshift Spectrum] ─────────────┘
         ↓
[QuickSight (BI ダッシュボード)]

構成図生成プロンプト: 上記構成をアーキテクチャ図として作成する場合、以下のプロンプトを画像生成 AI や draw.io 等で使用できる。 「AWS アーキテクチャ図。左側にデータソース群(RDS、DynamoDB、S3 の CSV/JSON)を配置。中央に Glue Crawler と Glue ETL Job を配置し、上部に Glue Data Catalog を配置。Crawler からカタログへの矢印と、ETL Job から S3 データレイク(Parquet フォーマット)への矢印を描く。右側に Athena と Redshift Spectrum を配置し、Data Catalog を参照する矢印を描く。最右に QuickSight のダッシュボードアイコンを配置。全体を VPC の枠で囲まず、サーバーレスであることを示す。」

設計ポイント

  • Data Catalog は「一度作ったら他のサービスから使い回す」ことを前提に設計する — Athena、Redshift Spectrum、EMR のいずれも同じ Data Catalog を参照できる。テーブル定義の命名規則やパーティション設計を最初に統一しておくことが重要
  • S3 のパーティション設計が分析パフォーマンスに直結するs3://bucket/year=2026/month=03/day=22/ のように日時でパーティション分割すると、クエリ時に必要なデータだけをスキャンでき、コストと速度の両方で大きな差が出る
  • データフォーマットは Parquet を基本とする — 列指向フォーマットのため、特定カラムのみを読み込むクエリで大幅に I/O を削減できる。CSV と比較して 10〜100 倍のクエリ性能差が出ることもある

5. 主要機能

ETL ジョブ

Glue の中核機能。データの変換処理を実行するサーバーレスジョブ。

ジョブタイプランタイム用途
SparkPython (PySpark) / Scala大量データの分散処理。数 GB 〜 TB 規模のデータ変換
Python ShellPython軽量な処理。数 MB 〜 数 GB 程度のデータ処理や API 呼び出し
RayPython機械学習の前処理やカスタムの分散処理

Spark ジョブでは、Glue 独自の DynamicFrame API が利用できる。Spark の DataFrame と互換性がありつつ、スキーマの不整合(同じカラムに異なる型が混在する場合)に柔軟に対応できる点が特徴。

Glue Studio

ビジュアル ETL エディタ。ドラッグ&ドロップで ETL パイプラインを構築できるため、コードを書かずにデータ変換のフローを作成できる。裏では自動的に PySpark コードが生成される。

プロトタイプの作成や単純な変換処理には有用だが、複雑なロジックやパフォーマンスチューニングが必要な場合はコードベースのジョブの方が制御しやすい。

Crawler

データソースを自動スキャンし、スキーマ(カラム名、データ型)を推定して Data Catalog にテーブル定義を登録する。対応ソースは S3、JDBC(RDS、Redshift 等)、DynamoDB、MongoDB など。

Crawler はスキーマの変更も検知できる。カラムの追加や型の変更があった場合、設定に応じてテーブル定義を自動更新する。

Data Catalog

AWS 全体のメタデータリポジトリ。以下の特徴がある。

  • Apache Hive Metastore 互換のインターフェースを持つため、既存の Hive エコシステムのツールからも参照可能
  • テーブル定義にパーティションキーを設定すると、クエリエンジン(Athena 等)がパーティションプルーニング(不要なパーティションの読み飛ばし)を自動で行う
  • リソースポリシーと IAM ポリシーの組み合わせで、テーブル単位のアクセス制御が可能

Data Quality

テーブルデータの品質チェック機能。DQDL(Data Quality Definition Language)というルール記述言語で「カラム X の NULL 率が 5% 以下」「カラム Y の値が特定の範囲内」といった品質ルールを定義し、ジョブの一部として自動的に検証できる。

Glue Schema Registry

Apache Avro や JSON Schema のスキーマをバージョン管理するサービス。Kafka や Kinesis Data Streams と連携し、プロデューサーとコンシューマー間でスキーマの互換性を保証する。

6. 料金体系

Glue はサーバーレスのため、基本的に「使った分だけ」の課金だが、課金単位がコンポーネントごとに異なる。

主な課金要素

課金項目課金単位備考
ETL ジョブ(Spark)DPU 時間(1 DPU = 4 vCPU + 16 GB メモリ)最低課金は 1 分。10 秒単位の課金
ETL ジョブ(Python Shell)DPU 時間(0.0625 DPU or 1 DPU)Spark より大幅に安価
CrawlerDPU 時間スキャンするデータ量に比例
Data Catalog ストレージテーブル・パーティション数最初の 100 万オブジェクトまで無料
Data Catalog リクエストリクエスト数最初の 100 万リクエストまで無料

見落としがちなコスト

  • ジョブの DPU 数の過剰割り当て — デフォルトで Spark ジョブには 10 DPU が割り当てられる。小〜中規模のデータ処理では 2〜5 DPU で十分な場合が多く、デフォルトのまま実行するとコストが不必要に膨らむ
  • Crawler の高頻度実行 — Crawler も DPU 時間で課金されるため、毎時間実行するとそれだけでコストが発生する。データソースの更新頻度に合わせて適切なスケジュールを設定する
  • 開発エンドポイント(レガシー) — 旧来の開発エンドポイントは起動中ずっと DPU 課金が発生する。現在は Glue Studio のノートブックや Glue Interactive Sessions を使う方がコスト効率が良い
  • S3 のストレージとリクエスト料金 — ETL ジョブの入出力で発生する S3 への読み書きコストは Glue の料金には含まれない。大量データを処理する場合は S3 側のコストも考慮が必要

7. 比較・選定指針

「データ変換や統合を行いたい」場合に Glue を選ぶべきかどうか、類似サービスと比較する。

サービス向いているケース向いていないケース
AWS GlueS3/RDS 間の ETL、Data Catalog が必要、サーバーレスで運用したいリアルタイム処理、低レイテンシ要件
Amazon EMR大規模な Spark / Hive / Presto クラスタが必要、細かいチューニングが必要小規模な定期 ETL、運用負荷を最小化したい
AWS Lambda軽量・単純なデータ変換(数 MB 程度)、イベント駆動大量データの分散処理(メモリ 10 GB、実行 15 分の制限)
Step Functions + Lambda複数の軽量ステップを組み合わせたオーケストレーション重い変換処理、Spark が必要な規模
Amazon Redshift (COPY + SQL)DWH 内で完結するデータ変換多様なソースからの ETL、Data Catalog が必要

Glue を選ぶ判断基準

以下のいずれかに該当する場合は Glue が適している。

  • S3 データレイクを中心としたアーキテクチャで、Data Catalog によるメタデータ管理が必要
  • サーバレスで ETL パイプラインを運用したい(クラスタ管理を避けたい)
  • Athena や Redshift Spectrum と連携して分析基盤を構築する
  • データ量が数 GB 〜 TB 規模で、Spark の分散処理が必要

Glue vs EMR の判断

Glue と EMR は共に Spark を実行できるが、設計思想が異なる。

  • Glue: サーバーレスですぐに使い始められる。ジョブ単位で DPU を割り当てるため、断続的な ETL 処理に適している。ただし、Spark のバージョンやライブラリの自由度は EMR に劣る
  • EMR: クラスタを自分で構成する。Spark のバージョン選択、カスタムライブラリのインストール、細かいクラスタ設定が可能。常時稼働のデータ処理基盤や、高度なチューニングが必要な場合に適している

8. 運用・監視

主要メトリクス(CloudWatch)

メトリクス監視の目的
glue.driver.aggregate.bytesReadジョブが読み込んだデータ量。想定外に大きい場合はフィルタ漏れの可能性
glue.driver.aggregate.recordsRead処理レコード数。前回実行との比較で異常を検知
glue.driver.aggregate.elapsedTimeジョブの実行時間。SLA 超過の検知やパフォーマンス劣化の早期発見
glue.ALL.jvm.heap.usageJVM ヒープ使用率。80% を超えると OOM のリスクが高まる
glue.driver.aggregate.numFailedTasks失敗したタスク数。データの不整合やリソース不足の兆候

ログ

ログ出力先用途
ジョブの標準出力CloudWatch Logs (/aws-glue/jobs/output)print 文やログ出力の確認
ジョブのエラーログCloudWatch Logs (/aws-glue/jobs/error)例外やスタックトレースの調査
Spark UI ログS3Spark のジョブ実行詳細。ステージごとの処理時間やシャッフル量を可視化
Crawler ログCloudWatch Logs (/aws-glue/crawlers)スキーマ検出の結果や変更内容の確認

Spark UI の活用: ジョブ設定で --enable-spark-ui true--spark-event-logs-path s3://... を指定すると、Spark UI のログが S3 に保存される。Glue コンソールから Spark UI を起動して、ステージごとの実行計画やデータスキュー(偏り)を可視化できる。パフォーマンス調査の際に非常に有用。

運用ツール

  • CloudWatch Alarms — ジョブの実行時間やエラー率にアラームを設定し、異常時に SNS 通知を送信する
  • EventBridge — ジョブの状態変化(SUCCEEDED / FAILED / TIMEOUT)をイベントとして検知し、後続処理のトリガーや通知に活用する
  • AWS Glue DataBrew — データの探索・プロファイリング・クレンジングに特化したビジュアルツール。ジョブ開発前のデータ理解に役立つ

9. トラブルシューティング

問題:ジョブが OutOfMemoryError で失敗する

原因:

  • 処理データ量に対して DPU の割り当てが不足している
  • データスキュー(特定のパーティションにデータが偏っている)が発生し、一部のワーカーにメモリ負荷が集中している
  • ブロードキャスト結合で大きなテーブルをメモリに載せようとしている

確認手順:

  1. CloudWatch Logs のエラーログで OOM が発生しているステージを特定する
  2. Spark UI でステージごとのシャッフルサイズとタスクの処理時間分布を確認する
  3. データスキューがある場合は、repartition でデータを均等に分散させる
  4. DPU 数を増やして再実行する(2 DPU → 5 DPU → 10 DPU と段階的に増やす)
  5. 根本的にデータ量が大きい場合は、入力データをパーティション単位で分割して処理する(日別処理など)

問題:Crawler がスキーマを正しく認識しない

原因:

  • CSV ファイルにヘッダ行がない、またはヘッダの区切り文字がデータと異なる
  • 同じ S3 パス配下に異なるフォーマットのファイルが混在している
  • ファイルの文字エンコーディングが UTF-8 でない

確認手順:

  1. Crawler のログ(CloudWatch Logs)でスキーマ推定結果を確認する
  2. S3 パスに意図しないファイル(中間ファイル、一時ファイル等)が含まれていないか確認する
  3. Crawler の設定で除外パターン(_temporary/** 等)を追加する
  4. スキーマの自動推定がうまくいかない場合は、Crawler に頼らず手動でテーブル定義を作成する

問題:ジョブの実行が遅い

原因:

  • DPU 数が不足しており並列度が低い
  • 入力データが CSV 形式で列指向でないため、不要なカラムも全て読み込んでいる
  • Shuffle が大量に発生している(JOIN や GROUP BY で大量のデータ移動が起きている)
  • 小さなファイルが大量にある(Small Files Problem)

確認手順:

  1. Spark UI でボトルネックのステージを特定する
  2. 入力データのフォーマットを確認する。CSV であれば Parquet に変換することで大幅に高速化できる
  3. S3 上のファイル数とサイズを確認する。1 ファイルあたり 100 MB〜1 GB が目安。小さなファイルが大量にある場合は事前に結合する(coalesce / repartition)
  4. ジョブブックマークが有効な場合、増分処理で入力データ量を削減できているか確認する
  5. DPU 数を増やして効果を測定する

問題:ジョブブックマークが機能しない(同じデータを重複処理する)

原因:

  • ジョブブックマークが有効化されていない
  • データソースが S3 で、ファイルのタイムスタンプが変更されている(ファイルの上書き更新)
  • 入力パスの指定方法がブックマーク非対応のパターンになっている

確認手順:

  1. ジョブの設定でブックマークが Enable になっているか確認する
  2. S3 ソースの場合、ファイルが追記方式(新規ファイル追加)になっているか確認する。上書き更新はブックマークで追跡できない
  3. from_catalog または from_options メソッドで transformation_ctx パラメータが正しく指定されているか確認する(ブックマークの識別子として使われる)

10. 実装例

AWS CLI

# Crawler の作成
aws glue create-crawler \
  --name my-s3-crawler \
  --role GlueServiceRole \
  --database-name my_database \
  --targets '{"S3Targets": [{"Path": "s3://my-bucket/raw-data/"}]}'

# Crawler の実行
aws glue start-crawler --name my-s3-crawler

# Data Catalog のテーブル一覧を取得
aws glue get-tables --database-name my_database

# ジョブの実行
aws glue start-job-run \
  --job-name my-etl-job \
  --arguments '{"--input_path":"s3://my-bucket/raw-data/","--output_path":"s3://my-bucket/processed/"}'

# ジョブの実行状態を確認
aws glue get-job-run \
  --job-name my-etl-job \
  --run-id jr_xxxxxxxxxxxxx

Terraform

# Data Catalog データベース
resource "aws_glue_catalog_database" "analytics" {
  name = "analytics_db"
}

# Crawler
resource "aws_glue_crawler" "raw_data" {
  name          = "raw-data-crawler"
  database_name = aws_glue_catalog_database.analytics.name
  role          = aws_iam_role.glue.arn
  schedule      = "cron(0 1 * * ? *)" # 毎日 1:00 UTC

  s3_target {
    path = "s3://${aws_s3_bucket.data_lake.bucket}/raw/"
  }

  schema_change_policy {
    update_behavior = "UPDATE_IN_DATABASE"
    delete_behavior = "LOG"
  }
}

# ETL ジョブ
resource "aws_glue_job" "etl" {
  name     = "raw-to-parquet"
  role_arn = aws_iam_role.glue.arn

  command {
    name            = "glueetl"
    script_location = "s3://${aws_s3_bucket.scripts.bucket}/etl/transform.py"
    python_version  = "3"
  }

  default_arguments = {
    "--job-bookmark-option"   = "job-bookmark-enable"
    "--enable-spark-ui"       = "true"
    "--spark-event-logs-path" = "s3://${aws_s3_bucket.logs.bucket}/spark-ui/"
    "--TempDir"               = "s3://${aws_s3_bucket.temp.bucket}/glue-temp/"
  }

  number_of_workers = 5
  worker_type       = "G.1X"
  glue_version      = "4.0"

  tags = {
    Environment = "production"
  }
}

# ワークフロー(Crawler → Job のパイプライン)
resource "aws_glue_workflow" "daily_etl" {
  name = "daily-etl-pipeline"
}

resource "aws_glue_trigger" "start_crawler" {
  name          = "start-crawler"
  type          = "SCHEDULED"
  schedule      = "cron(0 1 * * ? *)"
  workflow_name = aws_glue_workflow.daily_etl.name

  actions {
    crawler_name = aws_glue_crawler.raw_data.name
  }
}

resource "aws_glue_trigger" "start_job" {
  name          = "start-job-after-crawler"
  type          = "CONDITIONAL"
  workflow_name = aws_glue_workflow.daily_etl.name

  predicate {
    conditions {
      crawler_name = aws_glue_crawler.raw_data.name
      crawl_state  = "SUCCEEDED"
    }
  }

  actions {
    job_name = aws_glue_job.etl.name
  }
}

11. アンチパターン

アンチパターンなぜダメか推奨
CSV のまま分析基盤に投入全カラムを読み込むため I/O が膨大になる。Athena のクエリコスト(スキャン量課金)も増大するETL で Parquet に変換してから分析基盤に投入する
パーティションを設計しないS3 上の全データをスキャンするため、クエリのコストと時間が線形に増加し続ける日時やカテゴリなど、頻繁にフィルタするキーでパーティション分割する
Crawler をスキーマ管理のすべてに頼るデータに不整合がある場合にスキーマが頻繁に変わり、ダウンストリームのクエリが壊れる本番環境ではテーブル定義を IaC で管理し、Crawler は初期調査や検証用に留める
DPU をデフォルト(10)のまま使う小規模データでも高コストになる。1 ジョブの実行コストが想定を大幅に超えるデータ量に合わせて 2〜5 DPU から始め、パフォーマンスを見ながら調整する
1 つのジョブに全ての変換を詰め込む失敗時の切り分けが困難になる。一部の処理だけやり直したくても全体を再実行する必要がある論理的なステップごとにジョブを分割し、Workflow で連結する
ジョブブックマークを使わない毎回全データを再処理するため、実行時間とコストが不必要に増大する増分処理が可能なデータソースではブックマークを有効化する

12. 参考リンク

このカテゴリの記事