如何使用SAM模板更改AWS API Gateway默认响应?

问题描述

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

我遇到一个问题,每次我部署新版本的SAM时,都会在API Gateway上覆盖Gateway响应。

我试图将其放入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控制台上的响应的屏幕截图:

enter image description here

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

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

解决方法

您正在混合参数。为此,您需要通过参数 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"}