Create a Lambda function that resizes images uploaded to S3 via SQS.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Image resizing service through SQS (uksb-1tthgi812) (tag:s3-sqs-lambda)
Parameters:
SourceBucketName:
Type: String
QueueName:
Type: String
DestinationBucketName:
Type: String
Resources:
## S3 bucket
SourceBucket:
Type: AWS::S3::Bucket
DependsOn:
- ResizerQueueQueuePolicy
Properties:
BucketName: !Ref SourceBucketName
NotificationConfiguration:
QueueConfigurations:
- Event: "s3:ObjectCreated:*"
Queue: !GetAtt ResizerQueue.Arn
Filter:
S3Key:
Rules:
- Name: suffix
Value: '.jpg'
DestinationBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref DestinationBucketName
## SQS Queue
ResizerQueue:
Type: "AWS::SQS::Queue"
Properties:
QueueName: !Ref QueueName
## Policies
ResizerQueueQueuePolicy:
Type: "AWS::SQS::QueuePolicy"
Properties:
PolicyDocument:
Version: "2012-10-17"
Id: QueuePolicy
Statement:
- Sid: Allow-SendMessage-To-Queue-From-S3-Event-Notification
Effect: Allow
Principal:
Service: "s3.amazonaws.com"
Action:
- "sqs:SendMessage"
Resource: !GetAtt ResizerQueue.Arn
Condition:
ArnLike:
aws:SourceArn: !Join ["",['arn:aws:s3:::',!Ref SourceBucketName]]
StringEquals:
aws:SourceAccount: !Ref AWS::AccountId
Queues:
- Ref: ResizerQueue
## Lambda function
ResizerFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: app.handler
Runtime: nodejs20.x
MemorySize: 2048
Layers:
- !Sub 'arn:aws:lambda:${AWS::Region}:175033217214:layer:graphicsmagick:2'
Policies:
- S3ReadPolicy:
BucketName: !Ref SourceBucketName
- S3CrudPolicy:
BucketName: !Ref DestinationBucketName
Environment:
Variables:
DESTINATION_BUCKETNAME: !Ref DestinationBucketName
Events:
MySQSEvent:
Type: SQS
Properties:
Queue: !GetAtt ResizerQueue.Arn
Outputs:
SourceBucketName:
Value: !Ref SourceBucketName
Description: S3 Bucket for object storage
DestinationBucketName:
Value: !Ref DestinationBucketName
Description: S3 destination Bucket for object storage
QueueName:
Value: !Ref QueueName
Description: SQS Queue for queuing the s3 events
FunctionArn:
Value: !Ref ResizerFunction
Description: ResizerFunction function Arn
Visit the GitHub repo for this pattern.
git clone https://github.com/aws-samples/serverless-patterns/ cd serverless-patterns/s3-sqs-lambda
npm --prefix ./src install ./srcsam buildsam deploy --guided
aws s3 cp './events/exampleImage.png' s3://{SourceBucketName}
aws s3 ls s3://{DestinationBucketName}
sam delete --stack-name STACK_NAME
.aws cloudformation list-stacks --query "StackSummaries[?contains(StackName,'STACK_NAME')].StackStatus"