具有不同字段的模块的 Terragrunt 多个实例

Terragrunt Multiple Instances Of Module With Varying Fields

我很难理解如何镜像我在 Terragrunt 中习惯使用的本机 Terraform 模块实例化结构。采用以下创建 sns topic module.

不同实例的 Terraform 结构
module "sns_topic" {
  source  = "terraform-aws-modules/sns/aws"
  version = "~> 3.0"

  name  = "my-topic"
}

module "sns_topic_two" {
  source  = "terraform-aws-modules/sns/aws"
  version = "~> 3.0"

  name  = "my-topic-two"
  content_based_deduplication              = true
}

module "sns_topic_three" {
  source  = "terraform-aws-modules/sns/aws"
  version = "~> 3.0"

  name  = "my-topic-three"
  http_success_feedback_role_arn           = x
  http_success_feedback_sample_rate        = y
  http_failure_feedback_role_arn           = z
}
...

任何 fields in the module itself 都可以填充该模块的给定实例。

我不明白如何在 Terragrunt via their Inputs 中完成此操作,因为模块的每个实例都可能因字段使用而异。例如,在 sns 模块中,您可以拥有使用 content_based_deduplication 的主题 A、使用 lambda_success_feedback_role_arn 的主题 B 和使用完全不同字段的主题 C,并且您可能在环境中有 100 个不同的主题。在本机 Terraform 中,您只需实例化每个模块,如上所示。但是如何通过 Terragrunt 做到这一点?

(免责声明:以下内容仅代表我的理解和工作流程,可能不是决定性的:))

我的理解是,虽然您可以在顶级模块中编写本机 Terraform,但最佳做法是将其移动到另一个模块,从 terragrunt.hcl 文件中的 terraform 块调用。该模块充当编排层。我认为这个想法是 Terragrunt 项目的顶层可能代表你在每个项目中广泛想要相同资源的东西(例如开发、测试、生产),所以使用这个编排模块可以让你干掉那些代码,而不是在顶级目录之间复制它。

因此,在您的情况下,我认为您需要编写一个看起来有点像这样的模块,并从您的 terragrunt.hcl 文件中调用:

top_level/main.tf

variable "sns_topics" {
  type = map(map(string))
}

module "sns_topic" {
  source   = "terraform-aws-modules/sns/aws"
  version  = "~> 3.0"
  for_each = var.sns_topics

  name                           = each.key 
  content_based_deduplication    = lookup(each.value, "content_based_deduplication", null)
  http_success_feedback_role_arn = lookup(each.value, "http_success_feedback_role_arn", null)
}

然后 terragrunt.hcl 中的 inputs 可能看起来有点像这样:

inputs = {
  sns_topics = {
    sns_topic = {},
    sns_topic_two = {
      content_based_deduplication = true
    },
    sns_topic_three = {
      http_success_feedback_role_arn = "x"
    }
  }
}

最后,您将在 terragrunt.hcl

terraform 块中调用 top_level 模块
terraform {
  source = "git::git@github.com:<your_account>/modules.git//top_level?ref=v0.0.1"
}

注意:在 lookup 函数中使用 null 作为默认值,在特定主题地图不包含该特定键的情况下,应该会导致该参数被省略。

Terragrunt 文档中的

This page 详细讨论了这种方法。