【问题标题】:How to change AWS API Gateway default responses with SAM template?如何使用 SAM 模板更改 AWS API Gateway 默认响应?
【发布时间】:2020-12-16 06:21:44
【问题描述】:

我有一个带有 AWS API Gateway 和 Go Lambda 函数的 API。

我有一个问题,每次我部署新版本的 SAM 时,它都会覆盖 API 网关上的网关响应。

我尝试将其放入 SAM 模板,但它似乎不起作用或我没有正确执行。

这是 SAM 模板:

Resources:
  MyGateway:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        DefaultAuthorizer: AdminTokenAuthorizer
        AddDefaultAuthorizerToCorsPreflight: False
        Authorizers:
          AdminTokenAuthorizer:
            FunctionArn: !GetAtt AdminAuthorizerFunction.Arn
          DeviceTokenAuthorizer:
            FunctionArn: !GetAtt DeviceAuthorizerFunction.Arn
  GatewayResponseDefault4XX:
    Type: 'AWS::ApiGateway::GatewayResponse'
    Properties:
      ResponseParameters:
        gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
        gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
      ResponseType: DEFAULT_4XX
      RestApiId: !Ref MyGateway
  GatewayResponseDefaultUnauthorized:
    Type: 'AWS::ApiGateway::GatewayResponse'
    Properties:
      ResponseParameters:
        gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
        gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
      ResponseType: UNAUTHORIZED
      RestApiId: !Ref MyGateway
  GatewayResponseDefault5XX:
    Type: 'AWS::ApiGateway::GatewayResponse'
    Properties:
      ResponseParameters:
        gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
        gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
      ResponseType: DEFAULT_5XX
      RestApiId: !Ref MyGateway

这是 AWS 控制台上响应的屏幕截图:

如您所见,DEFAULT_4XX、UNAUTHORIZED 和 DEFAULT_5XX 的标题为空。

我注意到当我在模板中重命名 GatewayResponse 资源时,例如,如果我将 GatewayResponseDefault4XX 重命名为 GatewayResponseDefault4XXRename,它将为 DEFAULT_4XX 正确设置标头,但如果我更改其他内容并再次部署它而不更改 GatewayResponses 资源,它将从所有网关响应。

【问题讨论】:

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


    【解决方案1】:

    您正在混合参数。为此,您需要通过参数GatewayResponses 传递它。

    这是一个基本的例子:

    Resources:
      MyGateway:
        Type: AWS::Serverless::Api
        Properties:
          StageName: Prod
          GatewayResponses:
            Default4XX:
              ResponseTemplates: 
                "application/json": {"message": "A super different message"}
            Default5XX:
              StatusCode: 500  # You can set a the status code too
              ResponseTemplates: 
                "application/json": {"message": "And now... something different"}
    

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2022-11-11
      • 2019-08-11
      • 2020-06-23
      • 2019-09-01
      • 1970-01-01
      • 2020-06-14
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多