← 中文资源

简体中文版本

检测并上报 CloudFormation 栈漂移

定时执行漂移检测,解析资源级结果,并针对被控制台或其他工具修改的具体资源告警,避免下次更新静默回滚。

阅读英文原文

概述

CloudFormation 记录的是它创建了什么,而不是当前实际存在什么。有人在控制台修改安全组或调整实例规格后,栈仍认为模板就是现实,下一次更新会把模板重新应用回去。这通常符合预期,但也意味着紧急修改可能在发布过程中被悄悄回滚,而团队毫不知情。漂移检测会把每个受支持资源的当前属性与模板比较,并报告差异。

步骤

  1. 启动漂移检测并等待完成:
aws cloudformation detect-stack-drift --stack-name payments-prod
aws cloudformation wait stack-drift-detection-complete --stack-name payments-prod
  1. 检测完成后读取栈级漂移状态:
aws cloudformation describe-stacks --stack-name payments-prod \
  --query 'Stacks[0].DriftInformation.StackDriftStatus' --output text
  1. 只列出被修改或删除的资源:
aws cloudformation describe-stack-resource-drifts \
  --stack-name payments-prod \
  --stack-resource-drift-status-filters MODIFIED DELETED \
  --query 'StackResourceDrifts[].{Logical:LogicalResourceId,Type:ResourceType,Status:StackResourceDriftStatus}' \
  --output table
  1. 仅在漂移数量非零时告警:
aws cloudformation describe-stack-resource-drifts \
  --stack-name payments-prod \
  --query 'length(StackResourceDrifts[?StackResourceDriftStatus!=`IN_SYNC`])' \
  --output text

验证

StackDriftStatus 应返回 DRIFTED 或 IN_SYNC,资源列表应包含被修改资源的逻辑 ID 与类型。构造一次控制台改动后,告警应携带该资源的详细信息;无漂移时夜间任务保持静默。若刚发布完就全部显示漂移,应等待栈进入 UPDATE_COMPLETE 后重新检测,而不是立刻修改模板。

注意事项

  • 漂移检测比较模板声明的属性,不覆盖运行时配置或数据。
  • 已从模板删除的资源不再被跟踪,其漂移无法发现。
  • 嵌套栈、自定义资源和部分资源类型可能返回 NOT_CHECKED,需要单独跟踪。
  • 检测会产生费用并受账户级限流影响,不适合每次部署都执行。
  • 每条漂移要么写回模板,要么回滚,同一天内闭环,否则会变成长期噪音。