问题描述
我有一个带有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控制台上的响应的屏幕截图:
如您所见,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"}