【问题标题】:What is the difference between AWS and AWS_PROXY in CloudFormation::APIGateway?CloudFormation::APIGateway 中的 AWS 和 AWS_PROXY 有什么区别?
【发布时间】:2020-09-21 15:20:34
【问题描述】:

在具有 AWS::ApiGateway::Method - Integration:Type 和 Lambda 后端的 CloudFormation 模板中,AWSAWS_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

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

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

谢谢。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudformation aws-api-gateway


    【解决方案1】:

    AWSAWS_PROXY 是 API Gateway 中的两种集成方式。

    • AWS_PROXY仅与 lambda 一起使用,它是通过 API Gateway 使用 lambda 的最简单方法。它means

    对于 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 的内容,以及如何将响应传递给调用者。如果您有现有的 lambda 并且您无法更改它,通常您会使用 AWS 和 lambda。这样,在AWS 集成中,您可以塑造和塑造从调用者到 lambda 和返回的输入和输出,而无需更改 lambda。

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

    AWS_PROXY

    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  
    

    【讨论】:

      猜你喜欢
      • 2016-02-13
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2016-10-04
      • 2019-01-15
      • 2018-08-12
      相关资源
      最近更新 更多