AWS公式ドキュメントのチュートリアルでS3Tablesに入門してみた

AWS公式ドキュメントのチュートリアルでS3Tablesに入門してみた

AWS公式ドキュメントのチュートリアルでS3Tablesに入門してみた
Clock Icon2025.03.18

お疲れさまです。とーちです。

先日、Amazon S3 TablesがS3コンソールでテーブル作成とクエリを実行できるようになったというアップデートがありました。これを受けて、AWS公式ドキュメントの「チュートリアル: S3 テーブルの使用開始」にもS3コンソールからの手順が記載されるようになりました。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-getting-started.html

私はAmazon S3 Tablesを触ったことがなかったので、いい機会だと思い、このチュートリアルの内容を実際に試してみました。このチュートリアルはテーブルバケットの作成から、Amazon Lake Formationでの権限付与、Amazon Athenaによるテーブルのクエリまでを含む、なかなか実践的な内容になっています。

Amazon S3 Tablesとは?

Amazon S3 Tablesは、Amazon S3に組み込まれた機能で、Apache Icebergテーブルフォーマットを利用して、S3上に表形式のデータを保存し、SQLで直接クエリできるようにしたものです。

主な特徴

  • 簡単に使える: 一般的なSELECT、INSERT、UPDATE、DELETEなどの標準的なSQL構文で操作できるため、データベースに慣れている人なら学習コストが低く始められます。

  • 高性能: 一般のS3バケットで実現できるクエリと比較して、クエリのスループットが最大3倍速く、1秒あたりのトランザクション数が最大10倍多くなります。

  • 自動メンテナンス: データが増えても自動的に最適化してくれるため、コンパクション、スナップショット管理、未参照ファイルの削除などの運用タスクを自動化できます。

  • AWSの分析サービスとの連携: Amazon Athena、Amazon Redshift、Amazon QuickSight、Amazon Data Firehoseなど他のAWSの分析サービスと簡単に連携できます。

今回のアップデートにより、S3コンソールから直接テーブルの作成やクエリの実行ができるようになり、より使いやすくなりました。アップデートの内容については以下のブログをご参照ください。

https://dev.classmethod.jp/articles/amazon-s3-tables-create-table-s3-console/

それではさっそくチュートリアルに沿って、実施してみます。

ステップ 1: テーブルバケットを作成し、AWS 分析サービスと統合する

まずはマネージメントコンソールからS3の画面(S3コンソール)を開き、テーブルバケットを選択します。

テーブルバケットの選択

テーブルバケットの作成を選択します。

テーブルバケットの作成

テーブルバケット名等を入力する画面になります。

テーブルバケット名の入力

「AWS 分析サービスとの統合」の「統合を有効にする」にチェックをつけるようにします。

テーブルバケット名の注意点

テーブルバケット名については以下のような注意事項があるので注意しましょう。

  • テーブルバケットを作成した後は、その名前を変更することができません
  • 現在のリージョン内の AWS アカウント内で一意の名前である必要があります
    • 通常のS3バケットは全世界で一意である必要がありますが、テーブルバケットはアカウント内かつリージョン内で一意になっていればいいのです。これは意外な点でした
  • 使える文字種は小文字、数字、ハイフン (-)のみです
    • 大文字が使えないので注意しましょう

AWS 分析サービスとの統合

上記の「AWS 分析サービスとの統合」の「統合を有効にする」にチェックをつけることで、 Amazon Athena、Amazon Redshift、Amazon QuickSight、Amazon Data Firehose からテーブルバケットにアクセスできるようになります。

具体的にはここにチェックをつけることによって以下の処理が行われます

1. Amazon Lake Formation テーブルバケットの登録

Amazon Lake Formation というサービスを聞き慣れない方が(自分も含め)多いと思うので簡単に説明すると、AWS Glue の各サービス(データカタログやGlueクローラー)をベースにして、テーブルや列、行レベルといったきめ細やかなデータへのアクセス制御を行えるサービスとなっています。以下の記事がとてもわかり易いのでご一読いただければと思います。

「データレイク」という言葉だけ知ってる人がAWS Lake Formationをはじめてみる #devio2021 | DevelopersIO

AWS分析サービスと統合するにあたって、この Amazon Lake Formation にすべてのテーブルバケットへのアクセスを許可する IAM サービスロールを追加しています。このサービスロールを使って Amazon Lake Formation で権限管理できるようにテーブルバケットを登録しているというわけです。

2. AWS Glue Data Catalog の作成

また AWS Glue Data Catalog に s3tablescatalog カタログも追加します。これはなんのためにやっているかというと、Amazon Athena 等の「AWS Glue Data Catalog をテーブル定義などのスキーマ情報として参照するサービス」がテーブルバケットを扱えるようにするためです。

具体的にはテーブルバケットと AWS Glue Data Catalog は以下のように関連づけられます

テーブルバケットと AWS Glue Data Catalog の関連付け

Using Amazon S3 Tables with AWS analytics services - Amazon Simple Storage Serviceより画像引用

正常に作成されると以下のような状態になります。

テーブルバケット作成完了

ステップ2: テーブルの名前空間とテーブルを作成する

このステップではテーブルバケットに対して名前空間を作成し、その下に新しいテーブルを作っていきます。

名前空間とテーブルとは?

名前空間とテーブルは上記のテーブルバケットと AWS Glue Data Catalog の関連付けを見ると分かりやすいかと思います。テーブルバケットの要素をそれぞれRDBMSの近い概念に当てはめると、

  • 名前空間:データベース
  • テーブル:データベースの中に作成するテーブル

という感じでしょうか。

名前空間の作成

それではマネージメントコンソールから名前空間とテーブルを作っていきます。

先ほど作成されたテーブルバケットを選びます。

テーブルバケットの選択

Athena でテーブル作成を選びます。

Athena でテーブル作成

「名前空間名」を指定して「名前空間を作成」を押します。名前空間名はテーブルバケット内で一意にする必要があります。

名前空間の作成

「Athena でテーブル作成」を押します。

Athena でテーブル作成ボタン

テーブルの作成

するとテーブル作成のためのクエリが入力されている状態で Amazon Athena の画面が開きます。

Athena の画面

サンプルのテーブルは製品種別ごとの日次の売上を記録するためのテーブルのようです。サンプルレコードを insert するための SQL と insert したレコードを確認するための SQL もコメントでついています。

-- Next steps 1) Use the following SQL statement to insert data to your table.
INSERT INTO daily_sales
VALUES
(DATE '2024-01-15', 'Laptop', 900.00),
(DATE '2024-01-15', 'Monitor', 250.00),
(DATE '2024-01-16', 'Laptop', 1350.00),
(DATE '2024-02-01', 'Monitor', 300.00),
(DATE '2024-02-01', 'Keyboard', 60.00),
(DATE '2024-02-02', 'Mouse', 25.00),
(DATE '2024-02-02', 'Laptop', 1050.00),
(DATE '2024-02-03', 'Laptop', 1200.00),
(DATE '2024-02-03', 'Monitor', 375.00);

とりあえず「実行」ボタンを押してみました。ちゃんとテーブルが作成されたようです。

テーブル作成成功

Amazon Athena のコンソール上でもテーブルがあることが確認できます。

Athena でテーブル確認

また S3 の画面に戻るとここでもテーブルの一覧を見ることができました。

S3 コンソールでテーブル確認

データの追加と確認

せっかくなのでサンプルレコードの insert と、insert したレコードの確認もしてみます。Amazon Athena の画面に戻ってまず、insert します。

データのインサート

インサート成功

続いて insert したレコードを確認してみます。

データ確認クエリ

クエリ結果

確認用の SQL では指定した期間(WHERE sale_date BETWEEN DATE '2024-02-01' and DATE '2024-02-29')の商品カテゴリごと(GROUP BY product_category)の売上の合計と平均を出しているようです。

(オプション) ステップ3: テーブルに Amazon Lake Formation 権限を付与する

このステップでは Amazon Lake Formation を使って先ほど作成したテーブルへのアクセス許可を他の IAM ロールに付与していきます。

デフォルトのアクセス制御

デフォルトではテーブルを作成した本人しかテーブルにアクセスできないので、Amazon Lake Formation で他のユーザーもアクセスできるようにします。この本人しかアクセスできないという制御がどこでされているのか気になったのですが、これが Amazon Lake Formation でされているようです。

Amazon Lake Formation の画面を見るとテーブルが作成されたタイミングで以下の2行の許可が追加されていることがわかります。Resource が Table となっているほうがテーブル全体、Column となっているほうがテーブルの列に対する許可を表しています。

Amazon Lake Formation 権限

アクセス制限の確認

本当に本人しかアクセスできないのか気になったので適当な IAM ロールを作って試してみました。

テストロールの作成

さきほどと同じ確認用の SQL を実行するためにテーブルバケットの画面から「Athena でテーブルのクエリを実行」を押します。

Athena でクエリ実行

すると Amazon Athena の画面には遷移しましたが、先ほどは見えていたカタログ s3tablescatalog/my-s3-table-bucket が見えない状態となっており、そのためデータベース(名前空間)やテーブルも見えない状態になっていました。確かにデフォルトだとテーブルを作成した本人しかアクセスできないようです。

カタログが見えない

他のユーザーへの権限付与

それでは、この IAM ロール(testrole)に権限を付与してみます。

Lake Formation の初期設定

私は Amazon Lake Formation の画面に初めて入ったので、以下のような最初の設定を行う画面が出てきました。

Amazon Lake Formation 初期設定

Amazon Lake Formation には必ず1人以上の管理者が必要なので、その管理者を登録するための画面になります。とりあえず、Add myself で Amazon Lake Formation にアクセスしている自分自身を登録します。

権限の付与手順

画面左メニューの中から、「Data permissions」を選択します。

Data permissions

Grant ボタンを押します。

Grant ボタン

まずはどのプリンシパルに権限を付与するのかを選択します。ここで先程の「testrole」を指定します。

プリンシパル選択

つぎにテーブルバケットや名前空間、テーブルなど、どれを対象として権限を付与するかを指定します。一番上の Named Data Catalog resources を選ぶとカタログなどを選ぶボックスが出てきます。

なお、アカウント全体のテーブルバケットを指定したい場合は Catalogs に<アカウントID>:s3tablescatalogのカタログを選びます。今回は、テーブルまで指定して許可を与えてみました。

リソース選択

最後に今回はテーブルまで指定しているので、テーブルに対してどの操作を許可するかを選択する Table permissions の設定をします。閲覧だけできるように Select と Describe を選んでみました。その下をみると Data permissions というところに Column-based access という文字も見えるので、ここで列ベースのアクセス許可の設定もできるようです。

権限設定

Grant ボタンを押すと設定完了です。

権限付与後の動作確認

では、「testrole」にスイッチして動作確認してみます。

Amazon Athena の画面にいくと先程はカタログすら見えませんでしたが、今回はちゃんとテーブルまで見える状態になっています。

テーブルが見える

Select 文を実行してみると正常に実行されました。

Select 成功

続いて insert 文を実行してみます。

Insert 失敗

ちゃんと select だけが許可されているようです。Amazon Lake Formation での権限設定が正しく動作していることが確認できました。

まとめ

AWS公式ドキュメントの「チュートリアル: S3 テーブルの使用開始」に沿って、以下のことを行いました

  1. テーブルバケットの作成とAWS分析サービスとの統合
  2. 名前空間とテーブルの作成
  3. Amazon Lake Formation を使った権限管理

私はデータ分析界隈にはそれほど詳しくないのですが、Amazon S3 Tablesには色々可能性が詰まってるような気がするので、キャッチアップしたくて今回のブログを書きました。今まで、通常のS3で行っていた分析が今後はS3 Tablesで行うように置き換わっていくんじゃないかと感じています。

Amazon S3 Tables は従来の S3 の使い方とは少し異なるため、最初は戸惑うかもしれませんが、皆さんもぜひ試してみてください。

以上、とーちでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.