Amazon web services 在CloudFormation::APIGateway中,AWS和AWS_代理之间有什么区别?

Amazon web services 在CloudFormation::APIGateway中,AWS和AWS_代理之间有什么区别?,amazon-web-services,aws-lambda,amazon-cloudformation,aws-api-gateway,Amazon Web Services,Aws Lambda,Amazon Cloudformation,Aws Api Gateway,在带有AWS::ApiGateway::Method-Integration:Type和Lambda后端的CloudFormation模板中,AWS和AWS\u PROXY之间有什么区别?刚才我不断地收到502个错误,并且意识到我需要用一个非常特殊格式的JSON响应进行响应。当我从控制台创建API网关时,我从未遇到过这个问题。它现在确实起作用了,但我想知道潜在的差异,这样我就可以学习了 以下是CF模板中的部分: VisitorCounterAPIGatewayRootMethod: 类型:AWS

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

以下是CF模板中的部分:

VisitorCounterAPIGatewayRootMethod:
类型:AWS::ApiGateway::Method
特性:
授权类型:无
HttpMethod:GET
整合:
集成httpmethod:POST
类型:AWS#U PROXY#这是我的问题。AWS还是AWS_代理?
Uri:!附属的
-arn:aws:apigateway:${aws::Region}:lambda:path/2015-03-31/functions/${lambdaArn}/invocations
-拉姆达恩:!GetAtt VisitorCountLambda.Arn
资源ID:!GetAtt VisitorCounterAPIGateway.RootResourceId
RestApiId:!Ref访问者网关
下面是我的Lambda函数(Python3.7)的响应代码:

apiResponse={
“isBase64Encoded”:False,
“状态代码”:200,
“body”:json.dumps({
“visitorCount”:int(浮动(响应[“属性”][“金额”]))
})
}

谢谢。

AWS
AWS\u PROXY
是API网关中的两种集成类型

  • AWS_PROXY
    仅用于lambda并且它是使用带有API网关的lambda的最简单方法。它:
对于HTTP代理集成,API网关在前端和HTTP后端之间传递整个请求和响应。对于Lambda代理集成,API网关将整个请求作为输入发送到后端Lambda函数。API网关然后将Lambda函数输出转换为前端HTTP响应

  • AWS
    可与任何AWS服务一起使用,包括lambda。设置更为复杂,通常在您想要将API网关与SQS或Kinesis或其他AWS服务集成时使用:
这种类型的集成允许API公开AWS服务操作。在AWS集成中,必须配置集成请求和集成响应,并设置从方法请求到集成请求以及从集成响应到方法响应的必要数据映射

所以要回答你的问题:

类型:AWS#U PROXY#这是我的问题。AWS还是AWS_代理

如果可以,请使用AWS\U代理。这是与lambda集成的最精简、最容易操作和设置的形式。它只适用于lambda。由于整个响应和应答只通过API网关,因此必须确保lambda向调用方返回正确的头和状态代码

将AWS与其他服务(如SQS)一起使用。您仍然可以使用lambda,但它需要更多的设置。但好处是,您可以更多地控制传递到lambda中的内容,以及如何将响应传递给调用方。如果已有lambda且无法更改,则通常会将AWS与lambda一起使用。通过这种方式,在AWS集成中,您可以在不更改lambda的情况下,对调用者到lambda的输入和输出进行造型和模制

关于CloudFormation中AWS和AWS_代理集成的简短示例,表明当您使用
AWS
集成时,您可以定义可以传递给lambda的额外参数(
myParam
):

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 
AWS

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