🎰

Aws re:Invent 2024で発表されたS3 metadata/S3 tablesからAthenaでデータ取得してみた。

2024/12/09に公開

S3 metadata(tables)とは

従来S3のメタデータを得る際にはGlueでS3をクロールしてData catalogを作る方法をとっていた。
しかし2024のreinventで新たな方法が提示された。
それがS3 metadataである。
S3 MetadataはS3のメタデータをほぼリアルタイムで更新し、Iceberg tableに保存するというもの...らしいのでとりあえず触ってみた。

一回目のトライ(失敗)

リージョン設定

東京リージョンなどでは未実装のためをus-east-1に設定する。

ポリシー設定

とりあえずadministorator access をもつユーザーを作成。
この状態でS3 tablesを覗くと...?

このエラーが出る。
glue:GetCatalog,lakeformation:DescribeResource
のポリシーが付いていないので、ユーザーに付与して再度挑戦。

S3のmetadataプレビューを覗くと...ユーザーに必要なポリシーがない。
なので以下のポリシーを作成してユーザーに付与した。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetCatalog",
        "lakeformation:DescribeResource"
      ],
      "Resource": "*"
    }
  ]
}

しかし同様のエラーが出る。
S3、Glue、Lakeformation、Athenaなどに全てのアクセス許可を付与しても同様のエラー...
公式によると以下の権限が必要
AWSLakeFormationDataAdmin
glue:PassConnection
lakeformation:RegisterResource

[参考資料]
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html?icmpid=docs_amazons3_console#table-integration-prerequisites

付与したが同様のエラーのためこのまま進めてみる。

S3 テーブルバケットを作成

とりあえず空のテーブルバケットを作成する。
S3tablesの画面で「テーブルバケットを作成」を押したのちに、名前を入力してもう一度「テーブルバケットを作成」をおす。

無事正常に作成完了。

汎用のS3バケットを作成→メタデータの出力先を先ほど作成したS3テーブルバケットに

空の汎用S3バケット作成後、「メタデータ - プレビュー」タブに「メタデータ設定を作成ボタン」が出てくる。

S3の参照から先ほど作成したS3テーブルを送信先テーブルバケットに設定

Athenaクエリでテーブルのデータを取得する。

テーブルバケットにメタデータを出力すると以下のようにAthenaクエリエディタへ移動というボタンが出てくるので押してみる。

するとこのような画面が出てくる。
カタログがまだないとのこと

この時点で色々権限周りを色々試してみたがカタログが見つからない、データベースが見つからないなどのエラーになるため一時的に全てのサービスへのアクセス権限を付与(非推奨)したがこれもエラー。
とりあえず頭を冷やして最初から再試行してみた。

二回目のトライ(成功)

リージョン設定

一度「統合を有効する」の設定をus-east-1で行った後に以下のようなエラーになった。

このエラーが出ると同じリージョン内では解決方法を見つけることができなかった。
なのでとりあえずリージョンを変えて再試行してみることにした。
リージョンはus-west-2(オレゴン)

ポリシー設定

上記画面の「統合を有効にする」を押すと、以下のようなエラーが出る。(スクショはオハイオになっているがオレゴンも同様)

また他の必要なサービスへのアクセス権限も必要なのでかなり非推奨であるが以下のようなポリシーにした。(もっと権限を絞れるとは思います...怒られそうですね...)

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Action": [
				"s3tables:*"
			],
			"Resource": "*"
		},
		{
			"Sid": "Statement2",
			"Effect": "Allow",
			"Action": [
				"glue:*"
			],
			"Resource": "*"
		},
		{
			"Sid": "Statement3",
			"Effect": "Allow",
			"Action": [
				"s3:*"
			],
			"Resource": "*"
		},
		{
			"Sid": "Statement4",
			"Effect": "Allow",
			"Action": [
				"athena:*"
			],
			"Resource": "*"
		},
		{
			"Sid": "Statement5",
			"Effect": "Allow",
			"Action": [
				"lakeformation:*"
			],
			"Resource": "*"
		},
		{
			"Sid": "Statement6",
			"Effect": "Allow",
			"Action": [
				"iam:*"
			],
			"Resource": "*"
		}
	]
}

設定後エラーが消えるので統合を有効にすると以下のような画面になります。

S3table バケットを作成

前回と同様にS3のtableバケットを作成

汎用のS3バケットを作成

前回と同様で汎用のS3バケットを作成

以下のようなcsvファイルを汎用S3バケットに入れる。

作成した汎用S3バケットのメタデータ設定を作成

以下の画面からメタデータ設定を作成を押す。

送信先のテーブルバケットを作成したS3table バケットに指定。

S3の参照というボタンを押すと以下のように作成済みのS3tableバケットが出てくるので便利。

メタデータが作成されると以下のような画面が出てくる。

Athenaで一度中身を確認する。

先ほどの画面からAthenaで中身を確認したが、テーブルが見つからないというエラーがでた。

色々解決策を探していたところ以下の記事を見つけたのでこれを参考にしてみた。
ありがとうございます。🙏
[参考記事]
https://dev.classmethod.jp/articles/amazon-s3-bucket-metadata-preview/

Lakeformationの権限を設定する。

参考記事の「メタデータのテーブルのレコードを確認する」の項で触れられているようにLakeformationの権限設定が必要らしい。
「Permissions」の「Data Permissions」の項のGrantボタン(オレンジのやつ)を押すと参考記事のような設定画面が出る

IAM users and rolesに自分のユーザーを設定、Catalogsは以下のように作成されているカタログを設定、Catalog permissionsはSuper userを付与。

Lakeformation Databaseに必要な追加ポリシーを付与(未検証)

LakeformationにDatabaseの項がありここで以下のようなエラーが出ていたので追加で既存の以下ポリシーをIAMで設定した。
「AWSLakeFormationCrossAccountManager」
ただし必要かどうかは未検証。

再度Athenaでテーブルデータを見てみる。

ようやくnot foundエラーもなくテーブルを指定できた!

以下のようなクエリを実行するとメタデータを取得できました。

(結果にメタデータ)

感想

コンソール上で無事S3のメタデータを取得できた。現状ではGlue DataCatalogとの差異がわからないが(裏で動いている?)データレイクとして確固たる地位を持つS3周りのサービスが充実することで技術選定が大きく変わってくるのではないかと素人ながら思いました。
権限周りが現状で自分も理解があやふやでかなり雑にポリシーを作成してしまったのが個人的には反省点です。

Discussion