选择预置资源时如何处理失败
如果堆栈操作失败,您无需每次都回滚已成功预置的资源并从头开始。相反,您可以对处于 CREATE_FAILED
或 UPDATE_FAILED
状态的资源进行问题排查,然后出现问题的位置恢复预置。
要执行操作,必须启用“保留已成功预置的资源”选项。此选项适用于所有堆栈部署和更改集操作。
堆栈故障选项概述
在从 CloudFormation 控制台、API 或 AWS CLI 发出操作之前,请指定预置资源失败时的行为。然后,继续进行资源的部署过程,无需进行任何其他修改。如果发生操作故障,CloudFormation 会在每条独立预置路径中的第一个故障处停止。CloudFormation 识别资源之间的依赖关系以并行处理独立的预置操作。然后继续在每条独立的预置路径上预置资源,直到遇到故障。一条路径中的故障不会影响其他预置路径。CloudFormation 将继续预置资源,直到完成或因其他故障而停止。
修复任何问题以继续部署过程。CloudFormation 在对之前无法成功预置的资源重试预置操作之前执行必要的更新。您可以通过提交 Retry(重试)、Update(更新)或 Roll back(回滚)操作来修复问题。例如,如果您预置 Amazon EC2 实例并且 EC2 实例在创建操作期间失败,您可能想要调查错误,而不是立即回滚失败的资源。您可以查看系统状态检查和实例状态检查,然后在问题解决后选择 Retry(重试)操作。
如果堆栈操作失败,并且您已从 Stack failure options(堆栈故障选项)菜单中指定 Preserve successfully provisioned resources(保留成功预置的资源),您可以选择以下选项。
-
Retry(重试)- 重试失败资源的预置操作并继续预置模板,直到堆栈操作成功完成或下一次失败。如果资源由于不需要修改模板的问题(例如 AWS Identity and Access Management(IAM)权限)而无法预置,请选择此选项。
-
Update(更新)- 已预置的资源在模板更新时进行更新。将重试未能创建或更新的资源。如果由于模板错误而无法预置资源,并且您已修改模板,请选择此选项。更新处于 FAILED
状态的堆栈时,必须为 Stack failure options(堆栈故障选项)选择 Preserve successfully provisioned resources(保留成功预置的资源)才能继续更新您的堆栈。
-
Roll back(回滚)- CloudFormation 将堆栈回滚到上一个已知的稳定状态。
暂停堆栈回滚的必需条件
要阻止 CloudFormation 自动回滚和删除已成功创建的资源,必须满足以下条件。
-
创建或更新堆栈时,必须选择保留已成功预置的资源选项。该选项会告诉 CloudFormation 不要删除已成功创建的资源,即使整个堆栈操作失败。
-
堆栈操作必须已经失败,这意味着堆栈状态为 CREATE_FAILED
或 UPDATE_FAILED
。
保留成功预置的资源(控制台)
- Create stack
-
在创建堆栈操作期间保留成功预置的资源
登录到 AWS Management Console 并打开 AWS CloudFormation 控制台 https://console.aws.amazon.com/cloudformation。
-
选择 Create stack(创建堆栈),然后选择 With new resources (standard)[使用新资源(标准)]。
-
在 Specify template (指定模板) 页面上,使用以下选项之一选择堆栈模板:
接受您的设置并选择 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
-
在更新堆栈操作期间保留成功预置的资源
登录到 AWS Management Console 并打开 AWS CloudFormation 控制台 https://console.aws.amazon.com/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
的堆栈启动更改集。
结果:更新失败的资源将堆栈状态转换为 UPDATE_FAILED
,并回滚到上一个已知的稳定状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时被 CloudFormation 删除。成功预置的资源处于 CREATE_COMPLETE
或 UPDATE_COMPLETE
状态。您可在 Stack events(堆栈事件)选项卡中监控堆栈。
保留成功预置的资源(AWS CLI)
- Create stack
-
在堆栈创建操作期间保留成功预置的资源
在 create-stack 操作期间指定 --disable-rollback
选项或 on-failure DO_NOTHING
枚举。
-
为 create-stack 命令提供堆栈名称和模板并采用 --disable-rollback
选项。
aws cloudformation create-stack --stack-name myteststack
\
--template-body file://template.yaml
\
--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
选项。
aws cloudformation update-stack --stack-name myteststack
\
--template-url https://s3.amazonaws.com/amzn-s3-demo-bucket
/updated.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
选项。
-
为 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"
}
-
启动更改集并采用 --disable-rollback
选项。
aws cloudformation execute-change-set --stack-name myteststack
\
--change-set-name my-change-set
-–disable-rollback
-
使用 describe-stacks 或 describe-stack-events 命令确定堆栈状态。
aws cloudformation describe-stack-events --stack-name myteststack
该命令将返回以下输出。
{
"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": "myteststack-MyBucket-abcdefghijk1",
"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
}
]
}
回滚堆栈
您可以使用 rolback-stack 命令将堆栈状态为 CREATE_FAILED
或 UPDATE_FAILED
的堆栈回滚到上一个稳定状态。
以下 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 操作将删除该堆栈。