Как изменить ответы AWS API Gateway по умолчанию с помощью шаблона SAM?

#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"}