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