几天来,我正在研究一种生成非地形创建资源列表的方法。目前我正在使用标记方法,但这意味着无法标记的 AWS 资源也应从 AWS Config 查询中排除。
标记部分也很麻烦,因为这必须手动完成。
- 有没有办法告诉 Terraform(或 Terragrunt)自动在资源上使用通用标签?
- 有没有办法让 Terraform 或任何其他工具创建状态文件中不可用的资源列表?
几天来,我正在研究一种生成非地形创建资源列表的方法。目前我正在使用标记方法,但这意味着无法标记的 AWS 资源也应从 AWS Config 查询中排除。
标记部分也很麻烦,因为这必须手动完成。
- 有没有办法告诉 Terraform(或 Terragrunt)自动在资源上使用通用标签?
不,这是不可能的。可以说,它会违背 Terraform 的概念模型的声明,因此这不太可能成为 Terraform 的一个特征。
Terraform Enterprise 具有可用于强制用户提供特定标签的策略实施,但我认为它不能自动注入标签。
- 有没有办法让 Terraform 或任何其他工具创建状态文件中不可用的资源列表?
不,Terraform 关心其状态文件中的资源。它不关心其他任何事情。
我个人认为你是从错误的角度来处理这个问题。如果可能的话,询问 Terraform“你不知道什么”会很方便(但事实并非如此),但如果你查阅它知道的内容列表并从中推断资源是否是或者不是 Terraform 的一部分。
我不知道您正在使用的工具或您希望的工作流程,但您可以执行以下操作:
使用该terraform show -json
命令生成一个 JSON 文档,该文档表示 Terraform 状态文件中的所有已知基础设施。
使用该工具jq
解析 JSON 以获取资源 ID 列表
使用该aws resourcegroupstaggingapi get-resources
命令来生成所有已知资源的列表,或者甚至是类似的工具aws-list-all
遍历“所有资源”列表中的每个条目;对于每一个,遍历“Terraform-managed”列表中的每个条目;如果没有匹配项,则将资源 ID 添加到“not-managed-by-Terraform”资源列表中
我同意 Chuppa Chump 的回答,如果不是很明显,我会添加,以确保所有 Terraform 创建的资源都有一个标签,表明它是由 Terraform 创建的。例如,CreatedBy = "Terraform" OR Automation = "Terraform"。然后任何没有自动化或 CreatedBy 标签的资源都不是由 terraform 创建的。
对于仍然偶然发现这一点的人。似乎有一个社区创建了一个名为Driftctl的工具,可以根据您的 Terraform 状态检查环境。
由于没有很好的方法可以知道资源是否由 terraform 管理,我会尝试以下方法:
使用terraformer导入您的所有资源(并非所有资源都受 terraformer 支持,因此这不是一个完整的解决方案),在您拥有此列表后,只需从中减去您的 terraform 状态管理的所有资源。运行时,terraform plan
您可以看到您的资源 ID。
如果您有所有 terraform 托管资源的标签,则可以使用terraformer过滤它们