Разрешение пути Terragrunt - модули с локальными ссылками - разделение на несколько сред

По причинам, связанным с бизнесом, я не могу разделить свою инфраструктуру с помощью модулей с поддержкой версий. Поскольку по-прежнему выгодно разделять среды, и я хотел бы избежать использования корневых модулей копирования / вставки, которые в основном представляют собой просто создание экземпляров дочерних модулей, в нескольких каталогах, каждый из которых представляет свою собственную среду, я хотел бы указать источник корневой модуль в terragrunt.hcl

Чтобы облегчить жизнь, я построил небольшую часть существующей инфраструктуры с помощью всего лишь одного модуля, чтобы ускорить разработку.

Текущая структура проекта выглядит так:

├── config
│   ├── common.tfvars
│   └── terragrunt.hcl
├── environments
│   └── dev
├── infrastructure-modules
│   └── ecs
├── terraform-modules
│   ├── terraform-aws-ecr

Вся моя инфраструктура описана в infrastructure-modules/ecs/*.tf файлах, которые, по сути, просто создают экземпляры дочерних модулей, объявленных в terraform-modules/terraform-aws-*/.

После этого я могу просто выполнить terragrunt (команды терраформирования) из каталога infrastructure-modules/ecs.

Чтобы иметь возможность создать такую ​​же среду в другой учетной записи, я ввел новый каталог environments/dev/eu-central-1/ecs, как показано в выводе дерева из корневого каталога.

environments/dev/eu-central-1/ecs состоит всего из двух файлов: terragrunt.hcl и common.tfvars.

Я предполагаю, что использование common.tfvars говорит само за себя, где мой terragrunt.hcl состоит из блоков remote_state {} и terraform {}.

Важная часть конфигурационного файла terragrunt:

remote_state {}

terraform {
  source = "../../../../infrastructure-modules/ecs"

  {...}
}

Выше я в основном ссылаюсь на свои корневые модули, объявленные в infrastructure-modules/ecs/*.tf. Где мои корневые модули создают экземпляры дочерних модулей, объявленных в terraform-modules/terraform-aws-*/.

Дочерние модули из infrastructure-modules/ecs/*.tf создаются следующим образом:

module my_module {
  source = "../../terraform-modules/terraform-aws-*"

  {...}
}

В идеальном мире я мог бы выполнять команды terragrunt (terraform) из каталога environments/dev/eu-central-1/ecs, но поскольку я использую локальные (относительные) пути, это не удается во время инициализации модулей, поскольку корневой модуль my_module загружает дочерний модуль по следующему относительному пути:

module my_module {
  source = "../../terraform-modules/terraform-aws-*"

  {...}
}

Это приводит к сбою создания экземпляра модуля в environments/dev/eu-central-1/ecs, поскольку относительный путь отличается от экземпляра родительского модуля.

Initializing modules...
- my_module in 

Error: Unreadable module directory

Unable to evaluate directory symlink: lstat ../../terraform-modules: no such
file or directory

Пока, согласно документации, path_relative_* должен иметь возможность возвращать относительный путь между путем, указанным в его включаемом блоке, и текущим terragrunt.hcl, но проблема здесь в том, что у меня нет никаких блоков include {} внутри мои terragrunt.hcl файлы, и поэтому этот подход не работает. Символические ссылки - последний вариант.

ИЗМЕНИТЬ

Если я проверю .terragrunt-cache/* на пути environments/dev/eu-central-1/ecs, я могу подтвердить, что все корневые модули были загружены (скопированы) в каталог кеша.

Однако экземпляр модуля создается таким образом, и он пытается получить фактические модули (модули Terraform) из каталога двумя уровнями выше.

module my_modules {
  source = "../..//terraform-modules/terraform-aws-ecr"

По сути, мне нужно сказать Terragrunt, чтобы он загружал / извлекал модули по другому пути.

ИЗМЕНИТЬ 2:

Проверка .terragrunt-cache в каталоге, в котором я использую init, показывает, что terraform-modules никогда не загружаются в terraform-infrastructure/environments/dev/eu-central-1/ecs/.terragrunt-cache/.

Если я поменяю свой terraform-infrastructure/infrastructure-modules/ecs/ecr-repos.tf, с

module ecr_lz_ingestion {
  source = "../../terraform-modules//terraform-aws-ecr"

{<MODULE_ARGUMENTS>}
  }
}

to:

module ecr_lz_ingestion {
  source = "../../../../../../../../terraform-modules//terraform-aws-ecr"

{<MODULE_ARGUMENTS>}
  }
}

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

Каким-то образом я ожидаю, что Terragrunt загрузит оба каталога, terraform-modules и infrastructure-modules, чтобы относительные пути в экземпляре модуля работали.


person Alan Kis    schedule 31.08.2020    source источник
comment
Используете ли вы двойную косую черту в пути к модулю?   -  person rkm    schedule 31.08.2020
comment
Я пробовал как с //, так и без него.   -  person Alan Kis    schedule 31.08.2020


Ответы (1)


На основании предоставленной вами дополнительной информации я понимаю, что это ваша текущая структура каталогов:

terraform-infrastructure
├── config
│   ├── common.tfvars
│   └── terragrunt.hcl
├── environments
│   └── dev
│       └── eu-central-1
│           └── ecs
│               └── terragrunt.hcl
├── infrastructure-modules
│   └── ecs
├── terraform-modules
│   ├── terraform-aws-ecr
│   
├── terragrunt.hcl

Обратите внимание на terragrunt.hcl в родительском каталоге, который я добавил.

Этот terragrunt.hcl считается родительским файлом и может включать код, который можно использовать совместно с другими файлами terragrunt.

Он может включать что-то вроде этого:


remote_state {}

В папке eu-central-1/ecs добавьте в свой файл terragrunt следующее:


include {
  // searches up the directory tree from the current terragrunt.hcl file 
  // and returns the absolute path to the first terragrunt.hcl
  path = find_in_parent_folders()
}

  // using the path relative from the path stated in the include block
terraform {
  source = "${path_relative_from_include()}//infrastructure-modules”
}

Это должно сохранить относительный путь неизменным при создании экземпляров дочерних модулей.

Изменить:

Из вашей проблемы с GitHub было бы лучше либо переместить двойную косую черту туда, где модули имеют общий путь. Либо так, либо просто объединить ваши модули в одну папку.

person Peter Kay    schedule 31.08.2020
comment
Нет нет родителя terrragrunt.hcl. Однако в любом случае Terraform не работает, поскольку он не может разрешить модули в `Infrastructure / modules / ecs. - person Alan Kis; 01.09.2020
comment
Не могли бы вы добавить родительский файл terragrunt, чтобы использовать его в качестве якоря? - person Peter Kay; 01.09.2020
comment
Какой родительский каталог для всей коллекции папок? - person Peter Kay; 01.09.2020
comment
Думаю, что сейчас я понимаю суть. Родительский каталог terraform-infrastructure, так как у меня внутри есть другие каталоги, связанные с докером. - person Alan Kis; 01.09.2020
comment
@AlanKis Я обновил свой ответ возможным решением. Дай мне знать, если это работает. - person Peter Kay; 01.09.2020
comment
Вы пытались удалить свой локальный штат и выполнить повторную инициализацию? - person Peter Kay; 02.09.2020
comment
Всегда и удаление .terragrunt-cache. Я смог решить проблему после открытия проблемы с Github. github.com/gruntwork-io/terragrunt/issues/1324.Feel Бесплатно обновить ответ, и я с радостью его приму. - person Alan Kis; 03.09.2020
comment
@AlanKis потрясающий! Я рада, что все получилось. Важно только то, что вы можете решить свою проблему. Отредактировано. - person Peter Kay; 03.09.2020