我可以强制删除正在进行回滚的 AWS CloudFormation 堆栈吗
Posted
技术标签:
【中文标题】我可以强制删除正在进行回滚的 AWS CloudFormation 堆栈吗【英文标题】:Can I force delete an AWS CloudFormation stack that is In Progress of Rollback 【发布时间】:2017-06-13 18:27:29 【问题描述】:AWS CloudFormation 回滚(例如,UPDATE_ROLLBACK_IN_PROGRESS)一直在进行,比如一个半小时以上。我想完全删除堆栈或强制停止任何活动。这可能吗?
谢谢!
【问题讨论】:
【参考方案1】:阻止堆栈更新/回滚的另一个常见原因是 ECS::Service 资源更新中的错误:它看起来不像当前检测到的(在某些情况下?)。 Cloudformation 正在等待服务事件以使服务达到稳定状态,因此只需将服务更新为可以工作的内容(例如,将所需任务设置为 0)即可解除阻塞。不过,在发送更多更新以避免问题之前,请尝试将状态恢复到 Cloudformation 的预期。
【讨论】:
遇到了类似的问题。使用 Cloudformation 进行部署: - 3 小时部署不成功 - 然后 3 小时再次失败回滚 我的问题来自放置约束和所需计数的组合,看起来不错,但我的服务从未稳定到就绪状态。未达到稳定状态会锁定 Cloudformation 更新和回滚。感谢 Simon:将所需的任务计数更改为 0 使我能够停止 Cloudformation 进程。 在我的例子中:两个具有重叠资源的堆栈都试图回滚但相互阻塞。将所需的任务设置为 0 修复它。 遇到了同样的问题。在我的情况下,我必须重新创建完全相同的 ECS::Service 并且它使回滚过程无法进行。 (我已经删除了它们) 当。做到了!对于云形成来说,这是一个如此突出的问题。 AWS 应该创建一个简单的解决方案,以在用户启动时强制它再次重试【参考方案2】:我猜你的堆栈资源被外部更改或删除了。 您可以找到以下官方指南。
手动同步资源,使其与原始堆栈的模板匹配,然后继续回滚更新。例如,如果您手动删除了 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
就我而言,我可以通过重新创建已删除的资源来停止同样的情况。
【讨论】:
保存了中转网关的生产部署。谢谢。【参考方案3】:在我的情况下,它是一个无法删除的 EC2 安全组,因为它是从另一个 EC2 安全组引用的。
【讨论】:
【参考方案4】:在处理自定义资源时,可以构建返回 url 的模拟版本。
最简单的方法是获取在创建过程中使用的 url。如果您可以使用它,请将最后一个 %2F 之后的部分替换为“客户端请求令牌”,您可以从 Cloudformation 的事件日志中获取该部分。
如果不是,那么这是您必须构建的 url 的格式。
https://region.console.aws.amazon.com/cloudformation/home?region=region#/stacks?filter=active&tab=events&stackId=stack arn%2Fstack name%2Fclient request token
将该 url 作为 get 运行,这将导致资源回滚或删除失败。
【讨论】:
您能否提供更多关于如何获取客户端请求令牌的信息?对于自定义资源,我只能看到“physicalID” 另外,如何获取在创建过程中使用的 url? 对于自定义资源,您需要查看显示“CREATE_IN_PROGRESS”的行,该行也是可扩展的。展开该行,它会为您提供两个值:“Physical ID”和“Client Request Token”。 “客户端请求令牌”就是您要查找的内容。【参考方案5】:您需要调查回滚究竟为何需要这么长时间(例如,是否是由于缺少在 CloudFormation 堆栈之外修改的资源,或自定义资源未能返回预期信号)。
【讨论】:
在 AWS 控制台回滚时单击堆栈时,会阻止我删除堆栈。 糟糕,我的错误,对不起!你能取消更新然后删除堆栈吗? 我能够取消正在进行的更新,因为这需要很长时间。就在那时,正在进行的回滚发生了。在这个阶段,我似乎除了等待之外什么都做不了。 @Justin 根据资源的确切类型,您可能可以采取一些措施来强制资源完成。您能否提供更多背景信息? 对我来说也一样。我的情况是在部署 next.js 项目的 OOM 错误期间,我尝试缩小内存大小,并发生了 UPDATE_ROLLBACK_IN_PROGRESS。 aws-cli 命令(有时他们拥有比 AWS GUI 更强大的权限)也被An error occurred (ValidationError) when calling the DeleteStack operation: Stack [arn:aws:cloudformation:ap-<region>-1:<id>:stack/<stackname>/<id>] cannot be deleted while in status UPDATE_ROLLBACK_IN_PROGRESS
错误验证【参考方案6】:
如果您的用户角色缺少删除角色的权限,有时会发生这种情况。这可以通过尝试手动删除由 CloudFormation 堆栈创建的角色或用户来测试。
【讨论】:
【参考方案7】:我曾经发生过这样的事情,堆栈似乎永远停留在 UPDATE_ROLLBACK_IN_PROGRESS 状态。我建议向 AWS 支持提交票证。这是我能够解决它的唯一方法。
【讨论】:
如果您没有付费支持计划怎么办?【参考方案8】:您可以尝试删除资源,然后更新回滚将成功完成。
【讨论】:
【参考方案9】:能够通过 AWS 仪表板手动删除所有内容来删除我的。我最终得到了几个需要删除的悬空角色。
【讨论】:
【参考方案10】:我遇到了同样的问题。 控制台告诉我一些资源依赖于另一个,所以不能删除。在该状态下,回滚不可用。 我只是删除了整个 VPC 和该 VPC 中的资源。 因为 cloudformation 会每 10-20 分钟重试一次删除资源。所以当它重试时,它会发现资源已经被删除,它只是跳过删除,之后一切顺利。
【讨论】:
我的回答很好地解决了 OP 的问题。通过强制删除堆栈中的某些资源,最终可以删除堆栈。 OP 说“我想完全删除堆栈或强制停止任何活动。”这个答案正是他们想要的。【参考方案11】:是的,使用此命令删除卡在“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 可能出于安全目的而被修改为无效。它仅用于演示目的。
【讨论】:
您指的是“Lambda 函数”中的哪个 lambda 函数?哪个日志组?【参考方案12】:我去了堆栈资源选项卡,检查了为什么其中一些无法删除,然后我先手动删除了它们。
【讨论】:
以上是关于我可以强制删除正在进行回滚的 AWS CloudFormation 堆栈吗的主要内容,如果未能解决你的问题,请参考以下文章
ROLLBACK语句只能针对未提交的事务进行回滚操作,已提交的事务是不能回滚的?
K8s--Deployment--service--回滚的用法