如何修复漂移的AWS CloudFormation堆栈?

38

如何修复漂移的AWS CloudFormation堆栈?我修改了一个BackendECS服务,但现在它是“漂移”的,但没有关于如何解决此问题的信息?这让我疯狂了。有关如何解决此问题的零信息?


7
每当有微小的更改时,CloudFormation就会崩溃,并且通常无法检测到它。建议使用Terraform。我在CloudFormation上浪费了很多时间,最终回到了Terraform。 - forzagreen
我真的感到困惑。这是一个难题要解决的噩梦。AWS,你是认真的吗?你希望我添加“保留”标志,删除资源,然后重新导入它们?这有什么意义?像那样更改资源是有风险的。为什么我不能直接在记录中就地更新模板,以适应漂移的值呢?我甚至还没有开始处理生产方面的问题,但这已经是一片雷区了。 - mukunda
我真的感到困惑。这真是一个难以解开的噩梦。嘿,AWS,你是想让我添加“保留”标志,移除资源,然后重新导入它们吗?这到底有什么道理?像那样改变资源是有风险的。为什么我不能直接在记录中更新模板,以匹配漂移的值呢?我甚至还没有涉及到生产环境,但这已经是一个雷区了。 - undefined
4个回答

15
Amazon AWS允许通过其"漂移检测"功能对漂移的堆栈进行故障排除。
可以通过导航到CloudFormation > 选择堆栈 > 操作 > 检测当前堆栈的漂移来访问漂移检测。
更多信息请参阅:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/detect-drift-stack.html 使用此诊断工具,您可以查看您的AWS配置与cloudformation期望状态之间的确切差异。
有几种潜在的解决方法:
1. 如果您通过基础架构即代码服务进行了自动更新,请回滚更改。 2. 如果您手动更新了ECS服务,请将设置更改回漂移检测中显示的预期状态。一旦系统恢复到预期状态,您的堆栈将正常运行。 3. 删除当前堆栈资源并重新创建它-这是一种危险的解决方法,因为您将丢失更新历史记录和回滚状态。 根据评论部分,添加theimowski的第四个替代方案: 首先从模板中删除已删除的资源,并更新堆栈,然后将其恢复为与模板中相同的状态,并再次更新堆栈。- theimowski 2021年12月29日16:38

它说我的AWS::ECS::Service已被修改,但是我无法更新ECS服务,它不断搜索先前已删除的ECS服务。 - ByteMe
42
如何重新创建已删除的内容?它将具有不同的ID。 为什么他们要制作这些无用的功能? - Matteo
1
还有第四个选项,可以通过导入资源来修复漂移问题。 - Marcin
4
在我的情况下,我手动删除了API Gateway,然后通过以下步骤成功重新创建它:a)将其从模板中删除并更新堆栈,b)将其完全恢复为模板中的原样并再次更新堆栈。 - theimowski
1
@theimowski 的重新创建已删除资源的解决方案应该被视为答案的一部分,因为它是相关的情况。 - Bart Swennenhuis
显示剩余2条评论

9

我在使用 CloudFormation 时也遇到了类似的问题,但可惜的是目前缺乏如何将实例“undrift”回模板指定状态的文档。我发现将漂移的实体注释掉可以让 CloudFormation 将其“删除”,然后取消注释即可将其恢复到所需状态。

话虽如此,我同意使用 Terraform 更好,因为每次执行 apply 操作时,强制执行模板是其默认行为。


2
一个非常好的解决方案,可以非破坏性地修复问题,思路很好,谢谢分享...效果很好。 - TryTryAgain

0
对于那些由于某种原因无法切换到Terraform(首选)的人来说,我怀疑每个剩下的情况都会有所不同,所以随着时间的推移可能会有很多有效和有帮助的答案。
例如,我的五个“DRIFTED”案例最后都是由于IAM权限不足以修改IAM角色标签,所以这是一个直接的修复方法 - 获取IAM权限并确保添加标签,然后重新扫描,这样就得到了更愉快的“IN_SYNC”。
另一个案例是由于已知AWS CDK问题的解决方法,因为CDK在内部使用CloudFormation,所以我倾向于忽略它 - 如果时间允许,我宁愿修复CDK或切换到Terraform :)
附注:当前的AWS管理控制台UI/UX也不是很好,我被误导点击了“Physical ID”链接,基本上是浪费时间。
找到相关问题的更好方法是按照“Drift状态”进行排序,然后点击相关行的单选按钮,并点击表格右上角的“查看漂移详情”按钮。

0
进一步谈论这个问题 - 并非所有资源都可以进行漂移检测;其中包括端点,因此CloudFormation甚至无法察觉它们是否发生了变化(我花了很长时间才弄清楚这一点,在测试中,即使删除它们也无法触发CF的注意)。
故事的寓意是 - 不要完全依赖漂移检测,正如其他人所说,升级到Terraform并正确地进行操作 :(

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