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

堆栈故障选项

在遇到预置故障时,您可以迭代开发应用程序,方法是从故障点开始,而不回滚成功配置的资源。通过指定堆栈故障选项,可以对处于 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 会先执行必要的更新,然后再对之前无法成功配置的资源重试预置操作。您可以通过提交重试更新回滚操作来修复问题。例如,如果您在预置 Amazon EC2 实例,而 EC2 实例在创建操作期间故障,则可能需要调查错误,而不是立即回滚故障的资源。您可以查看系统状态检查和实例状态检查,然后在问题解决后选择重试操作。

如果堆栈操作失败,并且您已从 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.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/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

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

创建堆栈操作期间指定 disable-rollback 选项或 on-failure DO_NOTHING 枚举。

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

    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

在堆栈更新操作期间保留成功预置的资源。

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

  1. 使用 disable-rollback 选项为 update-stack 命令提供现有堆栈名称和模板。

    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 选项或 on-failure DO_NOTHING 枚举。

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

    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_FAIED 堆栈状态回滚堆栈

指定将堆栈回滚到其上一个稳定状态的 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 操作将删除该堆栈。