CloudFormation не развертывается на этапах шлюза API при обновлении

Когда я запускаю CloudFormation deploy с использованием шаблона с ресурсами API Gateway, при первом запуске он создает и развертывает на этапах. В последующие промежутки времени я запускаю его, он обновляет ресурсы, но не развертывает их на этапы.

Является ли это поведением, как предполагалось? Если да, как я могу его развернуть на этапы всякий раз, когда он обновляется?

(Terraform упоминает аналогичную проблему: https://github.com/hashicorp/terraform/issues/6613)

Ответ 1

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

Один из способов обойти это - использовать пользовательский ресурс с поддержкой Lambda (см. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html).

Lambda должен создать новое развертывание, только если один из ваших ресурсов обновлен. Чтобы определить, был ли обновлен один из ваших ресурсов,
вам, вероятно, придется реализовать пользовательскую логику вокруг этого вызова API: http://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeStackEvents.html

Чтобы инициировать обновления в вашем пользовательском ресурсе, я предлагаю вам предоставить параметр облачной информации, который будет использоваться для принудительного обновления вашего пользовательского ресурса (например, текущего времени или номера версии).

Обратите внимание, что вам придется добавить предложение DependsOn в свой пользовательский ресурс, который будет включать все ресурсы, относящиеся к вашему API. В противном случае развертывание может быть создано до обновления всех ресурсов API.

Надеюсь, что это поможет.

Ответ 2

CloudFormation в словах Амазонки это:

AWS CloudFormation заботится о предоставлении и настройке этих ресурсов для вас http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html

Перераспределение API-интерфейсов не является задачей обеспечения... Это действие по продвижению, являющееся частью этапа выпуска программного обеспечения.

AWS CodePipeline - это служба непрерывной доставки, которую вы можете использовать для моделирования, визуализации и автоматизации действий, необходимых для выпуска вашего программного обеспечения. http://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html

CodePipeline также поддерживает выполнение лямбда-функций из действий в конвейере. Итак, как было сказано ранее, создайте функцию Lambda для развертывания вашего API, но вызывайте ее из Codepipeline вместо CloudFormation.

Обратитесь к этой странице за подробностями: http://docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html

Ответ 3

Если в вашем шаблоне указано развертывание, CloudFormation создаст это развертывание, только если оно еще не существует. Когда вы пытаетесь запустить его снова, он обнаруживает, что развертывание все еще существует, поэтому он не будет воссоздавать его, и, следовательно, не будет развертывания. Вам нужен новый идентификатор ресурса для развертывания, чтобы он создал новое развертывание. Прочитайте это для получения дополнительной информации: https://currentlyunnamed-theclassic.blogspot.com/2018/12/mastering-cloudformation-for-api.html

Ответ 4

Из публикации в блоге, связанной с TheClassic (лучший ответ на данный момент!), Вы должны помнить, что если вы не генерируете свои шаблоны с чем-то, что может вставить действительную временную метку вместо $ TIMESTAMP $, вы должны обновить ее вручную с отметкой времени или другим уникальным идентификатором. Вот мой функциональный пример: он успешно удаляет существующее развертывание и создает новое, но мне придется обновлять эти уникальные значения вручную, когда я хочу создать другой набор изменений:

    rDeployment05012019355:
        Type: AWS::ApiGateway::Deployment
        DependsOn: rApiGetMethod
        Properties:
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
            StageName: !Ref pStageName

    rCustomDomainPath:
        Type: AWS::ApiGateway::BasePathMapping
        DependsOn: [rDeployment05012019355]
        Properties:
            BasePath: !Ref pPathPart
            Stage: !Ref pStageName
            DomainName:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-CustomDomainName'
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'

Ответ 5

Используйте SAM

AWS :: Serverless :: Api

Это делает развертывание для вас, когда он делает Преобразование