AWS公式ドキュメントのチュートリアルでS3Tablesに入門してみた
お疲れさまです。とーちです。
先日、Amazon S3 TablesがS3コンソールでテーブル作成とクエリを実行できるようになったというアップデートがありました。これを受けて、AWS公式ドキュメントの「チュートリアル: S3 テーブルの使用開始」にもS3コンソールからの手順が記載されるようになりました。
私は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コンソールから直接テーブルの作成やクエリの実行ができるようになり、より使いやすくなりました。アップデートの内容については以下のブログをご参照ください。
それではさっそくチュートリアルに沿って、実施してみます。
ステップ 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 は以下のように関連づけられます
※Using Amazon S3 Tables with AWS analytics services - Amazon Simple Storage Serviceより画像引用
正常に作成されると以下のような状態になります。
ステップ2: テーブルの名前空間とテーブルを作成する
このステップではテーブルバケットに対して名前空間を作成し、その下に新しいテーブルを作っていきます。
名前空間とテーブルとは?
名前空間とテーブルは上記のテーブルバケットと AWS Glue Data Catalog の関連付けを見ると分かりやすいかと思います。テーブルバケットの要素をそれぞれRDBMSの近い概念に当てはめると、
- 名前空間:データベース
- テーブル:データベースの中に作成するテーブル
という感じでしょうか。
名前空間の作成
それではマネージメントコンソールから名前空間とテーブルを作っていきます。
先ほど作成されたテーブルバケットを選びます。
Athena でテーブル作成を選びます。
「名前空間名」を指定して「名前空間を作成」を押します。名前空間名はテーブルバケット内で一意にする必要があります。
「Athena でテーブル作成」を押します。
テーブルの作成
するとテーブル作成のためのクエリが入力されている状態で Amazon 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 のコンソール上でもテーブルがあることが確認できます。
また 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 となっているほうがテーブルの列に対する許可を表しています。
アクセス制限の確認
本当に本人しかアクセスできないのか気になったので適当な IAM ロールを作って試してみました。
さきほどと同じ確認用の SQL を実行するためにテーブルバケットの画面から「Athena でテーブルのクエリを実行」を押します。
すると Amazon Athena の画面には遷移しましたが、先ほどは見えていたカタログ s3tablescatalog/my-s3-table-bucket
が見えない状態となっており、そのためデータベース(名前空間)やテーブルも見えない状態になっていました。確かにデフォルトだとテーブルを作成した本人しかアクセスできないようです。
他のユーザーへの権限付与
それでは、この IAM ロール(testrole)に権限を付与してみます。
Lake Formation の初期設定
私は Amazon Lake Formation の画面に初めて入ったので、以下のような最初の設定を行う画面が出てきました。
Amazon Lake Formation には必ず1人以上の管理者が必要なので、その管理者を登録するための画面になります。とりあえず、Add myself で Amazon Lake Formation にアクセスしている自分自身を登録します。
権限の付与手順
画面左メニューの中から、「Data permissions」を選択します。
Grant ボタンを押します。
まずはどのプリンシパルに権限を付与するのかを選択します。ここで先程の「testrole」を指定します。
つぎにテーブルバケットや名前空間、テーブルなど、どれを対象として権限を付与するかを指定します。一番上の Named Data Catalog resources を選ぶとカタログなどを選ぶボックスが出てきます。
なお、アカウント全体のテーブルバケットを指定したい場合は Catalogs に<アカウントID>:s3tablescatalog
のカタログを選びます。今回は、テーブルまで指定して許可を与えてみました。
最後に今回はテーブルまで指定しているので、テーブルに対してどの操作を許可するかを選択する Table permissions の設定をします。閲覧だけできるように Select と Describe を選んでみました。その下をみると Data permissions
というところに Column-based access
という文字も見えるので、ここで列ベースのアクセス許可の設定もできるようです。
Grant ボタンを押すと設定完了です。
権限付与後の動作確認
では、「testrole」にスイッチして動作確認してみます。
Amazon Athena の画面にいくと先程はカタログすら見えませんでしたが、今回はちゃんとテーブルまで見える状態になっています。
Select 文を実行してみると正常に実行されました。
続いて insert 文を実行してみます。
ちゃんと select だけが許可されているようです。Amazon Lake Formation での権限設定が正しく動作していることが確認できました。
まとめ
AWS公式ドキュメントの「チュートリアル: S3 テーブルの使用開始」に沿って、以下のことを行いました
- テーブルバケットの作成とAWS分析サービスとの統合
- 名前空間とテーブルの作成
- Amazon Lake Formation を使った権限管理
私はデータ分析界隈にはそれほど詳しくないのですが、Amazon S3 Tablesには色々可能性が詰まってるような気がするので、キャッチアップしたくて今回のブログを書きました。今まで、通常のS3で行っていた分析が今後はS3 Tablesで行うように置き換わっていくんじゃないかと感じています。
Amazon S3 Tables は従来の S3 の使い方とは少し異なるため、最初は戸惑うかもしれませんが、皆さんもぜひ試してみてください。
以上、とーちでした。