Amazon S3 Tables のテーブルバケットが AWS CDK L2 コンストラクト(alpha版)でサポートされました

Amazon S3 Tables のテーブルバケットが AWS CDK L2 コンストラクト(alpha版)でサポートされました

Clock Icon2025.04.22

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK リリース v2.189.0 で、Amazon S3 Tables のテーブルバケットが L2 コンストラクトとしてサポートされました。

• support L2 constructs for Amazon S3 Tables (#33599) (2e95252)

Amazon S3 Tables は、AWS が re:Invent 2024 で発表した新しいストレージサービスです。S3 上で Apache Iceberg テーブルを直接管理できる機能を提供し、データレイクの構築と運用を簡素化します。

主な特徴:

  • S3 上で直接テーブルを作成・管理できる
  • Apache Iceberg フォーマットをネイティブにサポート
  • テーブルデータの自動最適化機能を提供
  • 不要なファイルの自動クリーンアップ機能を搭載

このサービスは以下の3つの主要コンポーネントで構成されています:

  • テーブルバケット:テーブルデータを格納するための専用のS3バケット
  • 名前空間:テーブルを論理的にグループ化する単位(データベースやスキーマに相当)
  • テーブル:実際のデータを格納する Apache Iceberg フォーマットのテーブル

これらコンポーネントの階層関係は次のようになります。

テーブルバケット
  └── 名前空間1
      └── テーブルA
          └── データファイル群
      └── テーブルB
          └── データファイル群
  └── 名前空間2
      └── テーブルC
          └── データファイル群
  └── ...

これらのコンポーネントを使用することで、大規模なデータレイクを効率的に管理することができます。

なお、前述の通り今回の CDK L2 コンストラクトのサポートはテーブルバケットのみとなり、またアルファモジュール(@aws-cdk/aws-s3tables-alpha)としての提供となる点にはご注意ください。

試してみた

CDK パッケージのアップデート

AWS CDK モジュールとアルファモジュール(@aws-cdk/aws-s3tables-alpha)を v2.168.0 以上にアップデートします。

npm i -D @aws-cdk/aws-s3tables-alpha@latest aws-cdk-lib@latest aws-cdk@latest

テーブルを作成してみる

実際にテーブルバケットを作成してみます。以下のコードは、基本的なテーブルバケットの作成例です。

import * as cdk from "aws-cdk-lib";
import * as s3tables from "@aws-cdk/aws-s3tables-alpha";
import { Construct } from "constructs";

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    /**
     * バケットテーブル
     */
    new s3tables.TableBucket(this, "MyTableBucket", {
      tableBucketName: "my-table-bucket", // バケット名の指定必須
    });
  }
}

CDK スタックをデプロイすると、CloudFormation でテーブルバケットを作成できました。

マネジメントコンソールで作成されたテーブルバケットを確認した様子です。基本的な情報は表示されますが、詳細な設定情報は閲覧できないようです。

テーブルバケットにはメンテナンス設定があり、不要なファイルの自動削除を制御できます。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/s3-table-buckets-maintenance.html

これらの設定は CLI で確認可能です。既定で不要ファイルの自動削除機能が有効化されており、参照されていないファイルは3日後に、非カレントバージョンのファイルは10日後に自動的に削除される設定になっています。

$ aws s3tables get-table-bucket --table-bucket-arn arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket
{
    "arn": "arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket",
    "name": "my-table-bucket",
    "ownerAccountId": "XXXXXXXXXXXX",
    "createdAt": "2025-04-21T13:37:50.783685+00:00"
}

$ aws s3tables get-table-bucket-maintenance-configuration --table-bucket-arn arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket
{
    "tableBucketARN": "arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket",
    "configuration": {
        "icebergUnreferencedFileRemoval": {
            "status": "enabled",
            "settings": {
                "icebergUnreferencedFileRemoval": {
                    "unreferencedDays": 3,
                    "nonCurrentDays": 10
                }
            }
        }
    }
}

テーブルのメンテナンス設定を変更する

続いて CDK でテーブルバケットのメンテナンス設定を変更してみます。設定可能なパラメータには、unreferencedFileRemoval があり、これにはステータスと保持期間(unreferencedDays と noncurrentDays)を指定できます。以下のコードで設定を変更してみます。

import * as cdk from "aws-cdk-lib";
import * as s3tables from "@aws-cdk/aws-s3tables-alpha";
import { Construct } from "constructs";

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    /**
     * バケットテーブル
     */
    new s3tables.TableBucket(this, "MyTableBucket", {
      tableBucketName: "my-table-bucket", // バケット名の指定は必須
      unreferencedFileRemoval: {
        status: s3tables.UnreferencedFileRemovalStatus.ENABLED, // 既定は有効
        noncurrentDays: 30, // 既定は 10 日
        unreferencedDays: 10, // 既定は 3 日
      },
    });
  }
}

メンテナンス設定の変更が反映されたことを確認してみます。CLI で確認すると、指定した通り unreferencedDays が10日、nonCurrentDays が30日に変更されています。

$ aws s3tables get-table-bucket-maintenance-configuration --table-bucket-arn arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket
{
    "tableBucketARN": "arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket",
    "configuration": {
        "icebergUnreferencedFileRemoval": {
            "status": "enabled",
            "settings": {
                "icebergUnreferencedFileRemoval": {
                    "unreferencedDays": 10,
                    "nonCurrentDays": 30
                }
            }
        }
    }
}

テーブルのメンテナンス設定を無効化する

続いて CDK でテーブルのメンテナンス設定を無効化してみます。先ほどと同様に CDK で設定を変更し、UnreferencedFileRemovalStatus を DISABLED に変更します。

import * as cdk from "aws-cdk-lib";
import * as s3tables from "@aws-cdk/aws-s3tables-alpha";
import { Construct } from "constructs";

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    /**
     * バケットテーブル
     */
    new s3tables.TableBucket(this, "MyTableBucket", {
      tableBucketName: "my-table-bucket", // バケット名の指定は必須
      unreferencedFileRemoval: {
        status: s3tables.UnreferencedFileRemovalStatus.DISABLED, // 既定は有効
      },
    });
  }
}

CLI でメンテナンス設定を確認してみると、設定のステータスが無効(disabled)に変更されています。ただし保持期間の設定値(unreferencedDays と nonCurrentDays)は前回設定した値のまま維持されており、この点には注意した方が良さそうです。

aws s3tables get-table-bucket-maintenance-configuration --table-bucket-arn arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket
{
    "tableBucketARN": "arn:aws:s3tables:ap-northeast-1:XXXXXXXXXXXX:bucket/my-table-bucket",
    "configuration": {
        "icebergUnreferencedFileRemoval": {
            "status": "disabled",
            "settings": {
                "icebergUnreferencedFileRemoval": {
                    "unreferencedDays": 10,
                    "nonCurrentDays": 30
                }
            }
        }
    }
}

既存の紛らわしいコンストラクト

既存の L2 コンストラクトで S3Table という名前のクラスが存在しますが、こちらは S3 バケット用の Glue のテーブルを作成するためのコンストラクトで、S3 Tables とは異なるものです。

https://docs.aws.amazon.com/cdk/api/v2/docs/@aws-cdk_aws-glue-alpha.S3Table.html

declare const myDatabase: glue.Database;
new glue.S3Table(this, "MyTable", {
  database: myDatabase,
  columns: [
    {
      name: "col1",
      type: glue.Schema.STRING,
    },
  ],
  partitionKeys: [
    {
      name: "year",
      type: glue.Schema.SMALL_INT,
    },
    {
      name: "month",
      type: glue.Schema.SMALL_INT,
    },
  ],
  dataFormat: glue.DataFormat.JSON,
  enablePartitionFiltering: true,
});

私は上記のコンストラクトを見た時に、S3 Tables のテーブルバケットを作成するためのコンストラクトかと勘違いしてしまいました。皆さんも混同しないように注意してください。

おわりに

今回は AWS CDK L2 コンストラクトとして提供された Amazon S3 Tables のテーブルバケット機能を試してみました。アルファ版ではありますが、基本的なテーブルバケットの作成と、メンテナンス設定の変更が CDK で簡単に実装できることが確認できました。ただし現状では S3 Tables の利用に必要な全てのリソースの作成を CDK で完結できるわけではないので、今後の正式版リリースと、より多くの機能のサポートに期待したいと思います。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.