Amazon cloudformation 如何使用CloudFormation在CodeDeploy中设置自动回滚?

Amazon cloudformation 如何使用CloudFormation在CodeDeploy中设置自动回滚?,amazon-cloudformation,rollback,aws-code-deploy,Amazon Cloudformation,Rollback,Aws Code Deploy,我正在使用CloudFormation模板在CodeDeploy中创建一个部署组。 部署组已成功创建,应用程序部署得非常好 我定义的CF资源(类型:AWS::CodeDeploy::DeploymentGroup)具有“Deployment”属性集。问题是,我想为此部署配置自动回滚,但根据“AutoRollbackConfiguration”属性的CF文档:“有关与部署组关联的自动回滚配置的信息。如果指定此属性,请不要指定部署属性。” 所以我的理解是,如果我指定“部署”,我就不能设置“自动回滚配

我正在使用CloudFormation模板在CodeDeploy中创建一个部署组。 部署组已成功创建,应用程序部署得非常好

我定义的CF资源(
类型:AWS::CodeDeploy::DeploymentGroup
)具有“Deployment”属性集。问题是,我想为此部署配置自动回滚,但根据“AutoRollbackConfiguration”属性的CF文档:“有关与部署组关联的自动回滚配置的信息。如果指定此属性,请不要指定部署属性。

所以我的理解是,如果我指定“部署”,我就不能设置“自动回滚配置”。。。那么,您应该如何为部署配置任何回滚?我没有看到任何其他与回滚相关的资源属性

我是否应该创建第二个DeploymentGroup资源并将其绑定到原始部署组拥有的相同实例?我不确定这是否可行或有意义,但我已经没有选择了

谢谢,
Nicolas

首先,我想描述一下为什么不能同时指定部署和回滚配置:

无论何时直接为组指定部署,都已声明要部署的版本。这与CloudFormation的想法相冲突,即由它管理资源,而不影响这些资源的实际配置

我建议如下:

  • 使用CloudFormation部署“底层”基础架构(部署组、应用程序、角色、实例等)
  • 在此基础架构模板内创建一个CodePipline,然后该模板包含一个CodeDeploy部署操作(,)
  • 只要修订位置中有新版本,就可以触发管道
  • 这种方法清楚地将底层内容(不会动态更改)与实际应用程序部署(使用适当的管道完成)分开


    另外,通过这种方式,您可以指定如何部署(绿色/蓝色,金丝雀色)以及如何/何时处理回滚。您的部署状态也可以在CodePipeline中看到。

    我没有提到,但您对CodePipeline的建议正是我所做的

    事实上,我有一个CloudFormation模板,它创建了所有的基础设施,包括DeploymentGroup。这样,应用程序将首次部署到我的EC2实例

    然后,我有另一个用于CI/CD目的的CF模板,其中包含引用先前DeploymentGroup的CodeDeploy阶段/操作。每当我将一些代码推送到存储库时,就会触发管道,生成代码并将新版本成功部署到实例中

    但是,我看不到在任何CF模板中如何/在何处处理/配置DeploymentGroup的回滚,正如您所说的。我想我理解了您关于CF在发生漂移时可能产生的冲突的解释,但我的印象是,如果在CF堆栈创建过程中出现错误,CF回滚应该删除您尝试创建的DeploymentGroup。换句话说,对于我来说,该场景中没有涉及CodeDeploy部署回滚,只是删除了CF试图创建的资源(DeploymentGroup)

    给我留下深刻印象的是,您可以通过AWS控制台启用/禁用DeploymentGroup的自动回滚。只需编辑并转到DeploymentGroup的高级配置,您就有了一个复选框。我尝试了一下,再次触发了管道,效果非常好。我做了一个错误的更改以使部署失败,然后CodeDeploy自动恢复到我的应用程序的早期版本。。。完全预期的行为。这个简单的boolean/flag选项在CF中不可用,这没有多大意义

    希望这有意义,有助于澄清我目前的处境。任何额外的帮助都将不胜感激。
    再次感谢

    感谢您的回复f7o。我在下面添加了一些信息和想法以进一步讨论。据我所知,您将
    Deployment
    属性包含在CF模板内的
    DeploymentGroup
    中,以便直接从CF堆栈进行第一次部署。但是有没有理由不让CodeDeploy操作在最后部署第一个版本呢。然后可以省略CF中的部署部分,输入布尔值
    true
    以自动回滚,然后仅使用CodePipeline和CodeDeploy操作部署应用程序。是的,总是有一种解决CF的方法,之后手动更改某些内容。只是当您不再存在时,让其他人很难进行故障排除:)这与CF回滚本身无关。只有当实际基础架构中的更改出错时,CF才应该回滚。您所理解的正是我所做的,不仅是第一次部署,而且是将来的部署。对不起,我不接受你的建议。在某些地方,您必须定义一个DeploymentGroup来描述您的部署,并由CodePipeline引用。定义它的那一刻,默认情况下会触发部署,因此我不知道如何避免这种情况,而是让管道的部署操作来执行。您提到在CF中省略了部署部分,但是必须定义一个由管道指向的部署。。。您是否建议手动创建CodeDeploy…然后将其与CodePipeline绑定?如果是这样的话,以我的拙见,我认为这不是很有效。另外,如果该管道的部署操作设置为回滚,那么谁将在CICD中执行真正的部署?底线是,我需要的一切都可以正常工作,只是缺少了可以通过控制台手动设置的自动回滚功能。所以我真的很怀疑AWS的人会错