AWS S3 通知設定で注意すべきポイント:s3:TestEvent

AWS S3 通知設定で注意すべきポイント:s3:TestEvent

岩佐 孝浩
岩佐 孝浩
3 min read
S3 SQS

はじめに

Amazon S3 バケットのイベント通知を設定する際に、s3:TestEvent メッセージが自動的に送信されます。このテストメッセージを適切に処理することで、システムの問題を回避できます。

When you configure an event notification on a bucket, Amazon S3 sends the following test message.

AWS リソースの作成

以下の手順に従って、S3 通知のテスト用の AWS リソースを作成してください。

CloudFormation テンプレート

次の CloudFormation テンプレートを使用して、関連する SQS キューを持つ S3 バケットを作成します。(行11-14)

AWSTemplateFormatVersion: "2010-09-09"
Description: Example of CloudWatch events not queueing to SSE SQS
Resources:
  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

CloudFormation スタックのデプロイ

以下のコマンドを使用してスタックをデプロイしてください。

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

まとめ

s3:TestEvent メッセージを適切に処理することは、S3 通知システムの信頼性を確保するために非常に重要です。このメッセージを適切に管理しないと、下流のシステムで誤動作や意図しない結果を引き起こす可能性があります。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023