Drift 检测
控制台手动改资源 vs 模板期望状态。
25 分钟
Drift 检测
Drift(漂移) 指 Stack 管理的资源 实际配置 与 模板声明 不一致——常见于有人在 aws-essentials 控制台手工改安全组、标签或实例类型。CloudFormation Drift Detection 扫描并报告差异。
学习目标
- 理解 drift 成因与风险
- 使用 detect-stack-drift 与 describe-stack-resource-drifts
- 对照 Terraform
plan显示的 drift(tf-plan)
典型漂移场景
| 操作 | 结果 |
|---|---|
| Console 改 SecurityGroup 入站规则 | 模板仍写旧 CIDR,实际已变 |
| CLI 给 EC2 换 InstanceType(若可改) | Stack 认为仍是 t3.micro |
| 手工删 CFN 管理的资源 | Stack 进入 UPDATE_ROLLBACK 等异常态 |
IaC 原则:变更走模板 + ChangeSet 或 TF plan,避免「只有某人记得点了什么」——与 aws-vs-tf 一致。
检测命令
# 发起漂移检测
aws cloudformation detect-stack-drift \
--stack-name coderoadmap-lab
# 查询检测 ID 后查看详情
aws cloudformation describe-stack-resource-drifts \
--stack-name coderoadmap-lab \
--stack-resource-drift-status-filters MODIFIED DELETED
控制台:Stack → Stack actions → Detect drift,在 Drifts 页签查看 Expected vs Actual。
修复策略
1. 以模板为准 → update-stack / execute-change-set,把现实拉回声明状态
2. 以现实为准 → 改 template.yaml,再 update(类似 TF 改 .tf 后 plan)
3. 资源已删 → 可能需 import 或重建 Stack(视资源类型)
Terraform 用 state 记录 ID;CFN 用 Stack 资源记录。二者都不应长期与 Console 手工变更并存。
CodeRoadMap 建议
实验账号可 Console 试探 一次 drift 检测加深理解;生产 GitOps 路径 禁止 Console 改 TF/Helm 管理的层。CFN 实验栈结束应 delete-stack 清场。
练习
- 部署最小 Stack 后,在 Console 改一条 SG 规则,再 Detect drift
- 用 update-stack 把规则改回模板值,确认 drift 消失
- 对比 TF:
terraform plan在有人 Console 改资源后的输出