AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: HTTP API webhook to SQS queue via EventBridge. Resources: MySqsQueue: Type: AWS::SQS::Queue QueueConsumerFunction: Type: AWS::Serverless::Function Properties: CodeUri: code/ Handler: consumer.handler Runtime: nodejs12.x Timeout: 3 MemorySize: 128 # Enable this line to have the Lambda function # run one event as a time: # ReservedConcurrentExecutions: 1 Policies: - SQSPollerPolicy: QueueName: !GetAtt MySqsQueue.QueueName Events: MySQSEvent: Type: SQS Properties: Queue: !GetAtt MySqsQueue.Arn BatchSize: 10 MyHttpApi: Type: AWS::Serverless::HttpApi Properties: DefinitionBody: 'Fn::Transform': Name: 'AWS::Include' Parameters: Location: './api.yaml' MyHttpApiRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: "apigateway.amazonaws.com" Action: - "sts:AssumeRole" Policies: - PolicyName: ApiDirectWriteEventBridge PolicyDocument: Version: '2012-10-17' Statement: Action: - events:PutEvents Effect: Allow Resource: - !Sub arn:aws:events:${AWS::Region}:${AWS::AccountId}:event-bus/default EventRule: Type: AWS::Events::Rule Properties: Description: "Send webhook events to SQS queue." EventPattern: account: - !Sub '${AWS::AccountId}' source: - "myWebhook" Targets: - Arn: !GetAtt MySqsQueue.Arn Id: "SQSqueue" EventBridgeToToSqsPolicy: Type: AWS::SQS::QueuePolicy Properties: PolicyDocument: Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: SQS:SendMessage Resource: !GetAtt MySqsQueue.Arn Queues: - Ref: MySqsQueue Outputs: ApiEndpoint: Description: "HTTP API endpoint URL" Value: !Sub "https://${MyHttpApi}.execute-api.${AWS::Region}.amazonaws.com/webhook" QueueConsumerFunction: Description: QueueConsumerFunction function name Value: !Ref QueueConsumerFunction