Terragrunt v0.14.9, Terraform v0.11.7 чтение AWS VPC ID из второй среды

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

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

  1. Я запускаю terragrunt apply в каталоге среды VPC - VPC создан
  2. Я запускаю terragrunt apply второй раз в каталоге среды хостов - директива вывода не работает (ошибки нет, но неверно, см. Ниже).

Это предшествует тому, чтобы однажды запустить 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"
    }
}

Затем в модуле outputs.tf hosts я указал вывод для проверки назначения:

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 (файл состояния терраформирования) - любой совет о том, что здесь изменить, будет оценен.

  2. Похоже, мне удалось получить дату создания VPC, а не его идентификатор, что, учитывая код, вызывает недоумение - кто-нибудь знает, почему?

Модули сообщества не использую - все ручная работа.

РЕДАКТИРОВАТЬ: В ответ Брэндону Миллеру, вот немного больше. В моем модуле VPC у меня есть outputs.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 использует API AWS для этого под капота, вместо того, чтобы обращаться к другому ключу состояния).

РЕДАКТИРОВАТЬ 2: сначала прочтите весь ответ @ brendan-miller и следующие комментарии. Использование точек вызывает проблему, так как сбивает с толку терраформ (см. Ответ Брендана о формате спецификации ниже):

Error: output 'mon_vpc': unknown resource 'data.aws_vpc.mv-ds' referenced in variable data.aws_vpc.mv-ds.vpc.id

person volvox    schedule 02.06.2018    source источник
comment
Как вы объявляете вывод для своего vpc в удаленном состоянии?   -  person Brandon Miller    schedule 03.06.2018
comment
@ brandon-miller Я отредактировал сообщение, чтобы отразить мои заявления. Дайте мне знать, если это ответит на ваш вопрос.   -  person volvox    schedule 03.06.2018
comment
спасибо, надеюсь, моя помощь в прояснении ситуации   -  person Brandon Miller    schedule 03.06.2018


Ответы (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. В их примере используется идентификатор, но вы также можете использовать любой тег, который вы использовали на своем 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.

person Brandon Miller    schedule 03.06.2018
comment
@ brendan-miller да, я думал, что периоды могут вызвать проблемы, но победило использование фильтра aws_vpc data source. Chrs! - person volvox; 04.06.2018
comment
Приятно знать, что месячные не вызывают проблем! - person Brandon Miller; 04.06.2018
comment
Нет, извините, я должен был протестировать оба по отдельности. Смотрите мой EDIT2. - person volvox; 04.06.2018