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
до тех пор, пока я не установлю их как значение переменной.