AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: SQS-Lambda based Worker service template Globals: Function: Runtime: {{service_instance.inputs.lambda_runtime}} MemorySize: {{service_instance.inputs.lambda_memory}} Timeout: {{service_instance.inputs.lambda_timeout}} Tracing: Active Resources: # Define DeadLetter Queue DeadLetterQueue: Type: 'AWS::SQS::Queue' Properties: MessageRetentionPeriod: 1209600 UpdateReplacePolicy: Delete DeletionPolicy: Delete # Define the SQS queue SQSQueue: Type: AWS::SQS::Queue Properties: RedrivePolicy: deadLetterTargetArn: !GetAtt - DeadLetterQueue - Arn maxReceiveCount: 3 UpdateReplacePolicy: Delete DeletionPolicy: Delete QueuePolicy: Type: AWS::SQS::QueuePolicy Properties: Queues: [!Ref 'SQSQueue'] PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: - sqs:ReceiveMessage - sqs:DeleteMessage Resource: !GetAtt SQSQueue.Arn - Effect: Allow Principal: Service: sns.amazonaws.com Action: - sqs:SendMessage Resource: !GetAtt SQSQueue.Arn Condition: ArnEquals: aws:SourceArn: '{{environment.outputs.SNSTopicArn}}' pingSNSTopicSubscription: Type: AWS::SNS::Subscription Properties: TopicArn: '{{environment.outputs.SNSTopicArn}}' Protocol: 'sqs' Endpoint: !GetAtt SQSQueue.Arn # Lambda Function - uses Globals to define additional configuration values # Define the consumer Lambda function LambdaFunction: Type: AWS::Serverless::Function Properties: {% if service_instance.inputs.code_uri is defined %} Handler: {{service_instance.inputs.lambda_handler}} CodeUri: {{service_instance.inputs.code_uri}} {% else %} Handler: index.handler InlineCode: | exports.handler = async (event, context) => { try { // Log event and context object to CloudWatch Logs console.log("Event: ", JSON.stringify(event, null, 2)); console.log("Context: ", JSON.stringify(context, null, 2)); return {}; } catch (error) { console.error(error); throw new Error(error); } }; {% endif %} FunctionName: '{{service_instance.name}}-function' Events: MySQSEvent: Type: SQS Properties: Queue: !GetAtt SQSQueue.Arn BatchSize: 10 Policies: - AWSLambdaVPCAccessExecutionRole VpcConfig: SecurityGroupIds: - '{{environment.outputs.VPCSecurityGroup}}' SubnetIds: {% if service_instance.inputs.subnet_type == 'private' %} - '{{environment.outputs.PrivateSubnet1}}' - '{{environment.outputs.PrivateSubnet2}}' {% else %} - '{{environment.outputs.PublicSubnet1}}' - '{{environment.outputs.PublicSubnet2}}' {% endif %} Outputs: LambdaFunction: Description: LambdaFunction function name Value: !Ref LambdaFunction SQSqueueName: Description: SNS queue name Value: !GetAtt SQSQueue.QueueName SQSqueueARN: Description: SQS queue ARN Value: !GetAtt SQSQueue.Arn SQSqueueURL: Description: SQS queue URL Value: !Ref SQSQueue LambdaRuntime: Description: The lambda runtime Value: "{{service_instance.inputs.lambda_runtime}}"