【问题标题】:error during creation efs-server and mounting it for the AWS EKS setup创建 efs-server 并为 AWS EKS 设置安装它时出错
【发布时间】:2021-10-04 17:53:12
【问题描述】:

我试图创建一个 efs 服务器并挂载并在那里遇到一些错误。下面是我正在使用的代码 -

variable "subnets_nodes" {}
variable "security_group_nodes" {}
resource "aws_efs_mount_target" "efs-mt" {
   count = length(var.subnets_nodes)
   file_system_id  = aws_efs_file_system.efs.id
   subnet_id = "${var.subnets_nodes[count.index].id}"
   security_groups = ["${var.security_group_nodes.id}"]
 }

我得到的错误是 -

Error: Invalid index

  on ../modules/ops_bootstrap/modules/fluentd/main.tf line 44, in resource "aws_efs_mount_target" "efs-mt":
  44:    subnet_id = var.subnets_nodes[count.index].id
    |----------------
    | count.index is 1
    | var.subnets_nodes is object with 3 attributes

The given key does not identify an element in this collection value.

Error: Invalid index

  on ../modules/ops_bootstrap/modules/fluentd/main.tf line 44, in resource "aws_efs_mount_target" "efs-mt":
  44:    subnet_id = var.subnets_nodes[count.index].id
    |----------------
    | count.index is 0
    | var.subnets_nodes is object with 3 attributes

The given key does not identify an element in this collection value.

Error: Invalid index

  on ../modules/ops_bootstrap/modules/fluentd/main.tf line 44, in resource "aws_efs_mount_target" "efs-mt":
  44:    subnet_id = var.subnets_nodes[count.index].id
    |----------------
    | count.index is 2
    | var.subnets_nodes is object with 3 attributes

给定的键未标识此集合值中的元素。 任何帮助将不胜感激 ? (已编辑)

【问题讨论】:

    标签: terraform amazon-efs


    【解决方案1】:

    您的变量subnet_nodes 的格式为object,无法通过索引访问。对象和映射使用键值对而不是索引来引用元素。我认为变量类似于:

    subnets_nodes = {
      node_1 = {
        id = "some-id"
      }
      node_2 = {
        id = "some-id"
      }
      node_3 = {
        id = "some-id"
      }
    }
    

    因此,此示例中的第一个 id 将由 var.subnets_nodes["node_1"].id 访问,而不是 var.subnets_nodes[0].id

    建议在此用例中使用for_each,因为它会遍历对象,您可以使用each.value 访问其中的值。 这比使用count 更可取,因为如果使用count 时值的顺序发生变化,将强制重新创建资源。这不是for_each 的问题。 (An article 解释这个)

    所以你会想做这样的事情:

    resource "aws_efs_mount_target" "efs-mt" {
       for_each = var.subnets_nodes
       file_system_id  = aws_efs_file_system.efs.id
       subnet_id = each.value.id
       security_groups = ["${var.security_group_nodes.id}"]
     }
    

    【讨论】:

    • thnks 这行得通,现在我知道我做错了什么。还有一个疑问,由此创建的 efs 没有任何名称。知道如何命名吗?我想我们没有“名称”属性来使用 terraform 动态命名它?这里有任何帮助
    猜你喜欢
    • 2021-04-13
    • 2020-12-07
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2021-01-24
    相关资源
    最近更新 更多