堆栈故障选项 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

堆栈故障选项

遇到预置失败时,您可以从故障点开始迭代开发应用程序,而无需回滚成功预置的资源。通过指定堆栈故障选项,您可以对处于 CREATE_FAILEDUPDATE_FAILED 状态的资源进行故障排除。您可以为所有堆栈部署和更改集操作预置故障选项。

  • 创建操作设置为 Preserve successfully provisioned resources(保留成功预置的资源)将保留成功资源的状态,而失败的资源将保持失败状态,直到执行下一次更新操作。

  • 更新和更改集操作设置为 Preserve successfully provisioned resources(保留成功预置的资源)将保留成功资源的状态,同时将失败的资源回滚到上一个已知的稳定状态。失败的资源将处于 UPDATE_FAILED 状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时删除。

有关暂停回滚失败资源的更多详细信息,请参阅以下各节:

堆栈故障选项概述

在从 Amazon CloudFormation 控制台、API 或 Amazon Command Line Interface(Amazon CLI)发出操作之前,请指定预置资源失败的行为。然后,继续进行资源的部署过程,无需进行任何其他修改。如果发生操作故障,CloudFormation 会在每条独立预置路径中的第一个故障处停止。CloudFormation 识别资源之间的依赖关系以并行处理独立的预置操作。然后继续在每条独立的预置路径上预置资源,直到遇到故障。一条路径中的故障不会影响其他预置路径。CloudFormation 将继续预置资源,直到完成或因其他故障而停止。

修复任何问题以继续部署过程。CloudFormation 在对之前无法成功预置的资源重试预置操作之前执行必要的更新。您可以通过提交 Retry(重试)、Update(更新)或 Roll back(回滚)操作来修复问题。例如,如果您预置 Amazon EC2 实例并且 EC2 实例在创建操作期间失败,您可能想要调查错误,而不是立即回滚失败的资源。您可以查看系统状态检查和实例状态检查,然后在问题解决后选择 Retry(重试)操作。

如果堆栈操作失败,并且您已从 Stack failure options(堆栈故障选项)菜单中指定 Preserve successfully provisioned resources(保留成功预置的资源),您可以选择以下选项。

  • Retry(重试)- 重试失败资源的预置操作并继续预置模板,直到堆栈操作成功完成或下一次失败。如果资源由于不需要修改模板的问题(例如 Amazon Identity and Access Management(IAM)权限)而无法预置,请选择此选项。

  • Update(更新)- 已预置的资源在模板更新时进行更新。将重试未能创建或更新的资源。如果由于模板错误而无法预置资源,并且您已修改模板,请选择此选项。更新处于 FAILED 状态的堆栈时,必须为 Stack failure options(堆栈故障选项)选择 Preserve successfully provisioned resources(保留成功预置的资源)才能继续更新您的堆栈。

  • Roll back(回滚)- CloudFormation 将堆栈回滚到上一个已知的稳定状态。

暂停堆栈回滚的条件

要暂停堆栈中失败资源的回滚,必须满足以下条件。

  • 在堆栈操作期间,必须指定 Preserve successfully provisioned resources(保留成功预置的资源)参数。有关回滚行为的更多信息,请参阅设置 Amazon CloudFormation 堆栈选项

  • 堆栈操作的堆栈状态必须为 CREATE_FAILEDUPDATE_FAILED。有关堆栈状态的信息,请参阅堆栈状态代码

注意

不支持不可变的更新类型。

保留成功预置的资源(控制台)

Create stack
在创建堆栈操作期间保留成功预置的资源
  1. 登录到 Amazon Web Services Management Console 并打开 Amazon CloudFormation 控制台 https://console.aws.amazon.com/cloudformation

  2. 选择 Create stack(创建堆栈),然后选择 With new resources (standard)[使用新资源(标准)]。

  3. Specify template (指定模板) 页面上,使用以下选项之一选择堆栈模板:

    • 模板准备就绪

    • 使用示例模板

    • 在 Designer 中创建模板

    接受您的设置并选择 Next(下一步)。

  4. Specify stack details(指定堆栈详细信息)页面上,在 Stack name(堆栈名称)框中输入堆栈名称。

  5. Parameters(参数)部分中,指定在堆栈模板中定义的参数。

    您可使用或更改带默认值的任何参数。

  6. 如果对参数值满意,选择 Next(下一步)。

  7. Configure stack options(配置堆栈选项)页面上,可以设置堆栈的其他选项。

  8. 对于 Stack failure options(堆栈故障选项),选择 Preserve successfully provisioned resources(保留成功预置的资源)。

  9. 如果对堆栈选项满意,选择 Next(下一步)。

  10. Review(审核)页面上查看堆栈,然后选择 Create stack(创建堆栈)。

结果:创建失败的资源将堆栈状态转换为 CREATE_FAILED,以防止堆栈操作遇到故障时堆栈回滚。成功预置的资源处于 CREATE_COMPLETE 状态。您可在 Stack events(堆栈事件)选项卡中监控堆栈。

Update stack
在更新堆栈操作期间保留成功预置的资源
  1. 登录到 Amazon Web Services Management Console 并打开 Amazon CloudFormation 控制台 https://console.aws.amazon.com/cloudformation

  2. 选择要更新的堆栈,然后选择 Update(更新)。

  3. Update stack(更新堆栈)页面上,使用以下选项之一选择堆栈模板:

    • 使用当前模板

    • 替换当前模板

    • 在设计器中编辑模板

    接受您的设置并选择 Next(下一步)。

  4. Specify stack details(指定堆栈详细信息)页面上,指定在堆栈模板中定义的参数。

    您可使用或更改带默认值的任何参数。

  5. 如果对参数值满意,选择 Next(下一步)。

  6. Configure stack options(配置堆栈选项)页面上,可以设置堆栈的其他选项。

  7. 对于 Behavior on provisioning failure(预置失败时的行为),选择 Preserve successfully provisioned resources(保留成功预置的资源)。

  8. 如果对堆栈选项满意,选择 Next(下一步)。

  9. Review(查看)页面上查看堆栈,然后选择 Update stack(更新堆栈)。

结果:更新失败的资源将堆栈状态转换为 UPDATE_FAILED,并回滚到上一个已知的稳定状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时被 CloudFormation 删除。成功预置的资源处于 CREATE_COMPLETEUPDATE_COMPLETE 状态。您可在 Stack events(堆栈事件)选项卡中监控堆栈。

Change set
注意

您可以为状态为 CREATE_FAILEDUPDATE_FAILED 的堆栈启动更改集,但不能为状态为 UPDATE_ROLLBACK_FAILED 的堆栈启动更改集。

在更改集操作期间保留成功预置的资源
  1. 登录到 Amazon Web Services Management Console 并打开 Amazon CloudFormation 控制台 https://console.aws.amazon.com/cloudformation

  2. 选择包含要启动的更改集的堆栈,然后选择 Change sets(更改集)选项卡。

  3. 选择更改集,然后选择 Execute(执行)。

  4. 对于 Execute change set(执行更改集),选择 Preserve successfully provisioned resources(保留成功预置的资源)选项。

  5. 选择 Execute change set(执行更改集)。

结果:更新失败的资源将堆栈状态转换为 UPDATE_FAILED,并回滚到上一个已知的稳定状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时被 CloudFormation 删除。成功预置的资源处于 CREATE_COMPLETEUPDATE_COMPLETE 状态。您可在 Stack events(堆栈事件)选项卡中监控堆栈。

保留成功预置的资源(Amazon CLI)

Create stack
在堆栈创建操作期间保留成功预置的资源

create-stack 操作期间指定 disable-rollback 选项或 on-failure DO_NOTHING 枚举。

  1. create-stack 命令提供堆栈名称和模板并采用 disable-rollback 选项。

    aws cloudformation create-stack --stack-name myteststack --template-body file://DOC-EXAMPLE-BUCKET.json --disable-rollback

    该命令将返回以下输出。

    {
        "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
    }
  2. 使用 describe-stacks 选项描述堆栈的状态。

    aws cloudformation describe-stacks --stack-name myteststack

    该命令将返回以下输出。

    {
        "Stacks":  [
            {
                "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
                "Description": "AWS CloudFormation Sample Template",
                "Tags": [],
                "Outputs": [],
                "StackStatusReason": “The following resource(s) failed to create: [MyBucket]”,
                "CreationTime": "2013-08-23T01:02:15.422Z",
                "Capabilities": [],
                "StackName": "myteststack",
                "StackStatus": "CREATE_FAILED",
                "DisableRollback": true
            }
        ]
    }
Update stack
在堆栈更新操作期间保留成功预置的资源
  1. update-stack 命令提供现有堆栈名称和模板并采用 disable-rollback 选项。

    aws cloudformation update-stack --stack-name myteststack --template-url DOC-EXAMPLE-BUCKET.template --disable-rollback

    该命令将返回以下输出。

    {
        "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
    }
  2. 使用 describe-stacksdescribe-stack-events 选项描述堆栈的状态。

    aws cloudformation describe-stacks --stack-name myteststack

    该命令将返回以下输出。

    {
        "Stacks":  [
            {
                "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
                "Description": "AWS CloudFormation Sample Template",
                "Tags": [],
                "Outputs": [],
                "CreationTime": "2013-08-23T01:02:15.422Z",
                "Capabilities": [],
                "StackName": "myteststack",
                "StackStatus": "UPDATE_COMPLETE",
                "DisableRollback": true
            }
        ]
    }
Change set
注意

您可以为状态为 CREATE_FAILEDUPDATE_FAILED 的堆栈启动更改集,但不能为状态为 UPDATE_ROLLBACK_FAILED 的堆栈启动更改集。

在更改集操作期间保留成功预置的资源

execute-change-set 操作期间指定 disable-rollback 选项。

  1. execute-change-set 命令提供堆栈名称和模板并采用 disable-rollback 选项。

    aws cloudformation execute-change-set --stack-name myteststack --change-set-name my-change-set --template-body file://template.yaml

    该命令将返回以下输出。

    {
     "Id": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/my-change-set/bc9555ba-a949-xmpl-bfb8-f41d04ec5784",
     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
    }
  2. 启动更改集并采用 disable-rollback 选项。

    aws cloudformation execute-change-set --stack-name myteststack --change-set-name my-change-set -–disable-rollback
  3. 使用 describe-stacksdescribe-stack-events 选项确定堆栈的状态。

    { "StackEvents": [ { "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896", "EventId": "49c966a0-7b74-11ea-8071-024244bb0672", "StackName": "myteststack", "LogicalResourceId": " MyBucket", "PhysicalResourceId": "MyBucket", "ResourceType": "AWS::S3::Bucket", "Timestamp": "2020-04-10T21:43:17.015Z", "ResourceStatus": "UPDATE_FAILED" "ResourceStatusReason": "User XYZ is not allowed to perform S3::UpdateBucket on MyBucket" } }
  4. 修复权限错误并重试该操作。

    aws cloudformation update-stack --stack-name myteststack --use-previous-template --disable-rollback

    该命令将返回以下输出。

    {
        "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
    }
  5. 使用 describe-stacksdescribe-stack-events 选项描述堆栈的状态。

    aws cloudformation describe-stacks --stack-name myteststack

    该命令将返回以下输出。

    {
        "Stacks":  [
            {
                "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
                "Description": "AWS CloudFormation Sample Template",
                "Tags": [],
                "Outputs": [],
                "CreationTime": "2013-08-23T01:02:15.422Z",
                "Capabilities": [],
                "StackName": "myteststack",
                "StackStatus": "UPDATE_COMPLETE",
                "DisableRollback": true
            }
        ]
    }

回滚堆栈

从 CREATE_FAILED 或 UPDATE_FAILED 堆栈状态回滚堆栈

指定 rollback-stack 操作以将堆栈回滚到其上一个稳定状态。

  • 使用 rollback-stack 操作启动回滚并指定堆栈名称。

    aws cloudformation rollback-stack --stack-name myteststack

    该命令将返回以下输出。

    {
        "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
    }
注意

如果堆栈不包含上一个已知的稳定状态,则 rollback-stack 操作将删除该堆栈。