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
Это делает развертывание для вас, когда он делает Преобразование