Terragrunt v0.14.9, Terraform v0.11.7, считывающий идентификатор AWS VPC из второй среды - PullRequest
0 голосов
/ 03 июня 2018

Я использовал Terragrunt для организации создания AWS VPC не по умолчанию.У меня есть состояние S3 / DynamoDB mgmt, а код VPC - это модуль.У меня есть код 'VPC environment' terraform.tfvars, проверенный во втором репо согласно terragrunt README.md .

Я создал второй модуль, который в конечном итоге создаст хосты в этомVPC, но пока просто стремится вывести свой идентификатор.Я создал отдельную «среду хостов» / terraform.tfvars для создания экземпляров этого модуля.

  1. Я запускаю terragrunt apply в каталоге среды VPC - VPC создал
  2. Я запускаюterragrunt apply второй раз в каталоге среды хоста - директива 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"
    }
}

Затем в модуле hosts outputs.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

Вопросы:

  1. Я неправильно настраиваю код так, чтобы среда хоста была настроена для правильного получения идентификатора VPC из уже существующего VPC (состояние terraform)файл) - любой совет о том, что изменить здесь, будет принят.

  2. Похоже, мне удалось получить дату создания 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 Ответ

0 голосов
/ 03 июня 2018

Вы назвали свой вывод 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.

...