AccessDeniedException при тестировании метода GET в AWS API Gateway с помощью HttpMethod POST - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу реализовать метод GET в AWS API Gateway, который возвращает сообщения от AWS SQS.Когда я тестирую его, я получаю исключение:

<AccessDeniedException>   
    <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

У меня есть весь стек, определенный в yml-файле без сервера:

functions:
  listExportJob:
    handler: src/listExportJob.handler
    role: listExportJobIAM
    environment:
      processingqueueUrl: https://xxxxx/processing-exports-queue-eu-local
    events:
      - processingsqs:
          arn:  arn:aws:sqs:xxxxx:processing-exports-queue-eu-local
          events:
            - sqs:ChangeMessageVisibility
            - sqs:ChangeMessageVisibilityBatch
            - sqs:GetQueueAttributes
            - sqs:ReceiveMessage
resources:
  Resources:
    processingSQSQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: processing-exports-queue-eu-local
    ApiGatewayRestApi:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Name: ApiGateway
    listExportAPIResource:
      Type: "AWS::ApiGateway::Resource"
      Properties:
        ParentId:
          Fn::GetAtt:
            - "ApiGatewayRestApi"
            - "RootResourceId"
        PathPart: "listExport"
        RestApiId:
          Ref: ApiGatewayRestApi          
    listExportAPIMethod:
      Type: AWS::ApiGateway::Method
      DependsOn: processingSQSQueue
      Properties:
        RestApiId:
            Ref: ApiGatewayRestApi
        ResourceId:
            Ref: listExportAPIResource
        HttpMethod: "GET"
        MethodResponses:
            - StatusCode: "200"
              ResponseParameters: 
                "method.response.header.Access-Control-Allow-Origin": true
        AuthorizationType: "NONE"
        Integration:
          Type: AWS
          Credentials:
            Fn::GetAtt: [ "APIGatewaySQSIAM", "Arn" ]
          IntegrationHttpMethod: POST
          IntegrationResponses:
            - StatusCode: "200"
              ResponseParameters: 
                "method.response.header.Access-Control-Allow-Origin": "'*'"
              ResponseTemplates: 
                "application/json": ""
          Uri: arn:aws:apigateway:xxxxx/processing-exports-queue-eu-local          
    APIGatewaySQSIAM:
      Type: AWS::IAM::Role
      Properties:
        Path: /app/all/
        RoleName: APIGSQSRole
        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - apigateway.amazonaws.com
              Action: sts:AssumeRole
        Policies:
          - PolicyName: APIGATEWAYIAMAll
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Resource: "*"
                  Action:
                    - logs:CreateLogGroup
                    - logs:CreateLogStream
                    - logs:PutLogEvents
                - Effect: Allow
                  Resource:
                    - "*"
                  Action:
                    - "sqs:SendMessage"
    listExportJobIAM:
      Type: AWS::IAM::Role
      Properties:
        RoleName: listExportJobRole
        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
              Action: sts:AssumeRole
        Policies:
          - PolicyName: listExportJobIAMAll
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Action:
                    - logs:CreateLogStream
                    - logs:PutLogEvents
                    - logs:CreateLogGroup
                  Resource: '*'
                - Effect: Allow
                  Action:
                    - sqs:ChangeMessageVisibility
                    - sqs:ChangeMessageVisibilityBatch
                    - sqs:GetQueueAttributes
                    - sqs:ReceiveMessage
                  Resource:     arn:aws:sqs:xxxxx:processing-exports-queue-eu-local
                - Effect: Allow
                  Action:
                    - lambda:InvokeFunction
                  Resource: '*'

Я определил метод GET с помощью IntegrationHttpMethod POST и яне вижу, что не так с моей реализацией.

В AWS API Gateway есть другой метод, который отправляет сообщение непосредственно в AWS SQS и работает правильно.

1 Ответ

0 голосов
/ 12 марта 2019

Наконец, это работает с использованием интеграции Lambda-Proxy, добавляя в функцию событие http:

  events:
    - http:
        path: listExports
        method: get
        cors: true
...