How to integrate API Gateway with SQS

前端 未结 2 518
抹茶落季
抹茶落季 2021-01-01 19:02

Just like in the title. I try to integrate API Gateway method with a SQS using cloud formation. What I am missing is the correct URI for the SQS. If any of you already did t

相关标签:
2条回答
  • 2021-01-01 19:18

    To answer my own question. Here is how you integrate SQS as a Service Proxy in API Gateway:

    PostMethod:
        Type: "AWS::ApiGateway::Method"
        Properties:
          AuthorizationType: "NONE"
          ApiKeyRequired: "true"
          HttpMethod: "POST"
          ResourceId: !Ref "SomeResource"
          RestApiId: !Ref "RestApi"
          MethodResponses:
          - StatusCode: 200
          Integration:
            Credentials: !GetAtt "RestApiRole.Arn"
            IntegrationHttpMethod: "POST"
            IntegrationResponses:
            - StatusCode: 200
            Type: "AWS"
            Uri: !Sub "arn:aws:apigateway:${AWS::Region}:sqs:action/SendMessage"
            RequestParameters:
              integration.request.querystring.QueueUrl: !Sub "'${SomeQueue}'"
              integration.request.querystring.MessageBody: "method.request.body"
    

    I've finally found all answers to my questions in various documentation. RTFM I guess.

    EDIT:

    and here the code for RestApiRole:

    RestApiRole:
        Type: "AWS::IAM::Role"
        Properties:
          AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
            - Action:
              - "sts:AssumeRole"
              Principal:
                Service:
                - "apigateway.amazonaws.com"
              Effect: "Allow"
          Policies:
          - PolicyName: "InvokeLambda"
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
              - Action:
                - "lambda:InvokeFunction"
                Resource: !GetAtt "LambdaFunction.Arn"
                Effect: "Allow"
    
    0 讨论(0)
  • 2021-01-01 19:19

    I'm pretty sure the SQS role and policy should look more like this (you seem to have pasted the lambda role instead):

    SQSRole:
       Type: AWS::IAM::Role
       Properties:
        AssumeRolePolicyDocument:
         Version: '2012-10-17'
         Statement:
          - Effect: Allow
            Principal:
             Service:
              - apigateway.amazonaws.com
            Action: sts:AssumeRole
        Path: /
      SQSRolePolicy:
        Type: AWS::IAM::Policy
        DependsOn: [SQSRole]
        Description: IAM policy applied to the service role.
        Properties:
          PolicyName: send-messages-sqs
          PolicyDocument:
            Statement:
            - Action:
                - sqs:SendMessage
              Resource:
                - !Sub arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:QUEUE_NAME
              Effect: Allow
          Roles: [!Ref SQSRole]
    
    0 讨论(0)
提交回复
热议问题