#amazon-web-services #aws-lambda #aws-api-gateway #aws-sam #aws-sam-cli
#amazon-web-services #aws-lambda #aws-api-gateway #aws-sam #aws-sam-cli
Вопрос:
У меня есть API с AWS API Gateway и функциями Go Lambda.
У меня возникает проблема: каждый раз, когда я развертываю новую версию 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, он удалит заголовки из всех GatewayResponses.
Ответ №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"}