gpt4 book ai didi

terraform - 使用 terragrunt generate provider block 导致与模块中的 require providers block 发生冲突

转载 作者:行者123 更新时间:2023-12-02 02:18:44 25 4
gpt4 key购买 nike

我将 Terragrunt 与 Terraform 版本 0.14.8 结合使用。

我的项目使用单存储库结构,因为项目要求将 Terragrunt 文件和 Terraform 模块打包在一个包中。

文件夹结构:

project root:
├── environments
│   └── prd
│   ├── rds-cluster
│   │   └── terragrunt.hcl
│   └── terragrunt.hcl
└── modules
├── rds-cluster
│   ├── README.md
│   ├── main.tf
│   ├── output.tf
│   └── variables.tf
└── secretsmanager-secret
├── README.md
├── main.tf
├── output.tf
└── variables.tf

在 prd/terragrunt.hcl 中,我定义了远程状态 block 和生成提供程序 block 。

remote_state {
backend = "s3"
...
}

generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"

contents = <<EOF
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}

provider "aws" {
region = "ca-central-1"
}
EOF
}

在 environments/prd/rds-cluster/terragrunt.hcl 中,我定义了以下内容:

include {
path = find_in_parent_folders()
}

terraform {
source = "../../../modules//rds-cluster"
}

inputs = {
...
}

在 modules/rds-cluster/main.tf 中,我定义了以下内容:

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 3.0"
}
}
}

// RDS related resources...

我的问题是,当我尝试在 environments/prd/rds-cluster 下运行 terragrunt plan 时,我收到以下错误消息:

Error: Duplicate required providers configuration

on provider.tf line 3, in terraform:
3: required_providers {

A module may have only one required providers configuration. The required
providers were previously configured at main.tf:2,3-21.

我可以通过在提供程序 block 中声明版本来解决此问题,如图所示 here .但是,provider block 中的版本属性一直是 deprecated in Terraform 0.13 ; Terraform 建议改用 terraform block 下的 required_providers 子 block 。

有人知道我需要做什么才能为我的 aws 提供商使用新的 required_providers block 吗?

最佳答案

如您所见,Terraform 期望每个模块仅具有其所需提供程序的一个定义,这是为了避免在声明分布在多个文件中时不清楚为什么 Terraform 检测到特定的情况。

然而,为了支持这种零碎的代码生成用例,Terraform 有一个名为 Override Files 的高级功能。这允许您明确标记某些文件以进行不同的处理模式,在这种模式下它们有选择地覆盖其他文件的特定定义,而不是创建全新的定义。

此机制的细节取决于您要覆盖的 block 类型,但关于 Merging terraform blocks` 的部分讨论与您的特定情况相关的行为:

If the required_providers argument is set, its value is merged on an element-by-element basis, which allows an override block to adjust the constraint for a single provider without affecting the constraints for other providers.

In both the required_version and required_providers settings, each override constraint entirely replaces the constraints for the same component in the original block. If both the base block and the override block both set required_version then the constraints in the base block are entirely ignored.

上面的实际含义是,如果你有一个 required_providers 的覆盖文件包含 AWS 提供商条目的 block ,那么 Terraform 会将其视为对非覆盖文件中已存在的任何类似条目的完全替换,但它不会影响未出现在覆盖文件中的其他提供商要求条目全部。

将所有这些放在一起,您应该能够通过要求 Terragrunt 将此生成的文件命名为 provider_override.tf 来获得您正在寻找的结果。而不仅仅是 provider.tf ,然后将激活覆盖文件处理行为,从而允许此生成的文件覆盖 AWS 提供商要求的任何现有定义,同时允许配置保留它们可能也在定义的任何其他提供商要求。

关于terraform - 使用 terragrunt generate provider block 导致与模块中的 require providers block 发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66770564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com