Terragrunt v0.14.9, Terraform v0.11.7 считывает идентификатор AWS VPC из второй среды
Я использовал Terragrunt для организации создания AWC VPC не по умолчанию. У меня есть состояние S3/DynamoDB mgmt, а код VPC - это модуль. У меня есть "среда VPC" terraform.tfvars
код проверен во втором репо согласно terragrunt
README.md.
Я создал второй модуль, который в конечном итоге будет создавать хосты в этом VPC, но пока просто нацелен на вывод его идентификатора. Я создал отдельную "среду хостов" / terraform.tfvars
для реализации этого модуля.
- я бегу
terragrunt apply
в каталоге среды VPC - VPC создан - я бегу
terragrunt apply
второй раз в директории среды hosts - директива output не работает (без ошибок, но неверно, см. ниже).
Это предшественник одного дня бега terragrunt apply-all
в родительском каталоге каталогов среды VPC/hosts; мое чтение документов предлагает использовать terraform_remote_state
источник данных для выставления идентификатора VPC, поэтому я указал такой доступ в data.tf
файл модуля hosts:
data "terraform_remote_state" "vpc" {
backend = "s3"
config {
bucket = "myBucket"
key = "keyToMy/vpcEnvironment.tfstate"
region = "stateRegion"
}
}
Затем в модуле hostsoutputs.tf
Я указал выход для проверки присваивания:
output "mon_vpc" {
value = "${data.terraform_remote_state.vpc.id}"
}
Когда я запускаю (2) выше, он выходит с:
Подать заявку завершено! Ресурсы: 0 добавлено, 0 изменено, 0 уничтожено.
Выходы:
mon_vpc = 2018-06-02 23: 14: 42.958848954 +0000 UTC
Вопросы:
Я ошибаюсь, настраивая код так, чтобы среда хостов была настроена для правильного получения идентификатора VPC из уже существующего VPC (файла состояния terraform) - любой совет о том, что изменить здесь, будет оценен.
Похоже, мне удалось узнать дату создания VPC, а не его ID, что, учитывая код, вызывает недоумение - кто-нибудь знает почему?
Я не пользуюсь модулями сообщества - все раскатано вручную.
РЕДАКТИРОВАТЬ: В ответ на Брэндон Миллер, здесь немного больше. В моем модуле VPC у меня есть файл output.tf, содержащий среди прочих выходных данных:
output "aws_vpc.mv.id-op" {
value = "${aws_vpc.mv.id}"
}
и vpc.tf содержит
resource "aws_vpc" "mv" {
cidr_block = "${var.vpcCidr}"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "mv-vpc-${var.aws_region}"
}
}
Поскольку этот cfg приводит к созданию vpc, и так как большинство параметров <computed>
Я предполагал, что состояние будет содержать достаточное количество данных, чтобы другие модули могли ссылаться на него по состоянию (сначала я предположил, что terraform использовал для этого AWS API под капотом, а не обращался к другому ключу состояния).
РЕДАКТИРОВАТЬ 2: Сначала прочитайте все ответы @brendan-miller и последующие комментарии. Использование точек вызывает проблему, так как это приводит к путанице в терраформе (см. Ответ Брендана для формата спецификации ниже):
Error: output 'mon_vpc': unknown resource 'data.aws_vpc.mv-ds' referenced in variable data.aws_vpc.mv-ds.vpc.id
1 ответ
Вы назвали свой вывод aws_vpc.mv.id-op
но когда вы получаете его, вы получаете только id
, Вы могли бы попробовать
data.terraform_remote_state.vpc.aws_vpc.mv.id
но я не уверен, что Terraform будет жаловаться на дополнительные .
, Однако формат всегда должен быть
data.terraform_remote_state.<name of the remote state module>.<name of the output>
Вы упомянули, что хотите получить эту информацию с помощью API AWS. Это также возможно с помощью aws_vpc
источник данных. В их примере используется идентификатор, но вы также можете использовать любой тег, который вы использовали на своем виртуальном частном сервере.
Как это:
data "aws_vpc" "default" {
filter {
name = "tag:Name"
values = ["example-vpc-name"]
}
}
Тогда вы можете использовать это для идентификатора
${data.aws_vpc.default.id}
Кроме того, это извлекает все установленные теги, например:
${data.aws_vpc.default.tags.Name}
И блок CIDR
${data.aws_vpc.default.cidr_block}
А также некоторая другая информация. Это может быть очень полезно для хранения и получения информации о вашем VPC.