我能强制删除正在回滚中的 AWS CloudFormation 堆栈吗?

68
一个 AWS CloudFormation 回滚(例如,UPDATE_ROLLBACK_IN_PROGRESS)已经持续了很久,超过一个半小时。我想要彻底删除该堆栈或强制停止任何活动。这是否可行?
谢谢!
14个回答

58

堆栈更新/回滚被阻止的另一个常见原因是ECS::Service资源更新中的错误:看起来目前没有检测到这种情况(在某些情况下?)。Cloudformation正在等待服务事件以使服务达到稳定状态,因此只需将服务更新为有效内容(例如期望的任务数为0)即可解除阻塞。尝试将状态恢复到Cloudformation期望的状态,然后再发送更多更新以避免问题。


4
有一个类似的问题。使用Cloudformation部署:
  • 3小时无法成功部署
  • 然后再花3个小时无法成功回滚
我的问题来自于放置限制和所需计数的组合,看起来没问题,但我的服务从未稳定到达就绪状态。未达到稳定状态会锁定Cloudformation更新和回滚。感谢Simon:将所需任务计数更改为0使我能够停止Cloudformation进程。
- JLM
2
在我的情况下:两个具有重叠资源的堆栈都试图回滚但互相阻塞。将所需任务设置为0即可解决问题。 - andrew lorien
遇到了同样的问题。在我的情况下,我不得不重新创建完全相同的ECS::Service,这使回滚过程解除了阻塞。(我已经删除了它们) - lapkritinis
当,这就是它!这对于CloudFormation来说是一个如此明显的问题。AWS应该创建一个简单的解决方案,只需强制用户重新尝试即可。 - Austin Poole
在我的情况下,发生了角色变更和2个EKS部署的变更。创建了一个新的EKS集群,然后尝试使用新的角色删除旧的部署,结果出现了权限错误,现在它被卡在了UPDATE_COMPLETE_CLEANUP_IN_PROGRESS状态...我猜这种情况下没有简单的方法来强制删除堆栈吧?由于我们使用CDK,重新构建部署是不可能的,因为每个ID和名称都是自动生成的... - undefined

10
在我的情况下,有一个 EC2 安全组无法删除,因为它被另一个 EC2 安全组引用。

8
我猜您的堆栈资源已被外部更改或删除。您可以按照以下官方指南进行操作。
手动同步资源,使其与原始堆栈的模板匹配,然后继续回滚更新。例如,如果您手动删除了 AWS CloudFormation 正试图回滚到的资源,则必须使用相同的名称和属性手动创建该资源。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-update-rollback-failed

或者(如@talentedmrjones所说)

要修复堆栈,请联系AWS客户支持。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-nested-stacks-are-stuck

在我的情况下,我可以通过重新创建已删除的资源来停止相同的情况。

我们成功地保护了转发网关的生产部署。谢谢。 - Felipe Alvarez

4
处理自定义资源时,可以构建一个模拟的返回URL。最简单的方法是获取在创建过程中使用的URL。如果您能够获取到它,请将最后一个%2F后面的部分替换为“客户端请求令牌”(您可以从CloudFormation的事件日志中获取)。如果无法获取,则需要按照以下格式构造URL。
https://{region}.console.aws.amazon.com/cloudformation/home?region={region}#/stacks?filter=active&tab=events&stackId={stack arn}%2F{stack name}%2F{client request token}

将该URL作为GET运行,将导致资源失败回滚或删除。


你能否提供更多有关如何获取客户端请求令牌的信息?在自定义资源中,我只能看到“physicalID”。此外,在创建期间,如何获取使用的URL? - Stretch
2
对于自定义资源,您需要查看其中标有“CREATE_IN_PROGRESS”的行,该行也是可展开的。展开该行后,它会给出两个值:“物理 ID”和“客户端请求令牌”。您要找的是“客户端请求令牌”。 - user2981810
@user2981810 谢谢你分享这个技巧! - CJ Chang

3
使用此命令删除处于“DELETE_IN_PROGRESS”状态的堆栈。您也可以在AWS CloudShell中轻松运行此命令。
转到Lambda函数->监视器->CloudWatch日志。查找“RequestType”为“Delete”的日志,并将必要的字段复制到以下命令中。
curl -H 'Content-Type: ''' -X PUT -d '{"Status": "SUCCESS","PhysicalResourceId": "Add your physical resource ID",   "StackId": "Add your StackId","RequestId": "Add your RequestID","LogicalResourceId": "LambdaFunction"}' 'Add your ResponseURL Here'

例子:

curl -H 'Content-Type: ''' -X PUT -d '{"Status": "SUCCESS","PhysicalResourceId": "cutomRes-LambdaFunction-1NC1ORF", "StackId": "arn:aws:cloudformation:us-east-1:3343:stack/cutomRes/f52a-11eb-b5df-0a5c2cc1","RequestId": "d70931a2-364b-413e-a2","LogicalResourceId": "LambdaFunction"}' 'https://cloudformation-custom-resource-response-useast1.s3.amazonaws.com/arn%3Aaws%/cutomRes/f5466f6Expires=7200&X-Amz-Credential=AKIA6L7Q4OWT3GW5BT7K%2F20210330%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=1db1f83f'

请注意,示例包含URL,可能已被修改以确保安全性。仅用于演示目的。

2
您可以尝试删除资源,然后更新回滚将成功完成。"Original Answer"翻译成"最初的回答"。

1
我遇到了同样的问题。 控制台告诉我某些资源依赖于另一个资源,因此无法被删除。在这种情况下,回滚不可用。 我只删除了整个VPC和其中的资源。 因为CloudFormation会每10-20分钟重试删除资源。所以当它重试时,它会发现资源已经被删除,然后跳过删除操作,之后一切都很顺利。

我的回答非常好地回应了提问者的问题。通过强制删除堆栈中的某些资源,最终可以删除堆栈。提问者说:“我想彻底删除堆栈或强制停止任何活动。”这个答案正好提供了他们想要的。 - harryhare

1
有时,这可能是因为您的用户角色缺少删除角色的权限。可以尝试手动删除由CloudFormation堆栈创建的角色或用户来测试此问题。

1

我曾经遇到过类似的情况,堆栈似乎一直卡在UPDATE_ROLLBACK_IN_PROGRESS状态。我建议向AWS支持提交工单。那是我解决问题的唯一途径。


1
如果您没有付费支持计划怎么办? - Slava Fomin II

1
我能够通过AWS控制台手动删除所有内容,成功删除了我的账号。最终我发现有一些无用的角色需要删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接