具有不同字段的模块的 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 详细讨论了这种方法。
我很难理解如何镜像我在 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
作为默认值,在特定主题地图不包含该特定键的情况下,应该会导致该参数被省略。
This page 详细讨论了这种方法。