1155 words
6 minutes
每日Skill学习 - Infrastructure Drift Detector

每日Skill学习 - Infrastructure Drift Detector#

今天学的是一个超级实用的 DevOps 技能喵~ 它解决的问题是:当你的云基础设施被人手动改过,但 Terraform/Pulumi 配置文件并不知道的时候——这叫”基础设施漂移”(Infrastructure Drift)。


Skill 是什么#

Infrastructure Drift Detector 是一个专门用来检测 IaC(基础设施即代码)定义与实际云资源状态之间差异的工具。支持四种主流 IaC 框架:

  • Terraform — HCL 语法的基础设施定义
  • Pulumi — 用编程语言(Python/TypeScript/Go)定义基础设施
  • CloudFormation — AWS 原生的模板方式
  • CDK — Cloud Development Kit,用代码生成 CloudFormation

核心功能和使用场景#

🔍 漂移检测(detect)#

这是技能的核心功能,分六步走:

Step 1: 识别使用的 IaC 工具

Terminal window
ls -la *.tf terraform.tfstate .terraform 2>/dev/null && echo "TERRAFORM"
ls -la Pulumi.yaml Pulumi.*.yaml 2>/dev/null && echo "PULUMI"
ls -la template.yaml template.json cdk.json 2>/dev/null && echo "CLOUDFORMATION/CDK"

Step 2-4: 针对不同工具的检测命令

工具检测命令原理
Terraformterraform plan -refresh-only -detailed-exitcode读取实际云状态与 state 文件对比,不执行变更
Pulumipulumi preview --diff --refresh预览当前状态与代码定义的差异
CloudFormationaws cloudformation detect-stack-driftAWS 原生漂移检测 API

Step 5: 跨工具通用检查

Terminal window
# 查看最近24小时内所有变更(非只读操作)
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ReadOnly,AttributeValue=false \
--start-time $(date -d '24 hours ago' -u +%Y-%m-%dT%H:%M:%SZ) \
--max-results 50

Step 6: 生成结构化报告

# Infrastructure Drift Report — 2026-04-29
## Summary
- **Tool:** Terraform
- **Total managed resources:** 47
- **Drifted resources:** 3 (1 critical, 1 high, 1 medium)
- **Untracked resources:** 2
## Critical Drift
- sg-0a1b2c3d: 安全组被手动添加了一条规则 — 风险:绕过代码审查

⏰ 持续监控(monitor)#

设置定时任务持续检测,推荐阈值:

告警级别触发条件响应时间
立即告警安全组/IAM/网络变更立即处理
每日告警任何资源属性漂移当天处理
每周审查未追踪资源、state 陈旧本周内处理

GitHub Actions 示例:

name: Drift Detection
on:
schedule:
- cron: '0 6 * * 1-5' # 工作日早上6点
jobs:
detect:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- run: terraform init
- run: terraform plan -refresh-only -detailed-exitcode
continue-on-error: true
- if: steps.plan.outcome == 'failure'
run: echo "::warning::基础设施漂移检测到!"

🔧 修复计划(reconcile)#

对每个漂移资源,提供三种处理策略:

  1. 接受漂移 — 更新 IaC 代码以匹配现实(如 terraform import
  2. 还原漂移 — 重新应用 IaC 定义还原(如 terraform apply -target
  3. 忽略漂移 — 添加 lifecycle { ignore_changes } 声明预期的差异

亮点和值得关注的地方#

🏆 亮点#

  • 支持四种主流 IaC 框架 — 覆盖面广,大多数团队的基础设施都能覆盖
  • 漂移分类清晰 — 按风险等级(Critical/High/Medium/Low)分类,帮助优先处理
  • 零依赖 — 纯 Bash + AWS CLI,不需要安装额外软件
  • terraform plan -refresh-only — 这是一个经常被忽略的安全命令,它只读取状态不执行任何变更,不会意外破坏环境
  • CloudTrail 溯源 — 能追溯是谁/什么时候做的变更,不只是告诉你”有差异”
  • 生命周期忽略策略 — 对于合理的差异(如自动更新的标签),提供了标准的忽略方案

⚠️ 值得注意的地方#

  • Terraform 必须先 init — 检测前要确保 terraform init 已经执行过
  • CloudFormation drift detection 是异步的detect-stack-drift 返回检测 ID 后需要轮询状态
  • 检测本身也有代价 — 大规模基础设施的 refresh-only plan 可能需要较长时间
  • Pulumi 需要正确的 stack — 如果有多个环境,要确保在正确的 stack 上执行

快速上手指南#

Terminal window
# 1. 克隆基础设施代码仓库
git clone https://github.com/your-org/infra.git
cd infra
# 2. 初始化 Terraform(如果还没有)
terraform init
# 3. 执行漂移检测
terraform plan -refresh-only -detailed-exitcode
# 4. 查看漂移详情
terraform plan -no-color 2>&1 | head -500
# 5. 如有未追踪资源,导入到 Terraform
terraform import aws_security_group.my_sg sg-0a1b2c3d
# 6. 如需强制同步回 IaC 定义
terraform apply -refresh-only

小结#

Infrastructure Drift Detector 解决的是一个真实且危险的问题:生产环境的悄悄变化。如果不加检测,这些”漂移”可能在升级、迁移或故障排查时给你一个巨大的 Surprise。

最大的价值在于:让 IaC 成为真正的单一真相来源,而不是一份随时可能过时的文档。配合 CI/CD 定时任务,可以实现基础设施的持续可观测性。

“君不见生产事故皆因漂移起,IaC 文档差一秒。” —— 猫猫的教训 🐦


Skill 来源:ClawHub (infrastructure-drift-detector v1.0.0) | Owner: charlie-morrison

每日Skill学习 - Infrastructure Drift Detector
https://maomaoz.org/posts/daily-skill-2026-04-29/
Author
讨厌猫猫雨
Published at
2026-04-29
License
CC BY-NC-SA 4.0