在 terraform 导入命令中使用“this”?

问题描述 投票:0回答:2

我正在尝试导入一些资源(由 EKS 在 terraform 外部创建),特别是 集群创建者访问条目。

文档提供了此用法来创建新的访问条目

locals {
  access_entries = {
    iam_identity_center_admin_role = {
      kubernetes_groups = []
      principal_arn     = data.external.get_sso_admin_role.result.Arn
      policy_associations = {
        iam_identity_center_admin_role = {
          policy_arn = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy"
          access_scope = {
            type = "cluster"
          }
        }
      }
    }
  }
}

根据 terraform import 命令文档

在运行 terraform import 之前,您必须手动为资源编写资源配置块。资源块描述了 Terraform 应将导入的对象映射到何处。

基于上述理解,我尝试使用以下引发错误的导入命令

terraform import  module.base.module.eks.aws_eks_access_entry.iam_identity_center_admin_role mycluster:principal arn

Before importing this resource, please create its configuration in module.base.module.eks. For example:
    resource "aws_eks_access_entry" "iam_identity_center_admin_role" {
      # (resource arguments)
    }

如果我为 eks 访问条目添加恐怖资源,效果相同。当然,当我使用资源定义时,我不使用访问条目映射的局部变量。所以,这不是正确的资源问题

resource "aws_eks_access_entry" "imported_cluster_creator_eks_access_entry" {
  cluster_name  = local.eks_name
  principal_arn = data.external.get_sso_admin_role.result.Arn
}

但是如果我使用以下导入命令带有本地变量并且没有明确的资源定义具有

this
它就可以工作。我想知道为什么使用这个有效?为什么使用这个?据我了解,它是隐式使用的

terraform import 'module.base.module.eks.aws_eks_access_entry.this["iam_identity_center_admin_role"]' my-cluster:pricipal arn
amazon-web-services kubernetes terraform terraform-provider-aws amazon-eks
2个回答
2
投票

基于 terraform 模块代码,

merged_access_entries
局部变量与
aws_eks_access_entry
资源一起使用。由于您手动创建的资源需要导入到模块中,因此您必须遵循该模块指定的约定。在这种情况下,您要导入的资源使用逻辑名称
this
:

resource "aws_eks_access_entry" "this" {
  for_each = { for k, v in local.merged_access_entries : k => v if local.create }

  cluster_name      = aws_eks_cluster.this[0].name
  kubernetes_groups = try(each.value.kubernetes_groups, null)
  principal_arn     = each.value.principal_arn
  type              = try(each.value.type, "STANDARD")
  user_name         = try(each.value.user_name, null)

  tags = merge(var.tags, try(each.value.tags, {}))
}

如您所见,EKS 模块也使用

for_each
创建资源
aws_eks_access_entry
,因此在指定
import
命令时需要键,因为键值对是由
merged_access_entries
本地决定的多变的。根据此处概述的所有内容和您的问题,您正在从
base
模块调用 EKS 模块。

使用模块时,您需要知道要导入的模块中使用了哪些资源以及资源的逻辑名称,才能成功导入。由于相关资源是 "aws_eks_access_entry" "this"

,因此整个导入命令需要是:

terraform import module.base.module.eks.aws_eks_access_entry.this["iam_identity_center_admin_role"]' <cluster:pricipal arn>
因为您定义的本地 

access_entries

 变量中的键之一是 
iam_identity_center_admin


2
投票

eks 模块定义了aws_eks_access_entry

资源,名称为
this
。然后它使用 
for_each
 元来循环它需要创建的所有条目

resource "aws_eks_access_entry" "this" { for_each = { for k, v in local.merged_access_entries : k => v if local.create } cluster_name = aws_eks_cluster.this[0].name kubernetes_groups = try(each.value.kubernetes_groups, null) principal_arn = each.value.principal_arn type = try(each.value.type, "STANDARD") user_name = try(each.value.user_name, null) tags = merge(var.tags, try(each.value.tags, {})) }
正如评论中提到的,

this

没有做任何特别的事情,它只是
aws_eks_access_entry
资源的名称。使用 
this
 只是模块中通用资源的一般约定。

您可以阅读有关

命名的更多内容,其中写着

如果没有更多描述性和通用名称可用,或者资源模块创建此类型的单个资源(例如,在 AWS VPC 模块中,有一个 aws_nat_gateway 类型的单个资源和多个 aws_route_table 类型的资源,则资源名称应命名为此名称) ,因此 aws_nat_gateway 应命名为此名称,并且 aws_route_table 应具有更具描述性的名称 - 例如私有、公共、数据库)。

© www.soinside.com 2019 - 2024. All rights reserved.