1

出于与业务相关的原因,我无法使用版本化模块拆分我的基础架构。由于拆分环境仍然有益,并且我想避免复制/粘贴根模块,它们基本上只是子模块的实例化,在多个目录中,每个目录代表自己的环境,我想指定的来源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.hclcommon.tfvars

我想,common.tfvars的用法是不言自明的,我的terragrunt.hclremote_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-modulesinfrastructure-modules让模块实例化中的相对路径起作用。

4

1 回答 1

2

根据您提供的其他信息,我了解这是您当前的目录结构:

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 问题中,最好将双斜杠移动到模块共享公共路径的位置。或者只是将您的模块合并到一个文件夹中。

于 2020-08-31T18:55:31.373 回答