Невозможно получить идентификаторы подсети | План Терраформ - PullRequest
0 голосов
/ 05 июля 2019

Я получаю ошибку ниже при выполнении Terraform plan.Здесь я придерживаюсь концепции модулей.

Ниже приведены мои блоки aws_efs_mount_target и aws_subnet.

efs.tf: -

resource "aws_efs_file_system" "master_efs" {
  creation_token   = "master"
  performance_mode = "generalPurpose"
  kms_key_id       = "${data.terraform_remote_state.kms_ebs.outputs.key_arn}"
  encrypted        = "true"
  tags = {
    Name        = "master"
    Environment = "${var.environment}"
    Terraform   = "true"
  }
}
resource "aws_efs_mount_target" "master_mt" {
  file_system_id  = "${aws_efs_file_system.master_efs.id}"
  count           = "${length(var.availability_zones)}"
  subnet_id      = "${data.aws_subnet.app_subnet_0.*.id[count.index]}"
  security_groups = [ "${aws_security_group.sg.id}" ]
}

data "aws_subnet" "app_subnet_0" {
  vpc_id = "${data.aws_vpc.cng.id}"
  filter {
    name    = "tag:Name"
    values  = ["${var.search_pattern_app}-0"]
  }
}

Ошибка: Неверный индекс

     on ../../modules/efs.tf line 16, in resource "aws_efs_mount_target" "master_mt":
      16:   subnet_id      = "${data.aws_subnet.app_subnet_0.*.id[count.index]}"
        |----------------
        | count.index is 2
        | data.aws_subnet.app_subnet_0 is object with 15 attributes

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


Error: Invalid index



     on ../../modules/efs.tf line 16, in resource "aws_efs_mount_target" "master_mt":
      16:   subnet_id      = "${data.aws_subnet.app_subnet_0.*.id[count.index]}"
        |----------------
        | count.index is 1
        | data.aws_subnet.app_subnet_0 is object with 15 attributes

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

Error: Invalid index

  on ../../modules/efs.tf line 35, in resource "aws_efs_mount_target" "worker_mt":
  35:   subnet_id      = "${data.aws_subnet.app_subnet_0.*.id[count.index]}"
    |----------------
    | count.index is 1
    | data.aws_subnet.app_subnet_0 is object with 15 attributes

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


Error: Invalid index

  on ../../modules/efs.tf line 35, in resource "aws_efs_mount_target" "worker_mt":
  35:   subnet_id      = "${data.aws_subnet.app_subnet_0.*.id[count.index]}"
    |----------------
    | count.index is 2
    | data.aws_subnet.app_subnet_0 is object with 15 attributes

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

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Источник данных aws_subnet возвращает отдельную подсеть, а не список, и вы, кажется, не зацикливаетесь на ней с count.

Если вы ожидаете, что будет возвращено несколько подсетей, вам, вероятно, вместо этого понадобится aws_subnet_ids источник данных .

Поэтому, если вы хотите создать цель монтирования EFS в каждой подсети, которая соответствует фильтру подсети, вы можете использовать следующее:

resource "aws_efs_file_system" "master_efs" {
  creation_token   = "master"
  performance_mode = "generalPurpose"
  kms_key_id       = "${data.terraform_remote_state.kms_ebs.outputs.key_arn}"
  encrypted        = "true"

  tags = {
    Name        = "master"
    Environment = "${var.environment}"
    Terraform   = "true"
  }
}

data "aws_subnet_ids" "app_subnet" {
  vpc_id = "${data.aws_vpc.cng.id}"

  tags = {
    Name = "${var.search_pattern_app}"
  }
}

resource "aws_efs_mount_target" "master_mt" {
  file_system_id  = "${aws_efs_file_system.master_efs.id}"
  count           = "${length(var.availability_zones)}"
  subnet_id       = "${data.aws_subnet.app_subnet.ids[count.index]}"
  security_groups = ["${aws_security_group.sg.id}"]
}

Находит все подсети с именем, совпадающим с переменной search_pattern_app, и создает цели монтирования EFS в каждой из них.

1 голос
/ 05 июля 2019

Исходя из того, что я понимаю из вашего кода, вы пытаетесь создать точку монтирования для вашей EFS для каждой подсети в VPC (по одной на зону доступности), и для этого вы хотите, чтобы Terraform автоматически анализировал доступностьзона и затем назначить идентификатор подсети для цели монтированияПо-видимому, код, который вы написали, пытается сопоставить один из атрибутов подсети со значением счетчика, если вы просто хотите добавить aws_subnet.app_subnet_0.1 в aws_subnet.app_subnet_0.x, может быть, вы можете указать это так

aws_subnet.app_subnet_0.${count.index}.id
...