AWS :: APIGateway :: Метод удаляется при каждом развертывании

#amazon-web-services #amazon-cloudformation #aws-codepipeline

#amazon-web-services #aws-cloudformation #aws-codepipeline

Вопрос:

У меня был кодовый конвейер с шаблоном cloudformation. Я создаю AWS :: APIGateway ::Resource и AWS :: APIGateway ::Method для доступа к корзине S3. В первый раз он создает метод с помощью API. Но когда я вношу изменения в репозиторий и он выполняет повторное развертывание, метод удаляется.

Я не могу, в чем причина. У кого-нибудь есть какие-то подсказки! Спасибо!

 QrResource:
    Type: "AWS::ApiGateway::Resource"
    Properties:
      ParentId:
        Fn::GetAtt:
          - "myApi"
          - "RootResourceId"
      RestApiId: !Ref myApi
      PathPart: "qr"
  QrItemResource:
    Type: "AWS::ApiGateway::Resource"
    Properties:
      ParentId: !Ref QrResource
      RestApiId: !Ref myApi
      PathPart: "{item}"
  Qr:
    Type: "AWS::ApiGateway::Method"
    Properties:
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      RequestParameters:
        method.request.header.Content-Disposition: false
        method.request.header.Content-Type: false
        method.request.header.Accept: false
        method.request.path.item: true
      MethodResponses:
        - StatusCode: 200
          ResponseParameters:
            method.response.header.Content-Type: integration.response.header.Content-Type
            method.response.header.Content-Disposition: integration.response.header.Content-Disposition
            method.response.header.Accept-Ranges: integration.response.header.Accept-Ranges
          ResponseModels:
            "application/json": EmptyModel
        - StatusCode: 403
          ResponseModels:
            "application/json": ErrorModel
      RestApiId: !Ref myApi
      ResourceId: !Ref QrItemResource
      Integration:
        Type: AWS
        Credentials: !Ref RoleApi
        IntegrationHttpMethod: GET
        PassthroughBehavior: WHEN_NO_MATCH
        IntegrationResponses:
          - StatusCode: 200
            SelectionPattern: 200
            ContentHandling: CONVERT_TO_BINARY
            ResponseParameters:
              method.response.header.Content-Type: integration.response.header.Content-Type
              method.response.header.Accept-Ranges: "'bytes'"
              method.response.header.Content-Disposition: "'inline'"
            ResponseTemplates:
              "application/json": ""
        RequestParameters:
          integration.request.header.Content-Disposition: method.request.header.Content-Disposition
          integration.request.header.Content-Type: method.request.header.Content-Type
          integration.request.header.Accept: method.request.header.Accept
          integration.request.path.item: method.request.path.item
        Uri: arn:aws:apigateway:us-east-1:s3:path/s3-bucket/{item}
  

Комментарии:

1. Отступ файла YAML выглядит неверно. Согласно приведенному здесь YAML, QrItemResource и Qr вложены в QrResource . Таков ваш исходный файл YAML?

2. в исходном yaml отступ правильный. QrItemResource — это вложенный QrResource, а Qr — это метод доступа к S3. Я хочу, чтобы конечной точкой был /qr/{item}

3. Можете ли вы проверить в консоли CFN, какие сообщения? Какие-либо ошибки? Что именно заменяется? Некоторые обновления потребуют замены исходного ресурса.

4. Я проверил консоль, ошибок нет. Впервые /qr/{item} был создан как конечная точка. Он добавил как ресурс, так и метод. Во второй раз я добавил новую лямбда-функцию. Он создал новую конечную точку для лямбда-функции с удаленным /qr/{item} . Но в журнале указано: для ресурса «замена»: «Условный», для меня «замена»: «Ложь».

Ответ №1:

У меня была такая же проблема, поэтому я открыл заявку в службе поддержки AWS. Это был их ответ:

 Customer is using Serverless Application Model(SAM) (AWS::Serverless::Api AWS::Serverless::Function) resources along with API Gateway CFN Resources (AWS::ApiGateway::Method) to define their API. 
This can have unpredictable situation where first can overwrite the second. We highly recommend customer to define this new resources in SAM directly under AWS::Serverless::Api as part of OpenApi. 
  

Во-первых, я посчитал это ошибкой, поскольку having unpredictable situations where first can overwrite the second ни для кого не похоже на желаемое поведение.

Но позже они объяснили мне, что AWS::Serverless::Api создает все необходимые ресурсы (например AWS::APIGateway::RestApi ) для подключения всего.

Итак, если вы вносите изменения, при которых изменяются все ресурсы ( AWS::Serverless::Api , AWS::ApiGateway::Resource и AWS::ApiGateway::Method ), Cloudformation применит эти изменения в определении OpenAPI, и все будет работать так, как ожидалось.

С другой стороны, если вы вносите изменения в AWS::Serverless::Api (например, добавляете AWS::Serverless::Function прикрепленный к AWS::Serverless::Api ), Cloudformation не обнаружит изменений в AWS::ApiGateway::Resource и AWS::ApiGateway::Method (поэтому определение AWS::Serverless::Api OpenAPI перезапишет ваши автономные методы и путь).

Похоже, у них нет возможности проверить эти конфликты на своей стороне, что имеет немного больше смысла.

Итак, в конце концов, решение состоит в том, чтобы не смешивать AWS::Serverless::Api с автономными AWS::ApiGateway ресурсами (например AWS::ApiGateway::Method , и AWS::ApiGateway::Resource ).

Фактически, они сказали мне, что собираются обновить свою документацию, чтобы добавить эту рекомендацию. (похоже, что он еще не был запущен, но мы можем найти историю документации здесь)