如何识别AWS环境中未通过Terraform创建的资源与配置?
我之前也碰到过一模一样的场景——手里的AWS环境和Terraform代码对不上,分不清哪些是代码部署的、哪些是控制台手动改的,甚至还有混合部署的配置。下面几个方案亲测有用,你可以根据自己的环境复杂度选:
一、用Terraform自带命令快速排查
1. 分析terraform plan输出
这是最基础的方法,但一定要先确保Terraform状态文件是最新的(Terraform 0.15+版本里plan会自动刷新状态,旧版本可以先跑terraform refresh)。
执行terraform plan后,输出里的三类状态就是关键:
+:代码定义了但AWS中不存在的资源(待创建)-:AWS中存在但代码未定义的资源(待销毁,也就是完全没被Terraform管理的资源)~:代码配置和实际AWS资源不一致的部分(混合部署或控制台修改的配置)
如果资源太多,输出太冗长,可以用命令行工具筛选目标内容,比如只导出待销毁的资源:
terraform plan -out=plan.tfplan terraform show -json plan.tfplan | jq '.resource_changes[] | select(.change.actions[] == "destroy")'
2. 对比terraform state list和AWS CLI资源列表
先导出Terraform管理的资源清单:
terraform state list > tf-managed-resources.txt
再用AWS CLI导出对应服务的所有资源,比如EC2实例:
aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId' --output text > aws-ec2-instances.txt
最后用diff命令对比两个文件,就能找出不在Terraform状态里的EC2实例。这个方法精准,但需要针对每个AWS服务写CLI命令,适合资源类型不多的场景。
二、用第三方工具自动化批量排查
如果环境复杂、资源类型多,手动处理太麻烦,可以试试这些工具:
1. Terraformer
它能反向生成Terraform代码,把现有AWS资源批量导入到Terraform配置中。你可以用它生成整个环境的代码,再和自己现有的代码对比,差异部分就是未被管理或配置不一致的资源。
基本用法示例:
terraformer import aws --resources=ec2,s3 --regions=us-east-1
生成代码后,用diff工具对比现有Terraform目录和Terraformer生成的目录,就能快速定位差异。
2. AWS Config
AWS官方的配置管理服务,能记录所有AWS资源的配置变更,还可以把Terraform配置作为基准创建自定义规则,自动标记出不符合代码定义的资源,还能生成合规报告,适合长期的质量管控。
3. InSpec
这是一款合规检测工具,你可以编写检测规则,直接对比AWS实际资源和Terraform代码中的配置(比如检查S3桶的版本控制是否和代码定义一致),自动找出不一致的配置项。
三、长期预防建议
其实最好的办法是从源头避免这种混乱:
- 启用Terraform状态锁,防止多人同时修改状态文件导致不一致
- 制定规范:禁止直接在AWS控制台修改生产环境资源,所有变更必须通过Terraform提交
- 把
terraform plan作为CI/CD的固定检查步骤,定期巡检配置差异 - 用
terraform import把已存在的手动创建资源逐步纳入Terraform管理,实现统一管控
内容的提问来源于stack exchange,提问作者Niklas

