Terraform: невозможно назначить значение удаленного состояния переменной в объявлении модуля

У меня есть файл состояния обработки объявлений VPC, вот фрагмент для подсетей:

resource "aws_subnet" "stage-1a" {
  availability_zone       = "us-east-1a"
  vpc_id                  = "${aws_vpc.tl_vpc_east.id}"
  cidr_block              = "10.100.100.0/24"
  map_public_ip_on_launch = true
  tags {
    Name = "stage-1a"
  }
}

resource "aws_subnet" "stage-1b" {
  availability_zone       = "us-east-1b"
  vpc_id                  = "${aws_vpc.tl_vpc_east.id}"
  cidr_block              = "10.100.110.0/24"
  map_public_ip_on_launch = true
  tags {
    Name = "stage-1b"
  }
}

В декларациях VPC я выводю значения для идентификаторов моей подсети:

output "stage-1a_id" {
  value = "${aws_subnet.stage-1a.id}"
}
output "stage-1b_id" {
  value = "${aws_subnet.stage-1b.id}"
}

Когда я ПРИМЕНЯЮ это состояние, я получаю соответствующие выходные данные по желанию:

stage-1a_id = subnet-<<--id_hidden-->>
stage-1b_id = subnet-<<--id_hidden-->>

В другом состоянии, где я объявляю свои серверы приложений, я использую remote_state чтобы получить информацию о vpc:

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config {
    shared_credentials_file = ".creds"
    profile = "terraform"
    bucket = "tz-state-bucket-ttzz"
    key    = "vpc/us-east-1_vpc.tfstate"
    region = "us-east-1"
  }
}

Я могу собирать и использовать это удаленное состояние почти во всех случаях, КРОМЕ ТОГО, когда я пытаюсь присвоить переменной значение из объекта.

Так, например, у меня есть объявление модуля:

module "apphosts" {
  source = "../../modules/environments/app_env"
  ...
  apphost1_subnet_id = "${var.apphost1_subnet_id}"
  apphost2_subnet_id = "${var.apphost2_subnet_id}"
  ...
}

variable "apphost1_subnet_id" {}

variable "apphost2_subnet_id" {}

Затем рядом с модулем у меня есть stage.tfvars заполнить значения.:

apphost1_subnet_id = "${data.terraform_remote_state.vpc.stage-1a_id}"
apphost2_subnet_id = "${data.terraform_remote_state.vpc.stage-1b_id}"

Когда я бегу, я использую -var-file=stage.tfvars, Когда я пытаюсь применить, выдает следующее сообщение об ошибке:

* module.apphosts.module.apphost1.aws_instance.ec2_instance: 1 error(s) occurred:

* aws_instance.ec2_instance: Error launching source instance: InvalidSubnetID.NotFound: The subnet ID '${data.terraform_remote_state.vpc.stage-1a_id}' does not exist
        status code: 400, request id: xxxxx

* module.apphosts.module.apphost2.aws_instance.ec2_instance: 1 error(s) occurred:

* aws_instance.ec2_instance: Error launching source instance: InvalidSubnetID.NotFound: The subnet ID '${data.terraform_remote_state.vpc.stage-1b_id}' does not exist
        status code: 400, request id: xxxxx

Это работает, если я не использую переменные:

module "apphosts" {
  source = "../../modules/environments/app_env"
  ...
  apphost1_subnet_id = "${data.terraform_remote_state.vpc.stage-1a_id}"
  apphost2_subnet_id = "${data.terraform_remote_state.vpc.stage-1b_id}"
  ...
}

^^^ Это работает ^^^

Моя цель состоит в том, чтобы использовать один и тот же конфигурационный модуль, но передавать ему разные переменные для обеспечения разных значений.

По сути, я хочу иметь набор промежуточных / дополнительных модулей, которые могут просто получать различные значения через stage.tfvars и prod.tfvars при необходимости, но фактическое определение модуля остается прежним.

Я чувствую, что проблема, с которой я сталкиваюсь, заключается в том, что я использую шаблон модуля, чтобы построить это - но я подумал, что именно так модули должны использоваться?!

Возможна ли моя цель? Если так, что я делаю не так? Если нет, какой метод для этого?

Для устранения неполадок:

  • Я перезапустил terraform init во всех моих штатах
  • Я повторно применил основное состояние, чтобы убедиться, что выходы установлены. Они есть, и я могу собрать их как remote_state до тех пор, пока я не установлю их как значение переменной.

0 ответов

Другие вопросы по тегам