概述
CloudFormation 记录的是它创建了什么,而不是当前实际存在什么。有人在控制台修改安全组或调整实例规格后,栈仍认为模板就是现实,下一次更新会把模板重新应用回去。这通常符合预期,但也意味着紧急修改可能在发布过程中被悄悄回滚,而团队毫不知情。漂移检测会把每个受支持资源的当前属性与模板比较,并报告差异。
步骤
- 启动漂移检测并等待完成:
aws cloudformation detect-stack-drift --stack-name payments-prod
aws cloudformation wait stack-drift-detection-complete --stack-name payments-prod
- 检测完成后读取栈级漂移状态:
aws cloudformation describe-stacks --stack-name payments-prod \
--query 'Stacks[0].DriftInformation.StackDriftStatus' --output text
- 只列出被修改或删除的资源:
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
- 仅在漂移数量非零时告警:
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,需要单独跟踪。 - 检测会产生费用并受账户级限流影响,不适合每次部署都执行。
- 每条漂移要么写回模板,要么回滚,同一天内闭环,否则会变成长期噪音。