Terraform import命令中this的用法解析(EKS访问条目场景)
this["xxx"]用法的解析 1. this到底是什么?
在Terraform模块里,如果你用for_each(基于映射/集合批量创建资源),通常会把资源块的名字设为this,比如:
resource "aws_eks_access_entry" "this" { for_each = local.access_entries # 其他配置,用each.value取映射里的参数 }
这里的this就是个资源集合的代号,用来指代通过for_each生成的所有aws_eks_access_entry实例的整体。当你要引用集合里的单个实例时,就得用this["键名"],这里的键就是local.access_entries映射里的key,比如iam_identity_center_admin_role。
2. 为什么两种导入命令结果不一样?
失败的命令:
terraform import module.base.module.eks.aws_eks_access_entry.iam_identity_center_admin_role mycluster:principal arn
你没显式定义过名为iam_identity_center_admin_role的独立aws_eks_access_entry资源,Terraform状态里根本没这个标识,自然找不到对应的资源去导入,所以报错。成功的命令:
terraform import 'module.base.module.eks.aws_eks_access_entry.this["iam_identity_center_admin_role"]' my-cluster:principal arn
这个命令精准指向了for_each生成的资源集合里,对应local.access_entries中iam_identity_center_admin_role这个键的实例。Terraform能识别这种集合内的实例定位方式,所以能把外部创建的EKS访问条目正确导入到状态里。
3. 显式定义资源能导入的原因
当你单独写了aws_eks_access_entry.iam_identity_center_admin_role的资源块时,这个名称就成了Terraform状态里的独立资源标识,和批量创建的this集合是两个不同的资源组,所以直接用这个名称导入就能匹配上。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra

