Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门。堆栈故障选项
在遇到预置故障时,您可以迭代开发应用程序,方法是从故障点开始,而不回滚成功配置的资源。通过指定堆栈故障选项,可以对处于 CREATE_FAILED 或 UPDATE_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 将堆栈回滚到最后一个已知的稳定状态。
暂停堆栈回滚的条件
要暂停回滚堆栈中故障的资源,必须满足以下条件。
保留成功预置的资源(控制台)
- Create stack
-
在创建堆栈操作期间保留成功预置的资源
通过以下网址登录 Amazon Web Services Management Console并打开 Amazon CloudFormation 控制台:https://console.amazonaws.cn/cloudformation。
-
选择 Create stack (创建堆栈),然后选择 With new resources (standard) (使用新资源 (标准))。
-
在 Specify template (指定模板) 页面上,使用以下选项之一选择堆栈模板:
-
模板准备就绪
-
使用示例模板
-
在 Designer 中创建模板
接受您的设置并选择 Next (下一步)。
-
在 Specify stack details (指定堆栈详细信息) 页面上,在 Stack name (堆栈名称) 框中输入堆栈名称。
-
在 Parameters (参数) 部分中,指定在堆栈模板中定义的参数。
您可使用或更改带默认值的任何参数。
-
确认参数值没有问题后,请选择 Next (下一步)。
-
在 Configure stack options (配置堆栈选项) 页面上,您可以为堆栈设置其他选项。
-
对于 Stack failure options (堆栈故障选项),请选择 Preserve successfully provisioned resources (保留成功预置的资源)。
-
确认堆栈选项么有问题后,选择 Next (下一步)。
-
在 Review (审核) 页面上查看您的堆栈,然后选择 Create stack (创建堆栈)。
结果:创建失败的资源会将堆栈状态转换为 CREATE_FAILED,防止堆栈操作遇到故障时回滚。成功预置的资源处于 CREATE_COMPLETE 状态。您可以在 Stack events (堆栈事件) 选项卡中监控堆栈。
- Update stack
-
在更新堆栈操作期间保留成功预置的资源
通过以下网址登录 Amazon Web Services Management Console并打开 Amazon CloudFormation 控制台:https://console.amazonaws.cn/cloudformation。
-
选择要更新的堆栈,然后选择 Update (更新)。
-
在 Update stack (更新堆栈) 页面上,使用以下选项之一选择堆栈模板:
接受您的设置并选择 Next (下一步)。
-
在 Specify stack details (指定堆栈详细信息) 页面上,指定在堆栈模板中定义的参数。
您可使用或更改带默认值的任何参数。
-
确认参数值没有问题后,请选择 Next (下一步)。
-
在 Configure stack options (配置堆栈选项) 页面上,您可以为堆栈设置其他选项。
-
对于 Behavior on provisioning failure (预置故障的行为),请选择 Preserve successfully provisioned resources (保留成功预置的资源)。
-
确认堆栈选项么有问题后,选择 Next (下一步)。
-
在 Review (审核) 页面上审核堆栈,然后选择 Update stack (更新堆栈)。
结果:更新失败的资源会将堆栈状态转换为 UPDATE_FAILED 并回滚到上一个已知稳定状态。CloudFormation 将在下次堆栈操作时删除没有上一个已知稳定状态的资源。成功预置的资源处于 CREATE_COMPLETE 或 UPDATE_COMPLETE 状态。您可以在 Stack events (堆栈事件) 选项卡中监控堆栈。
- Change set
-
您可以为状态为 CREATE_FAILED 或 UPDATE_FAILED 的堆栈启动更改集,但不能启动状态为 UPDATE_ROLLBACK_FAILED 的更改集。
在更改集操作期间保留成功预置的资源
通过以下网址登录 Amazon Web Services Management Console并打开 Amazon CloudFormation 控制台:https://console.amazonaws.cn/cloudformation。
-
选择包含要启动的更改集的堆栈,然后选择 Change sets (更改集) 选项卡。
-
选择更改集,然后选择 Execute (执行)。
-
对于 Execute change set (执行更改集),选择 Preserve successfully provisioned resources (保留成功预置的资源) 选项。
-
选择 Execute change set (执行更改集)。
结果:更新失败的资源会将堆栈状态转换为 UPDATE_FAILED 并回滚到上一个已知稳定状态。CloudFormation 将在下次堆栈操作时删除没有上一个已知稳定状态的资源。成功预置的资源处于 CREATE_COMPLETE 或 UPDATE_COMPLETE 状态。您可以在 Stack events (堆栈事件) 选项卡中监控堆栈。
保留成功预置的资源(Amazon CLI)
- Create stack
-
在堆栈创建操作期间保留成功预置的资源
在创建堆栈操作期间指定 disable-rollback 选项或 on-failure DO_NOTHING 枚举。
-
使用 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"
}
-
使用 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 枚举。
-
使用 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"
}
-
使用 describe-stacks 或 describe-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_FAILED 或 UPDATE_FAILED 的堆栈启动更改集,但不能启动状态为 UPDATE_ROLLBACK_FAILED 的更改集。
在更改集操作期间保留成功预置的资源
在 execute-change-set 操作期间指定 disable-rollback 选项或 on-failure DO_NOTHING 枚举。
-
使用 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"
}
-
使用 disable-rollback 选项启动更改集。
aws cloudformation execute-change-set --stack-name myteststack --change-set-name my-change-set -–disable-rollback
-
使用 describe-stacks 或 describe-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"
}
}
-
修复权限错误并重试该操作。
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"
}
-
使用 describe-stacks 或 describe-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 操作将删除该堆栈。