Как получить идентификаторы подсети VPC через terraform_remote_state?

#terraform #terraform-provider-aws

#terraform #terraform-provider-aws

Вопрос:

Мой файл состояния vpc находится в dev / vpc / main /terraform.tfstate. Я хотел бы представить MariaDB с использованием частных подсетей в vpc. Я получил ошибки:

Ошибка: План выполнения ошибки: произошла 1 ошибка (ы):

  • module.csc_db_sbnet_group.var.db_subnet_group_ids: элемент: элемент() не может использоваться с пустым списком в:

${элемент (данные.terraform_remote_state.vpc_subnets_ids.vpc_private_subnets_ids,0)}

Код MariaDB (примечание: код MariaDB имеет свой собственный файл состояния terrafrom):

 data_sources.tf: 

data "terraform_remote_state" "vpc_subnets_ids" {
  backend = "s3"

  config {
    bucket = "dev-terraform-state"
    key    = "dev/vpc/main/terraform.tfstate"
    region = "us-west-2"
  }
}

resources.tf:
module "csc_db_sbnet_group" {
  source               = "modules/rds-subnet-group"
  db_subnet_group_name = "${var.db_subnet_group_name}"
  db_subnet_group_ids  = ["${element(data.terraform_remote_state.vpc_subnets_ids.vpc_private_subnets_ids,0)}", "${element(data.terraform_remote_state.vpc_subnets_ids.vpc_private_subnets_ids,1)}"]
}
  

Код VPC:

 resources.tf:

module "vpc" {
  source = "modules/vpc"

  aws_region   = "${var.region}"
  vpc_tag_name = "${var.vpc_name}"
  vpc_cidr     = "${var.vpccidr}"

  private-subnet-mapping = ["${var.private_az_subnets_cidr}"]
  public-subnet-mapping  = ["${var.public_az_subnets_cidr}"]
}

resource "aws_subnet" "add_private_subnets" {
  count = "${length(var.private-subnet-mapping)}"

  cidr_block        = "${lookup(var.private-subnet-mapping[count.index], "cidr")}"
  vpc_id            = "${module.vpc.vpc_id}"
  availability_zone = "${lookup(var.private-subnet-mapping[count.index], "az")}"

  tags = {
    Name = "${lookup(var.private-subnet-mapping[count.index], "name")}"
    BU   = "${lookup(var.private-subnet-mapping[count.index], "BU")}"
  }
}

outputs.tf
output "vpc_private_subnets_ids" {
  value = ["${aws_subnet.add_private_subnets.*.id}"]
}

output "vpc_private_subnets_cidrs" {
  value = ["${aws_subnet.add_private_subnets.*.cidr_block}"]
}
  

Когда я предоставляю MariaDB, я хотел бы использовать частные подсети, предоставленные в коде VPC. Но он жалуется,

  • module.csc_db_sbnet_group.var.db_subnet_group_ids: элемент: элемент() не может использоваться с пустым списком в:

${элемент (данные.terraform_remote_state.vpc_subnets_ids.vpc_private_subnets_ids,0)}

Комментарии:

1. Какую версию terraform вы используете? И private_subnets_id вывод на корневом модуле тоже?

2. Это 0.11? Если это ваш модуль, то что aws_subnet.production_private_subnets ?

3. Спасибо за вопрос и комментарий. Версия terraform — v0.11.13. Я обновил код. Смотрите выше. Но я получил новую ошибку. Он жалуется, что ${element(data.terraform_remote_state.vpc_subnets_ids.vpc_private_subnets_ids,0)} пуст. У вас есть какие-либо подсказки?

4. Существуют ли выходные данные в файле состояния vpc? Если вы добавили выходные данные без выполнения плана и применяете их впоследствии, они не будут в состоянии.

5. Я запустил вывод terraform. Я получил, vpc_private_subnets_cidrs = [] vpc_private_subnets_ids = [] Почему списки пусты? Я захожу в aws colo. Я вижу там список подсетей.

Ответ №1:

Я добавил приведенный ниже код для VPC и решил проблему.

 data "aws_subnet_ids" "private_subnet_ids" {
  vpc_id            = "${module.vpc.vpc_id}"
}
data "aws_subnet" "private_subnet" {
  count = "${length(data.aws_subnet_ids.private_subnet_ids.ids)}"
  id    = "${data.aws_subnet_ids.private_subnet_ids.ids[count.index]}"
}