リソースリンクなしでAmazon Data FirehoseからAmazon S3 Tablesへのデータ配信を試してみた

リソースリンクなしでAmazon Data FirehoseからAmazon S3 Tablesへのデータ配信を試してみた

リソースリンクを作成せずにData FirehoseからS3 Tablesにデータを流せるようになっていたようです!
Clock Icon2025.06.09

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を開きます。
Screenshot 2025-06-09 at 15.16.09

対象のIAMロールとして、先ほど作成したData Firehoseストリームのサービスロール用IAMロールを指定します。

Screenshot 2025-06-09 at 15.16.31

テーブルパーミッションとして、Superを選択し、Grantします。

Screenshot 2025-06-09 at 15.16.37

Data Firehoseストリームの作成

続いて、マネジメントコンソールからData Firehoseストリームを作成します。
ソースはDirect PUT、送信先はApache Icebergテーブルを指定し、名前も指定します。

Screenshot 2025-06-09 at 12.12.12

次は送信先の設定です。カタログ名(S3 Tablesのバケット名)を指定します。一意のキー設定で、データベース名(S3 Tablesのネームスペース名)、テーブル名を指定します。

以前はカタログ名の指定がなかったため、デフォルトカタログにリソースリンクを作成し、データベース名やテーブル名にはリソースリンクの名前を指定していました。カタログ名を指定できるようになったことで、リソースリンクを作成する必要がなくなりました!

Screenshot 2025-06-09 at 12.12.39

IAMロールには先ほど作成したものを指定します。
その他の項目も設定し、Data Firehoseストリームを作成します。

Screenshot 2025-06-09 at 12.57.22

データが配信されるか確認

ストリームの作成後、動作確認として、以前のブログで利用したスクリプトを実行して、Data Firehoseにデータを流します。

流してしばらくしてから、Athenaでデータを確認してみます。

SELECT * FROM "s3tablescatalog/analysis-test"."sample"."sensor_readings"
WHERE timestamp > date '2025-06-09'
limit 10;

データが入っていることを確認できました。

Screenshot 2025-06-09 at 15.05.05

さいごに

リソースリンクが不要になったことで、Data FirehoseからS3 Tablesにデータを流すのが少し簡単になりました。リソースリンクに関連する問題で詰まるケースが多かったため、何気に嬉しい変更です!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.