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 工具
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: 针对不同工具的检测命令
| 工具 | 检测命令 | 原理 |
|---|---|---|
| Terraform | terraform plan -refresh-only -detailed-exitcode | 读取实际云状态与 state 文件对比,不执行变更 |
| Pulumi | pulumi preview --diff --refresh | 预览当前状态与代码定义的差异 |
| CloudFormation | aws cloudformation detect-stack-drift | AWS 原生漂移检测 API |
Step 5: 跨工具通用检查
# 查看最近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 50Step 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 Detectionon: 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)
对每个漂移资源,提供三种处理策略:
- 接受漂移 — 更新 IaC 代码以匹配现实(如
terraform import) - 还原漂移 — 重新应用 IaC 定义还原(如
terraform apply -target) - 忽略漂移 — 添加
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 上执行
快速上手指南
# 1. 克隆基础设施代码仓库git clone https://github.com/your-org/infra.gitcd infra
# 2. 初始化 Terraform(如果还没有)terraform init
# 3. 执行漂移检测terraform plan -refresh-only -detailed-exitcode
# 4. 查看漂移详情terraform plan -no-color 2>&1 | head -500
# 5. 如有未追踪资源,导入到 Terraformterraform 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/