CloudFormation::APIGateway 中的 AWS 和 AWS_PROXY 有什么区别?

Chr*_*ris 3 amazon-web-services aws-cloudformation aws-lambda aws-api-gateway

带有 AWS::ApiGateway::Method - Integration:Type 和 Lambda 后端的 CloudFormation 模板之间AWS和其中的区别是什么AWS_PROXY?刚才我不断收到 502 错误,并意识到我需要使用非常特殊格式的 JSON 响应进行响应。当我从控制台创建 API 网关时,我从未遇到过这个问题。它现在确实有效,但我想知道潜在的差异,以便我可以学习。

这是 CF 模板中的部分:

VisitorCounterAPIGatewayRootMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      AuthorizationType: NONE
      HttpMethod: GET
      Integration:
        IntegrationHttpMethod: POST
        Type: AWS_PROXY #THIS is my question. AWS or AWS_PROXY?
        Uri: !Sub
          - arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${lambdaArn}/invocations
          - lambdaArn: !GetAtt VisitorCountLambda.Arn
      ResourceId: !GetAtt VisitorCounterAPIGateway.RootResourceId
      RestApiId: !Ref VisitorCounterAPIGateway
Run Code Online (Sandbox Code Playgroud)

这是我的 Lambda 函数 (Python3.7) 的响应代码:

apiResponse = {
    "isBase64Encoded": False,
    "statusCode": 200,
    "body": json.dumps({
        "visitorCount": int(float(response["Attributes"]["amount"]))
    })
}
Run Code Online (Sandbox Code Playgroud)

谢谢你。

Mar*_*cin 6

AWSAWS_PROXY是 API Gateway 中的两种集成类型。

  • AWS_PROXY仅使用拉姆达,这是与API网关拉姆达工作的最简单的方法。这意味着

对于 HTTP 代理集成,API Gateway在前端和 HTTP 后端之间传递整个请求和响应。对于 Lambda 代理集成,API Gateway 将整个请求作为输入发送到后端 Lambda 函数。API Gateway 然后将 Lambda 函数输出转换为前端 HTTP 响应。

  • AWS可以与任何 AWS 服务一起使用,包括 lambda。它设置起来更复杂,通常在您希望将 API 网关与 SQS 或 Kinesis 或其他 AWS 服务集成时使用它:

这种类型的集成允许API 公开 AWS 服务操作。在 AWS 集成中,您必须配置集成请求和集成响应,并设置从方法请求到集成请求以及从集成响应到方法响应的必要数据映射。

所以要回答你的问题:

类型:AWS_PROXY #这是我的问题。AWS 还是 AWS_PROXY?

如果可以,请使用AWS_PROXY. 这是与 lambda 集成最简化和最容易工作和设置的形式。无论如何,它只适用于 lambda。由于整个响应和回复只是通过 API 网关传递,因此您必须确保您的 lambda 将正确的标头和状态代码返回给调用者

AWS与其他服务一起使用,例如 SQS。您仍然可以使用 lambda,但它需要更多设置。但好处是您可以更好地控制传递到 lambda 的内容,以及如何将响应传递给调用者。AWS如果您有现有的 lambda 并且无法更改它,通常您会使用lambda。通过这种AWS集成方式,您可以塑造和塑造从调用者到 lambda 并返回的输入和输出,而无需更改 lambda。

CloudFormation 中 AWS 和 AWS_PROXY 集成的简短示例,显示当您使用AWS集成时,您可以定义myParam可以传递给 lambda 的额外参数( ):

AWS_代理

MyApiResourceMethod:
  Type: AWS::ApiGateway::Method
  Properties: 
    AuthorizationType: None
    HttpMethod: GET
    Integration: 
      IntegrationHttpMethod: POST 
      Type: AWS_PROXY
      Uri: !Sub >-
        arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaArn1}/invocations
    MethodResponses: 
      - ResponseModels: {"application/json": "Empty"}
        StatusCode: 200          
ResourceId: !Ref MyResource
RestApiId: !Ref MyRestApi 
Run Code Online (Sandbox Code Playgroud)

自动售货机

MyApiResourceMethod:
  Type: AWS::ApiGateway::Method
  Properties: 
    AuthorizationType: None
    #AuthorizerId: String
    HttpMethod: GET
    Integration: 
      IntegrationHttpMethod: POST 
        - ResponseTemplates: 
            application/json: ""
          StatusCode: 200
      PassthroughBehavior: WHEN_NO_TEMPLATES
      RequestTemplates: 
        application/json: |
              {
                 "myParam": "$input.params('myParam')" 
              }            
      Type: AWS
      Uri: !Sub >-
        arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaArn2}/invocations
    MethodResponses: 
      - ResponseModels: {"application/json": "Empty"}
        StatusCode: 200          
    ResourceId: !Ref MyResource
    RestApiId: !Ref MyRestApi  
Run Code Online (Sandbox Code Playgroud)