将 aws 资源导入具有 for_each 的 terraform 模块
Posted
技术标签:
【中文标题】将 aws 资源导入具有 for_each 的 terraform 模块【英文标题】:Import aws resources into terraform module that has a for_each 【发布时间】:2021-11-06 00:31:25 【问题描述】:我正在尝试将几个云端发行版导入 terraform。因为它们非常相似(并且可以一起管理,所以我想用for_each
创建一个资源,然后将它们导入到这个资源中)。
模块如下所示:
variable "cloudfront_configurations"
default =
distro_1 =
aliases = ["url_of_distro1.com"],
,
distro_2 =
aliases = ["url_of_distro2.com"],
,
module "cloudfront_distribution"
for_each = var.cloudfront_configurations
source = "terraform-aws-modules/cloudfront/aws"
version = "2.7.0"
aliases = each.value.aliases
...
这些 cloudfront 发行版已经存在于 AWS 中,我想使用以下方法将它们导入 terraform:
terraform import module.cloudfront_distribution[\"distro_1\"].aws_cloudfront_distribution[0] IDOFDISTRO1
这一直给我错误no matches found: module.cloudfront_distribution["distro_1"].aws_cloudfront_distribution[0]
知道我在这个命令中做错了什么吗?
【问题讨论】:
【参考方案1】:当您尝试在 Terraform 中导入某些内容时,获取其 ID 的最简单方法通常是执行 terraform plan
并检查输出
在您的情况下,您正在尝试导入
module // check the module
.cloudfront_distribution // named cloudfront_distribution
[\"distro_1\"] // with ID distro_1 in its for_each
.aws_cloudfront_distribution // inside, it will have a aws_cloudfront_distribution
[0] // ?
如果您检查the Terraform docs about referencing values,您会看到结构是<RESOURCE TYPE>.<NAME>
。在您的 ID 中,您遗漏了名称并仅添加了 [0]
,就好像它是由 count
创建的第一个资源一样
如果您不想使用我之前提到的terraform plan
技巧,则必须检查the docs of the module you're using。在那里,你会看到你感兴趣的资源是aws_cloudfront_distribution.this
所以你的资源ID是module.cloudfront_distribution["distro_1"].aws_cloudfront_distribution.this
(注意我把[0]
改成了.this
)
【讨论】:
这里的分发ID只是假的(我不想使用真实的) Cloudfront的terraform模块是由count
(github.com/terraform-aws-modules/terraform-aws-cloudfront/blob/…)创建的,所以我猜[0] 应该没问题。为了争论,我尝试使用这些导入,但它给出了相同的错误: module.cloudfront_distribution[\"distro_1\"].aws_cloudfront_distribution.this[0] module.cloudfront_distribution[\"distro_1\"].aws_cloudfront_distribution.this module .cloudfront_distribution[\"distro_1\"]
那么我建议你运行 terraform plan
并记下 Terraform 分配给发行版的 ID。那就是你需要使用的那个
这仍然是最奇怪的部分......当我运行计划命令时,我将其作为资源名称:module.cloudfront_distribution["account"].aws_cloudfront_distribution.this[0]
(帐户是我在变量中用作键的实际值)。当我复制这个资源名称时,仍然是同样的错误。我现在不知所措....甚至尝试了不同版本的 terraform 命令【参考方案2】:
经过一番研究,这似乎是一个引用错误。从 cli 引用模块时,您需要像这样引用整个名称:
terraform import 'module.cloudfront_distribution["distro_1"].aws_cloudfront_distribution[0]' IDOFDISTRO1
https://www.terraform.io/docs/cli/commands/import.html#example-import-into-resource-configured-with-for_each
【讨论】:
以上是关于将 aws 资源导入具有 for_each 的 terraform 模块的主要内容,如果未能解决你的问题,请参考以下文章
Terraform For_Each:如何引用创建的资源 ID