Amazon web services ValidationError堆栈:arn aws cloudformation堆栈处于回滚\完成状态,无法更新

Amazon web services ValidationError堆栈:arn aws cloudformation堆栈处于回滚\完成状态,无法更新,amazon-web-services,amazon-cloudformation,amazon-ecs,Amazon Web Services,Amazon Cloudformation,Amazon Ecs,当我使用cloudformation部署时aws cloudformation部署--region$region--堆栈名ABC 出现错误: 调用CreateChangeSet时发生错误(ValidationError) 操作: 堆栈:arn:aws:cloudformation:堆栈/服务/7e1d8c70-d60f-11e9-9728-0a4501e4ce4c 处于回滚\u完成状态,无法更新 请帮帮我 当堆栈创建失败时会发生这种情况。默认情况下,堆栈将保持原位,状态为ROLLBACK\u C

当我使用cloudformation部署时
aws cloudformation部署--region$region--堆栈名ABC

出现错误:

调用CreateChangeSet时发生错误(ValidationError) 操作: 堆栈:arn:aws:cloudformation:堆栈/服务/7e1d8c70-d60f-11e9-9728-0a4501e4ce4c 处于回滚\u完成状态,无法更新


请帮帮我

当堆栈创建失败时会发生这种情况。默认情况下,堆栈将保持原位,状态为
ROLLBACK\u COMPLETE
。这意味着它已成功回滚(删除)堆栈创建的所有资源。唯一剩下的就是空堆栈本身。无法更新此堆栈;您必须手动删除它,然后才能再次尝试部署它

如果在控制台中将“故障时回滚”设置为禁用(或在CLI命令中将
--on failure
设置为
DO\u NOTHING
,如果使用
create stack
),则堆栈创建失败将导致状态为
create\u FAILED
。在故障点之前创建的任何资源都不会回滚

相反,如果您正在将更新部署到现有(成功创建)堆栈,并且更新失败但已成功回滚,则它将返回到以前的有效状态(状态为
UPDATE\u ROLLBACK\u COMPLETE
),允许您重新尝试更新



正如@SteffenOpel所指出的,您现在可以通过在CLI中将
--on failure
选项(仅用于
创建堆栈
,而不是
部署
)设置为
删除
,来指定应在发生故障时删除堆栈。撰写本文时(13/11/20),控制台中尚未提供此选项。

运行以下AWS CLI命令以删除堆栈:

aws cloudformation删除堆栈--堆栈名称

删除堆栈可能需要不到一分钟的时间,然后尝试重新部署它。

仅使用删除堆栈

aws cloudformation delete-stack --stack-name <<stack-name>>
aws cloudformation删除堆栈--堆栈名称

没用。如果您使用IAM user部署lambda函数,请确保您有创建lambda函数、s3 bucket和cloudformation堆栈的权限。

有些堆栈正在回滚,我认为必须首先完成。所以我必须先创建Maualy堆栈?或者我可以更新另一个已存在的堆栈?您可以提供更多信息,如回滚错误的原因,这将有助于社区更好地了解问题并提供解决方案。您可以从AWS控制台获得更多信息如何指定在出现故障时将其删除?@Jun711我认为内置功能不可能做到这一点。您可以在“堆栈创建选项”部分指定它是否应该在失败时回滚,但我不相信您可以告诉它在失败时自动删除。您可以做的是创建一个自定义资源,将其添加到CF模板中,该模板监视堆栈的状态,并在堆栈失败时将其删除。但是通常你会想调查失败的原因,所以我认为自动删除它不是一个好主意。通过使用resp指定
delete
,可以在失败时自动删除堆栈
--on failure
选项(语义上取代了
--disable rollback
)-虽然控制台中似乎没有显示此更新且更灵活的选项,但它可以通过API操作和AWS CLI操作使用。只需提醒一下OP正在使用
AWS cloudformation deploy
,不创建堆栈
deploy
不允许您设置
--on failure
,因此如果无法创建堆栈,您必须手动删除堆栈@你是说反之亦然?该OP正在使用create stack?仅当您的区域与CLI命令一致时,此操作才有效-如果您使用此命令会得到某种空列表,请不要担心-只需登录到web控制台,转到正确的区域,然后从中删除。当然,这不是实现这一点的最佳方式,但至少在上述输入无法解决问题的情况下,它解决了问题