出于与业务相关的原因,我无法使用版本化模块拆分我的基础架构。由于拆分环境仍然有益,并且我想避免复制/粘贴根模块,它们基本上只是子模块的实例化,在多个目录中,每个目录代表自己的环境,我想指定的来源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-*/
.
infrastructure-modules/ecs
有了它,我可以简单地从目录中执行 terragrunt(terraform 命令) 。
为了有可能在另一个帐户中创建相同的环境,我引入了一个新目录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-*"
{...}
}
在理想的世界中,我将能够从environments/dev/eu-central-1/ecs
目录执行 terragrunt (terraform) 命令,但是由于我使用的是本地(相对)路径,因此在模块初始化期间这会失败,因为根模块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/*
on 路径environments/dev/eu-central-1/ecs
,我可以确认所有“根”模块都已下载(复制)到缓存目录中。
但是,模块是这样实例化的,它会尝试从上面两级的目录中获取实际的模块(Terraform 模块)。
module my_modules {
source = "../..//terraform-modules/terraform-aws-ecr"
所以基本上,我需要告诉 Terragrunt 从其他路径下载/获取模块。
编辑2:
检查我正在运行的目录中的 .terragrunt-cacheinit
显示,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>}
}
}
至:
module ecr_lz_ingestion {
source = "../../../../../../../../terraform-modules//terraform-aws-ecr"
{<MODULE_ARGUMENTS>}
}
}
Terraform 能够初始化子模块,因为我terraform-modules/
在根目录中给出了相对路径,这显然是一种解决方法。
不知何故,我期待 Terragrunt 下载这两个目录,terraform-modules
并infrastructure-modules
让模块实例化中的相对路径起作用。