You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别AWS环境中未通过Terraform创建的资源与配置?

如何识别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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:28:16