リソースリンクなしでAmazon Data FirehoseからAmazon S3 Tablesへのデータ配信を試してみた
Data FirehoseからS3 Tablesにデータを配信する際に、リソースリンクの設定が不要になっていたので、試してみたいと思います。
AWSのアップデートアナウンスは見つかりませんでしたが、Data Firehoseのドキュメント変更記録を見ると、5/14からリソースリンクの設定が不要になっていたようです。
試してみる
前提
今回は以前のブログ作成した、既存のS3 Tablesリソースを利用します。
- バケット名: analysis-test
- ネームスペース名: sample
- テーブル名: sensor_readings
また、S3 TablesとAWS分析サービスとの統合がなされている必要があります。まだの場合は、以下のドキュメントを参考にマネジメントコンソールのS3 TablesのページからやAWS CLIを用いて実施する必要があります。
サービスロール用IAMロールの作成
以下のドキュメントを参考にData Firehoseストリーム作成時に、サービスロールとして指定するためのIAMロールを作成します。IAMロール作成時の詳細な流れは割愛します。
ポリシーの中身は次のようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3TableAccessViaGlueFederation",
"Effect": "Allow",
"Action": [
"glue:GetTable",
"glue:GetDatabase",
"glue:UpdateTable"
],
"Resource": [
"arn:aws:glue:{リージョン}:{アカウントID}:catalog/s3tablescatalog/analysis-test",
"arn:aws:glue:{リージョン}:{アカウントID}:catalog/s3tablescatalog",
"arn:aws:glue:{リージョン}:{アカウントID}:catalog",
"arn:aws:glue:{リージョン}:{アカウントID}:database/s3tablescatalog/analysis-test/sample",
"arn:aws:glue:{リージョン}:{アカウントID}:table/s3tablescatalog/analysis-test/sample/sensor_readings"
]
},
{
"Sid": "S3DeliveryErrorBucketPermission",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::{エラー配信用バケット}",
"arn:aws:s3:::{エラー配信用バケット}/*"
]
},
{
"Sid": "RequiredWhenDoingMetadataReadsANDDataAndMetadataWriteViaLakeformation",
"Effect": "Allow",
"Action": [
"lakeformation:GetDataAccess"
],
"Resource": "*"
},
{
"Sid": "LoggingInCloudWatch",
"Effect": "Allow",
"Action": [
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:{リージョン}:{アカウントID}:log-group:*"
]
}
]
}
ドキュメントを参考にしつつ、Glueのリソースのところは具体的にカタログ名やデータベース、テーブル名を指定しました。
S3 Tablesのリソースは、Glue/Lake Formationにおいて、次のように扱われます。現状マネジメントコンソールにおいて、Glueのページでは確認できず、Lake Formationのページでのみ確認できますが、ARNはGlueのリソースとして表現されます。
- バケット: カタログ(
s3tablescatalog
の子のカタログ)- arn:aws:glue:{リージョン}:{アカウントID}:catalog/s3tablescatalog/{バケット名}
- ネームスペース: データベース
- arn:aws:glue:{リージョン}:{アカウントID}:database/s3tablescatalog/{バケット名}/{ネームスペース名}
- テーブル: テーブル
- arn:aws:glue:{リージョン}:{アカウントID}:table/s3tablescatalog/{バケット名}/{ネームスペース名}/{テーブル名}
参考:
Lake Formationでサービスロールに権限付与
マネジメントコンソールのLake FormationページからData Firehoseストリームで用いるサービスロールにS3 Tablesのテーブルに対する権限を付与します。以前はリソースリンクに対する権限付与も必要でしたが、今後はリソースリンクに対する権限は不要です!
テーブル一覧から対象のテーブルを選択して、ActionsからPermissionsのGrantを開きます。
対象のIAMロールとして、先ほど作成したData Firehoseストリームのサービスロール用IAMロールを指定します。
テーブルパーミッションとして、Superを選択し、Grantします。
Data Firehoseストリームの作成
続いて、マネジメントコンソールからData Firehoseストリームを作成します。
ソースはDirect PUT、送信先はApache Icebergテーブルを指定し、名前も指定します。
次は送信先の設定です。カタログ名(S3 Tablesのバケット名)を指定します。一意のキー設定で、データベース名(S3 Tablesのネームスペース名)、テーブル名を指定します。
以前はカタログ名の指定がなかったため、デフォルトカタログにリソースリンクを作成し、データベース名やテーブル名にはリソースリンクの名前を指定していました。カタログ名を指定できるようになったことで、リソースリンクを作成する必要がなくなりました!
IAMロールには先ほど作成したものを指定します。
その他の項目も設定し、Data Firehoseストリームを作成します。
データが配信されるか確認
ストリームの作成後、動作確認として、以前のブログで利用したスクリプトを実行して、Data Firehoseにデータを流します。
流してしばらくしてから、Athenaでデータを確認してみます。
SELECT * FROM "s3tablescatalog/analysis-test"."sample"."sensor_readings"
WHERE timestamp > date '2025-06-09'
limit 10;
データが入っていることを確認できました。
さいごに
リソースリンクが不要になったことで、Data FirehoseからS3 Tablesにデータを流すのが少し簡単になりました。リソースリンクに関連する問題で詰まるケースが多かったため、何気に嬉しい変更です!