【问题标题】:Unable to configure Method Response and Integration Response using AWS SAM无法使用 AWS SAM 配置方法响应和集成响应
【发布时间】:2021-10-11 02:08:33
【问题描述】:

我正在尝试使用 SAM 部署 api 和 lambda 函数。但是方法响应和积分响应是空的。我的目标是配置如下图所示的 api-gateway。在此我手动配置了 api-gateway 及其工作,但是当我使用 SAM 生成 api-gateway 时,它不会显示方法响应和集成响应。

没有山姆:

与山姆:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 500
    MemorySize: 5000

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      GatewayResponses:
        DEFAULT_4xx:
          ResponseParameters:
            Headers:
              Access-Control-Expose-Headers: "'WWW-Authenticate'"
              Access-Control-Allow-Origin: "'*'"

  InferenceFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      Events:
        Inference:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /zero-shot-classification
            Method: post
            RestApiId: !Ref MyApi
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./zero-shot-classification
      DockerTag: zero-shot-classification

【问题讨论】:

  • SAM 方式是通常的方式。你为什么要反其道而行之?您必须基本上不使用 SAM,并且从头开始做所有事情。
  • 实际上,当我使用 SAM 部署它时,使用邮递员无法访问端点,它给出了internal server error。虽然 lambda 函数正在工作。但是当我手动配置 api-gateway(配置 REST Api 的简单步骤)时,它可以工作。
  • 所以我比较了 api-gateway 手动创建的一个和 sam 创建的一个,我发现它唯一的区别就是这个

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


【解决方案1】:

您看到的区别是负载如何发送到 lambda 和 API 网关如何处理来自 lambda 的响应之间的区别。就像在您的 CloudFormation 中您没有为 API 端点指定规范一样,AWS SAM 将根据您的函数中的事件来构造它。但是,AWS SAM 将始终使用 LAMBDA_PROXY 集成类型,而您似乎想要使用 LAMBDA 集成类型。

我建议您使用手动创建的 API 网关并将其导出到 openapi/swagger 定义。这可以在你的MyApi 中用作DefinitionBody。这样您就可以指定它使用 LAMBDA 集成而不是 LAMBDA_PROXY 集成。不要忘记更新 swagger 定义,使其使用 cloudformation 中创建的函数,而不是导出 API 时存在的函数。

话虽如此,LAMBDA_PROXY 方式使用更广泛,并且无需在 API 网关中进行模板映射。它也是 HTTP API (API Gateway v2) 中唯一支持的 lambdas 集成类型,比经典的 REST API 便宜很多。

【讨论】:

  • 当我运行 sam 模板并使用邮递员访问 api 端点时,我得到了internal server error,这是我认为应该配置方法响应或集成响应的主要原因,你认为错误是因为这个?
  • 可能是的,通过 LAMBDA_PROXY 集成发送到 lambda 的有效负载非常不同。因此,如果您的 lambda 代码由于负载的这种变化而出错,这可能会导致您的 API 中出现内部服务器错误响应。
  • 所以我无法将 SAM 用于 api-gateway,我有什么替代方案?
  • 是的,就像我在上面的答案中所说的那样,您可以在 MyApi 中定义 DefinitionBody 并且 SAM 不会自己构建主体。
猜你喜欢
  • 2018-05-17
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多