将 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 导入

Terraform : for_each 一个一个

Terraform For_Each:如何引用创建的资源 ID

使用 AWS CLI 将现有资源导入 CloudFormation

如何将现有资源从不同的 AWS 账户导入 AWS CDK

使用AWS CLI将现有资源导入CloudFormation