🦔

S3 Tables と S3 Metadata(Preview) 触ってみた

2024/12/09に公開

はじめに

@mujyun_furu こと古林 信吾(ふるばやし しんご)です。
今回は、AWS re:Invent 2024 で新規提供された、Amazon S3 の新機能である、S3 Tables と S3 Metadata(Preview) を触ってみた内容です。

S3 Tables と S3 Metadata(Preview) とは

AWS re:Invent 2日目(12/3)の AWS CEO Matt Garman の Keynote で Storage has changed のキーワードがあり、

S3 のおさらいをして、

新機能として、Apache Iceberg専用の Amazon S3 Tables の発表がありました。

さらに、Metadata を管理できる S3 Metatada(Preview) の発表がありました。

各機能の詳細は What's New と New Blogs で解説されていますので、以下をご参照ください。

S3 Tables
https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-s3-tables-apache-iceberg-tables-analytics-workloads/
https://aws.amazon.com/jp/blogs/aws/new-amazon-s3-tables-storage-optimized-for-analytics-workloads/

S3 Metadata(Preview)
https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-s3-metadata-preview/
https://aws.amazon.com/jp/blogs/aws/introducing-queryable-object-metadata-for-amazon-s3-buckets-preview/

触ってみた

どちらの機能もまだ限られたリージョン(米国東部 (バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン) )でしか利用できません。

実際、東京リージョンでも、左のメニューに「テーブルバケット」とありますが、選択すると使用不可とでます。

リージョンをバージニア北部に変更すると、作成できるようになります。

AWS 分析サービスとの統合(Preview)がデフォルト無効ですが、S3 Tables は分析サービスとの統合のためにもあるので、有効にします。

デフォルトで用意される AWS Lake Formation 用の IAM ロールを見ると、確かに s3tables 系のロールが確認できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LakeFormationPermissionsForS3ListTableBucket",
            "Effect": "Allow",
            "Action": [
                "s3tables:ListTableBuckets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "LakeFormationDataAccessPermissionsForS3TableBucket",
            "Effect": "Allow",
            "Action": [
                "s3tables:CreateTableBucket",
                "s3tables:GetTableBucket",
                "s3tables:CreateNamespace",
                "s3tables:GetNamespace",
                "s3tables:ListNamespaces",
                "s3tables:DeleteNamespace",
                "s3tables:DeleteTableBucket",
                "s3tables:CreateTable",
                "s3tables:DeleteTable",
                "s3tables:GetTable",
                "s3tables:ListTables",
                "s3tables:RenameTable",
                "s3tables:UpdateTableMetadataLocation",
                "s3tables:GetTableMetadataLocation",
                "s3tables:GetTableData",
                "s3tables:PutTableData"
            ],
            "Resource": [
                "arn:aws:s3tables:us-east-1:xxxxxxxxxxxx:bucket/*"
            ]
        }
    ]
}

超簡単に統合は有効化されます。

S3 Tables 用のバケットの作成も一瞬です。

作成された S3 Tables 用のバケットの中を見ると右上に「Athena クエリエディタへの移動」リンクがありますね!

また、「テーブルを作成、変更、削除するには、Amazon EMR を使用します。」とあります、、、マジか!
だから公式ブログでは EC2 に Apache Spark 入れて検証してたのねー

だが待って欲しい、いくら何でも Amazon EMR 必須はないだろうとドキュメント見たら、AWS CLI でテーブル作れるやないかーい!
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-create.html

aws s3tables create-table \
    --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket \
    --namespace your_namespace \
    --name example_table --format ICEBERG

ただ、その前に名前空間作れと。
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-namespace-create.html
※AWS CLI のコマンドコピーしたら arn の後ろの \ の後にブランク入っているのでドキュメント修正してもらえませんかね?

aws s3tables create-namespace \
    --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-bucket1 \
    --namespace example_namespace

じゃあ CloudShell から実行するかと実行してみたら、そもそも s3tables なんてオプション知らんよと怒られる、、、
現在のバージョンは?

$ aws --version
aws-cli/2.21.2 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

オプションないならアップデートだ!

$ sudo yum update awscli
Last metadata expiration check: 0:12:32 ago on Fri 06 Dec 2024 08:50:25 PM UTC.
Dependencies resolved.
Nothing to do.
Complete!
$ aws --version
aws-cli/2.21.2 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

あ、AWS CLI は yum では update できないんだ、、、

公式ドキュメント見て、以下を実行するとアップデートできました。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update

アップデート後のバージョンはこちら。

$ aws --version
aws-cli/2.22.12 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

AWS CLI が 2.22.12 であれば、問題なく名前空間とテーブル作成実行できました。

$ aws s3tables create-namespace \
>     --table-bucket-arn arn:aws:s3tables:us-east-1:xxxxxxxxxxxx:bucket/mujyun-s3tables-test \
>     --namespace mujyun_s3tables_namespace
{
    "tableBucketARN": "arn:aws:s3tables:us-east-1:xxxxxxxx:bucket/mujyun-s3tables-test",
    "namespace": [
        "mujyun_s3tables_namespace"
    ]
}
$ aws s3tables create-table \
>     --table-bucket-arn arn:aws:s3tables:us-east-1:xxxxxxxx:bucket/mujyun-s3tables-test \
>     --namespace mujyun_s3tables_namespace \
>     --name mujyun_s3tables_table --format ICEBERG
{
    "tableARN": "arn:aws:s3tables:us-east-1:xxxxxxxx:bucket/mujyun-s3tables-test/table/35267e2f-6de3-4921-9579-d7d071d7a938",
    "versionToken": "9c897d1cd59fca86b49f"
}
$ 

S3 Tables のコンソール上でもテーブルが作成されたことが確認できます。

ここまでできたら、「Athena クエリエディタへの移動」リンクから Athena で触れるはずだよね!

データソースはデフォルトでいいだろうから、カタログに新しく生えた s3tablescatalog を選んでみると、、、エラー!

404?見えてないと言っているということは、そもそも s3tables に対する権限持ってないのでは?

Metadata 作ってないからか?

いったん、デフォルト設定で Metadata 用のバケットを作成します。

作成したバケットの「メタデータ - プレビュー」を選択します。

「メタデータ設定を作成」を選択すると、送信先テーブルバケットが選べる!

先ほど作成したテーブルバケットを選択します。

問題なくメタデータ設定が作成された!

Athena クエリエディタに移動すると、引き続き 404 エラー、、、

うーん、まだ Athena には対応していないのかも、、、

とはいえ、今回、AWS Lale Formation も関係するはずなので、そっちを見てみます。

なんか聞いてくるので、Get Started してみます。

Catalogs を見ると、「AWS 分析サービスとの統合」を有効にして作成された s3tablescatalog を確認できます。

中身も見れます。

Lake Formation で Access 権の Grant とかもできるけど、エラー解消せず、、、
うーん、謎だ!

まとめ

ということで、S3 Tables と S3 Metadata(Preview) 触ってみました。
Athena で色々できるところまで持っていきたかったけど、今回は作成するところまでとなってしまいました。
とはいえ、今後 S3 を活用した DataLake をより良くできる新機能だと思いますので、情報ウォッチを続けます。

最後までお読みいただきありがとうございました。

Discussion