如何在 Terraform 模块提供者的元参数中使用条件语句

80次阅读
没有评论

问题描述

在使用 Terraform 进行资源配置时,用户在一个模块中通过另一个模块来创建多个资源。用户希望根据条件动态选择模块中的提供者配置。然而,尝试在模块提供者的元参数中使用条件语句时,遇到了错误。

用户尝试了以下方式,但都遇到了问题:
1. 使用条件表达式直接在模块提供者的元参数中定义条件。
2. 将模块提供者的元参数作为普通参数处理,但仍然遇到了错误。

他想知道是否有一种本机的方法来在同一个模块声明中根据条件切换不同的提供者配置,而不需要复制代码或基于条件的 count 元参数。

解决方案

请注意以下操作可能在不同的 Terraform 版本中有所差异,根据需要做好备份和测试。

虽然在 Terraform 中无法直接根据条件来动态选择资源的提供者配置,但可以通过在提供者配置块内部使用动态表达式来实现类似的效果。下面是一个解决方案示例:

方案

在模块提供者的配置块中,使用动态表达式来根据条件设置提供者的配置参数。具体步骤如下:

  1. 在根模块的配置中,定义用于条件判断的变量,比如 region
  2. 在模块提供者的配置块中,使用动态表达式根据条件设置提供者的参数。

以下是一个示例代码,展示了如何根据条件选择不同的提供者配置:

variable "region" {
  description = "Desired region for provider"
}

provider "my_provider" {
  alias  = "for_test_module"
  region = var.region == "region1" ? "region1" : "default"
}

module "test" {
  source = "../modules/my-module"
  providers = {
    my_provider = my_provider.for_test_module
  }
  vpc_id     = module.vpc.vpc_id
  subnet_ids = module.subnets.ids
}

在上面的示例中,我们首先定义了一个名为 region 的变量,用于指定期望的提供者配置区域。然后,在模块提供者的配置块中,使用条件表达式根据 var.region 的值来选择不同的 region 参数。这样,无论变量 region 的值是什么,都可以根据条件选择不同的提供者配置参数,从而达到类似的效果。

需要注意的是,这个解决方案不是在模块级别动态选择不同的提供者配置,而是在模块提供者配置块内部使用动态表达式来动态设置参数,以实现类似的效果。

正文完