1. はじめに

この記事ではS3データレイクで自動テーブル作成とパーティション管理について記述していきます。

1.1 問題提起

データレイク(S3)にデータが蓄積されていく中で、分析に必要な「テーブル定義」やパーティションを手動で作成・更新することは非常に手間で非効率です。 また、手動で実施することによるミスも生じやすくなります。AWS Crawlerを利用することで、自動的にテーブル定義の作成やパーティションの追加を行うことが可能になります。

1.2. 具体例

  1. 新しいデータセットが追加されるたびに、AthenaでCREATE EXTERNAL TABLEを手打ちしている。
  2. データが毎日増えるたびに、MSCK REPAIR TABLEやALTER TABLE ADD PARTITIONを実行し忘れてクエリに漏れが生じる。

3. AWS Glue Crawler とは

AWS Glue Crawlerは、AWS GlueというAWSのフルマネージド型ETL(抽出・変換・ロード)サービスを構成する機能の一部です。

3.1. AWS Glue Crawlerの役割

  • データソースの走査(クロール)
    • S3のファイルや各種データベースなどのターゲットデータストアに接続し、データを読み取ります。
  • スキーマの推論・解析
    • データの形式(CSV、JSON、Parquetなど)やカラム名、データ型などのスキーマ情報を自動で識別・推論します。
  • データカタログへの登録
    • 推論したスキーマ情報に基づき、Glue Data Catalogにデータベースとテーブル定義を作成または更新します。
  • スキーマ変更の自動検出
    • 定期的にクローラーを実行することで、データストアに新しいファイルが追加されたり、既存のデータのスキーマが変更されたりした場合も自動的に検出し、Data Catalogを更新できます。

3.2 メリット

Glue クローラーを利用することで、分析対象のデータのスキーマを手動で定義する手間が削減されます。これにより、Amazon AthenaやAmazon Redshift Spectrumなどの他の分析サービスから、Data Catalogに登録されたメタデータを使って、すぐにデータにクエリを実行できるようになります。

4. 構築

AWS Glue CrawlerでS3のスキーマとパーティションを作成するための前準備です。

4.1. CloudFormationテンプレート(例)

以下、S3, Glue Crawler、Glue DataBaseのCloudFormationテンプレートです。 参考にしてみてください。

AWSTemplateFormatVersion: '2010-09-09'
Description: AWS Glue Crawler, IAM Role, and S3 Bucket for Athena Partition Management

Parameters:
  BucketName:
    Type: String
    Default: athena-partition-data

Resources:
  AthenaDataBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${BucketName}-${AWS::AccountId}-${AWS::Region}"
      AccessControl: Private

  GlueCrawlerServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: glue.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
      Policies:
        - PolicyName: S3AccessPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                  - s3:ListBucket
                Resource:
                  - !GetAtt AthenaDataBucket.Arn
                  - !Sub "${AthenaDataBucket.Arn}/*"

  GlueDatabase:
    Type: AWS::Glue::Database
    Properties:
      CatalogId: !Ref 'AWS::AccountId'
      DatabaseInput:
        Name: "glue-database-name"
        Description: Database for Athena queries              

  AthenaPartitionCrawler:
    Type: AWS::Glue::Crawler
    DependsOn: GlueDatabase
    Properties:
      Name: athena-partition-update-crawler
      Role: !GetAtt GlueCrawlerServiceRole.Arn
      DatabaseName: !Ref GlueDatabase
      Targets:
        S3Targets:
          - Path: !Sub "s3://${AthenaDataBucket}/room_temperature_data/"
      SchemaChangePolicy:
        UpdateBehavior: LOG
        DeleteBehavior: LOG

Outputs:
  DataBucketName:
    Description: "Data Bucket Name for CSV files"
    Value: !Ref AthenaDataBucket

4.2. S3のフォルダ構造

AWS Glue Crawlerがクロールする対象は、4.1 のTargets→S3Targets→Pathが room_temperature_data/ で指定します。 room_temperature_data/ 配下のフォルダ構造をAWS Glue Crawlerが自動的に解析してパーティションの追加やスキーマの作成を行ってくれます。

例えば、year/month/dayのパーティションを追加したい場合、以下のようにフォルダ名を作成します。 year=2025 , month=11, day=30 のようにキーバリュの方式フォルダ名を命名する必要があり、キーバリュー方式で書かない場合、AWS Glue Crawlerに認識されないので注意が必要です。

例)
{S3バケット名}/room_temperature_data/year=2025/month=10/day=31/

4.3. S3に配置するCSVファイルを作成

CSVのイメージです。このデータは、時間ごとの室温のデータです。 ※ ファイル名は任意です。

こちらファイルサンプルです。

timestamp,sensor_id,temperature_c
2025-11-30 10:00:00,sensor_C,23.5
2025-11-30 10:05:00,sensor_D,24.8
2025-11-30 10:10:00,sensor_E,25.6

このCSVファイルを{S3バケット名}/room_temperature_data/year=2025/month=10/day=31/ に配置する。

5. AWS Glue Crawlerの実行

4. 構築 でして前準備が完了したので、AWS Glue Crawlerを実行して、スキーマの作成とパーティションの追加を行います。

  1. AWSのマネジメントコンソールの検索欄で`Glue`と検索する。
  2. 左ペイン>Data Catolog>Crawlersをクリックする。
  3. Crawlersの一覧にあるathena-partition-update-crawlerチェックボックスにチェックを入れた上で、run ボタン をクリックする。
  4. athena-partition-update-crawlerのステートがReadyになったことを確認する。

これで、パーティションの追加とパーティションの追加が完了です。 ※ 今回はAWS Glue Crawler を手動で実行しましたが、定時実行でクローラーの実行も可能ですが、説明を割愛させていただきます。

6. 確認

6.1. スキーマの確認

  1. AWSのマネジメントコンソールの検索欄で`Glue`と検索する。
  2. 左ペイン>Data Catolog>DataBasesをクリックする。
  3. Tables一覧にroom_temperature_dataが作成されていることを確認する。

room_temperature_data が作成されていれば、AWS Glue Crawler の実行成功している。

6.2. パーティションの確認

  1. AWSのマネジメントコンソールの検索欄で`Glue`と検索する。
  2. 左ペイン>Data Catolog>DataBasesをクリックする。
  3. Tables一覧にroom_temperature_dataをクリックする。
  4. Schema欄にyear, month, dayのパーティションが作成されていれば、完了です。

■以下はスキーマをJson形式で出力したもの

[
  {
    "Name": "timestamp",
    "Type": "string"
  },
  {
    "Name": "sensor_id",
    "Type": "string"
  },
  {
    "Name": "temperature_c",
    "Type": "double"
  },
  {
    "Name": "year",
    "Type": "string",
    "PartitionKey": "Partition (0)"
  },
  {
    "Name": "month",
    "Type": "string",
    "PartitionKey": "Partition (1)"
  },
  {
    "Name": "day",
    "Type": "string",
    "PartitionKey": "Partition (2)"
  }
]

まとめ

AWS Glue Crawlerを利用すれば、S3のデータセットを読み取りスキーマの作成やパーティションの追加を行うことが可能です。 データ管理業務を行う上ではこういった自動処理を利用することで運用コストを下げることができるので積極的に利用できればと思います。

参考ページ

クローラーを使用したデータカタログへの入力