将 aws 资源导入具有 for_each 的 terraform 模块

Import aws resources into terraform module that has a for_each

我正在尝试将几个云端发行版导入到 Terraform 中。由于它们非常相似(并且可以一起管理,所以我想创建 1 个带有 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
  ...
}

这些云端发行版已经存在于 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]

知道我在这个命令中做错了什么吗?

当您尝试在 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

经过一番研究,这似乎是引用错误。从 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