AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for apigw-sqs-lambda-sqs
Globals:
  Function:
    Timeout: 5
Resources:
  Api:
    Type: AWS::Serverless::Api
    Properties:
      Name: !Sub
        - ${ResourceName} From Stack ${AWS::StackName}
        - ResourceName: Api
      StageName: Prod
      DefinitionBody:
        openapi: '3.0'
        info: {}
        paths:
          /inbox:
            post:
              x-amazon-apigateway-integration:
                credentials: !GetAtt ApiProcessInputQueuesendmessageRole.Arn
                httpMethod: POST
                type: aws
                uri: !Sub arn:${AWS::Partition}:apigateway:${AWS::Region}:sqs:path/${AWS::AccountId}/${InputQueue.QueueName}
                requestParameters:
                  integration.request.header.Content-Type: '''application/x-www-form-urlencoded'''
                requestTemplates:
                  application/json: Action=SendMessage&MessageBody={"data":$input.body}
                responses:
                  default:
                    statusCode: 200
              responses:
                '200':
                  description: 200 response
          /outbox:
            get:
              x-amazon-apigateway-integration:
                httpMethod: POST
                type: aws_proxy
                uri: !Sub arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${CheckOutputQueue.Arn}/invocations
              responses: {}
      EndpointConfiguration: REGIONAL
      TracingEnabled: true
  ApiProcessInputQueuesendmessageRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - sts:AssumeRole
            Effect: Allow
            Principal:
              Service:
                - apigateway.amazonaws.com
        Version: '2012-10-17'
      Path: /
      Policies:
        - PolicyDocument:
            Statement:
              - Action: sqs:SendMessage
                Effect: Allow
                Resource: !GetAtt InputQueue.Arn
            Version: '2012-10-17'
          PolicyName: ApiinboxsendmessagePolicy
  CheckOutputQueue:
    Type: AWS::Serverless::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: CheckOutputQueue
      CodeUri: src/check-output-queue
      Handler: check_output_queue.lambda_handler
      Runtime: python3.9
      MemorySize: 128
      Timeout: 5
      Tracing: Active
      Environment:
        Variables:
          INPUT_QUEUE_NAME: !Ref InputQueue
          OUTPUT_QUEUE_NAME: !Ref OutputQueue
      Policies:
        - AmazonSQSFullAccess
      Events:
        ApiGEToutbox:
          Type: Api
          Properties:
            Path: /outbox
            Method: GET
            RestApiId: !Ref Api
  CheckOutputQueueLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: !Sub /aws/lambda/${CheckOutputQueue}
  InputQueue:
    Type: AWS::SQS::Queue
    Properties:
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt InputQueueDLQ.Arn
        maxReceiveCount: 1
      MessageRetentionPeriod: 345600
      VisibilityTimeout: 5
  OutputQueue:
    Type: AWS::SQS::Queue
    Properties:
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt OutputQueueDLQ.Arn
        maxReceiveCount: 1
      MessageRetentionPeriod: 345600
      VisibilityTimeout: 5
    Metadata:
      SamResourceId: ProcessOutputQueue
  ProcessInputQueue:
    Type: AWS::Serverless::Function
    Properties:
      Tracing: Active
      Policies:
        - AWSXrayWriteOnlyAccess
        - AmazonSQSFullAccess
      CodeUri: src/process-input-queue
      Handler: process_input_queue.lambda_handler
      Runtime: python3.9
      Environment:
        Variables:
          OUTPUT_QUEUE_NAME: !Ref OutputQueue
      Events:
        SampleSQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt InputQueue.Arn
            BatchSize: 10
      MemorySize: 128
      Timeout: 5
  InputQueueDLQ:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 345600
  OutputQueueDLQ:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 345600
Outputs:
  APIGatewayURL:
    Description: API Gateway EndPoint
    Value: !Sub https://${Api}.execute-api.${AWS::Region}.amazonaws.com/Prod/
  APIGatewayInputEndPoint:
    Description: API Gateway EndPoint
    Value: !Sub https://${Api}.execute-api.${AWS::Region}.amazonaws.com/Prod/inbox
  APIGatewayOutputEndPoint:
    Description: API Gateway EndPoint
    Value: !Sub https://${Api}.execute-api.${AWS::Region}.amazonaws.com/Prod/outbox
  SQSInputQueue:
    Description: SQS Input Queue
    Value: !Ref InputQueue
  SQSOutputQueue:
    Description: SQS Output Queue
    Value: !Ref OutputQueue
  SQSInputQueueDLQ:
    Description: SQS Input Dead letter Queue
    Value: !Ref InputQueueDLQ
  SQSOutputQueueDLQ:
    Description: SQS Output Dead leter Queue
    Value: !Ref OutputQueueDLQ