Amazon S3 イベント通知の s3:TestEvent を処理する
Amazon S3 はイベント通知の設定時に s3:TestEvent メッセージを送信します。通常のイベント通知とは構造が異なるため、コンシューマー側で個別に処理する必要があります。
S3 バケットにイベント通知を設定すると、Amazon S3 から s3:TestEvent メッセージが自動的に送信されます。通常の S3 イベント通知とは構造が異なるため、コンシューマー側で個別に処理する必要があります。
https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-content-structure.html
When you configure an event notification on a bucket, Amazon S3 sends a test message with the
s3:TestEvent.
構築
CloudFormation スタックのテンプレートを作成します。
AWSTemplateFormatVersion: "2010-09-09"Description: Example of CloudWatch events not queueing to SSE SQSResources: Bucket: Type: AWS::S3::Bucket Properties: BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 NotificationConfiguration: QueueConfigurations: - Event: 's3:ObjectCreated:Put' Queue: !GetAtt Queue.Arn PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true
Queue: Type: AWS::SQS::Queue Properties: QueueName: s3-event-notification-test-queue ReceiveMessageWaitTimeSeconds: 20
QueuePolicy: Type: AWS::SQS::QueuePolicy Properties: PolicyDocument: Version: '2008-10-17' Statement: - Effect: Allow Principal: Service: s3.amazonaws.com Action: - SQS:SendMessage - SQS:ReceiveMessage Resource: !GetAtt Queue.Arn Condition: StringEquals: aws:SourceAccount: !Ref AWS::AccountId Queues: - !Ref Queueスタックをデプロイします。
aws cloudformation deploy \ --template-file template.yaml \ --stack-name s3-event-notification-testテスト
SQS キューをポーリングし、通知設定が機能していることを確認します。
aws sqs receive-message \ --queue-url https://sqs.ap-northeast-1.amazonaws.com/{AccountId}/s3-event-notification-test-queueバケットにオブジェクトを一つも追加していなくても、出力の中に s3:TestEvent メッセージが確認できるはずです。
{ "Messages": [ { "MessageId": "...", "ReceiptHandle": "...", "MD5OfBody": "...", "Body": "{\"Service\":\"Amazon S3\",\"Event\":\"s3:TestEvent\",\"Time\":\"2020-12-29T18:53:47.874Z\",\"Bucket\":\"s3-event-notification-test-bucket-xxxxxxxx\",\"RequestId\":\"...\",\"HostId\":\"...\"}" } ]}後片付け
作業後はスタックを削除します。
aws cloudformation delete-stack --stack-name s3-event-notification-testまとめ
SQS イベント通知を設定した S3 バケットをデプロイすると、オブジェクトをアップロードする前に s3:TestEvent メッセージが届きます。このテンプレートでは s3:ObjectCreated:Put だけを設定していますが、テストメッセージは通知設定の作成時に自動送信されます。通常の S3 イベント通知とは異なり、最上位に Service と Event フィールドがあり、Records 配列はありません。
このキューを消費する Lambda 関数やアプリケーションでは、s3:TestEvent を検出してスキップするか、明示的に処理してください。すべてのメッセージに Records が含まれると仮定すると、通知設定の作成直後に処理が失敗する可能性があります。
Related posts
CloudFront 署名付き URL 経由で S3 にアップロードする
CloudFront の署名付き URL を使い、独自ドメイン経由で S3 にアップロードする方法を紹介します。S3 の署名付き URL を直接使えない場合に有用です。
Cognito User Pools と OIDC で Slack サインインを実装する
Cognito user pool を OIDC 経由で Slack と連携させ、"Sign in with Slack" を Amplify で Next.js アプリケーションに組み込みます。
Lambda Web Adapter で FastAPI を AWS Lambda にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の Lambda 関数へデプロイします。
API Gateway WebSocket:モック統合の実装
バックエンドの Lambda を使わず、モック統合のみで API Gateway WebSocket API を構築し、あらかじめ用意したレスポンスを返します。
AWS EventBridge Scheduler:スケジュールに沿って EC2 を起動・停止する
Lambda を介さず、EventBridge Scheduler から EC2 API を直接呼び出し、cron スケジュールに従って EC2 インスタンスを起動・停止します。
