Handling s3:TestEvent in Amazon S3 Event Notifications

Handling s3:TestEvent in Amazon S3 Event Notifications

Amazon S3 sends an s3:TestEvent message when an event notification is configured. Consumers must handle its structure separately from ordinary event messages.

Takahiro Iwasa
2 min read

When an event notification is configured for an S3 bucket, Amazon S3 automatically sends an s3:TestEvent message. Its structure differs from an ordinary S3 event notification, so consumers must handle it separately.

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.

Building

Create a CloudFormation stack template:

template.yaml
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

Deploy the stack:

Terminal window
aws cloudformation deploy \
--template-file template.yaml \
--stack-name s3-event-notification-test

Testing

Poll the SQS queue to confirm that the notification configuration is working:

Terminal window
aws sqs receive-message \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/{AccountId}/s3-event-notification-test-queue

You should observe the s3:TestEvent message in the output, even if no objects have been added to the bucket.

{
"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\":\"...\"}"
}
]
}

Cleaning Up

Delete the stack afterward:

Terminal window
aws cloudformation delete-stack --stack-name s3-event-notification-test

Conclusion

After the S3 bucket and its SQS event notification are deployed, an s3:TestEvent message arrives before any object is uploaded. Although this template configures only s3:ObjectCreated:Put, the test message is sent automatically when the notification configuration is attached. Unlike an ordinary S3 event notification, it has top-level Service and Event fields and does not contain a Records array.

Lambda functions and applications that consume this queue should detect s3:TestEvent and either skip it or handle it explicitly. Code that assumes every message contains Records may otherwise fail as soon as the notification configuration is created.

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.