使用HttpMethod POST在AWS API Gateway中测试GET方法时出现AccessDeniedException

时间:2019-02-19 08:56:46

标签: amazon-web-services aws-lambda aws-api-gateway serverless-framework

我想在AWS API Gateway中实现一个GET方法,该方法从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: '*'

我已经使用IntegrationHttpMethod POST定义了GET方法,但看不到实现的问题。

AWS API网关还有另一种直接将消息发布到AWS SQS并正常工作的方法。

0 个答案:

没有答案