为区域列表声明多个提供商

时间:2019-10-29 02:37:40

标签: terraform

我有一个管理AWS GuardDuty的Terraform模块。

在模块中,声明了aws_guardduty_detector资源。尽管我需要为列表中的每个区域配置这些资源之一,但该资源不允许指定区域。所使用的区域显然需要由提供者声明(?)。

缺少module for_each似乎是问题的一部分,或者至少,模块for_each(如果存在)可能会让我对每个区域都声明一次整个模块。

因此,我想知道是否有可能以某种方式为列表中的每个区域声明一个提供程序?

或者,除了编写Shell脚本包装程序或进行code generation之外,还有其他干净的方法可以解决我可能没有想到的问题吗?

1 个答案:

答案 0 :(得分:1)

为支持类似的流程,我发现了解决此问题的两种方法

  1. 在Terraform模块中声明多个AWS提供程序。
  2. 将模块写为使用单个提供程序,然后为要执行的每个区域创建一个单独的.tfvars文件。

对于第一个选项,在一个文件中包含多个AWS提供程序可能会很混乱。您必须给每个别名一个别名,然后每次创建resource时,都必须在资源上设置provider属性,以便Terraform知道要针对哪个区域提供者执行。此外,如果其中一个区域的提供程序无法初始化,则可能是该区域已关闭,则整个脚本将无法运行,直到您将其删除或该区域已备份。

对于第二个选项,您可以为需要设置的资源编写Terraform,然后只需多次运行模块,每个区域.tfvars文件只需运行一次。

  • prod-us-east-1.tfvars
  • prod-us-west-1.tfvars
  • prod-eu-west-2.tfvars

我更喜欢使用第二个选项,因为该模块更简单且重复更少。唯一的重复是在.tfvars文件中,并且应该更易于管理。

编辑:添加了一些示例.tfvars

prod-us-east-1.tfvars:

region = "us-east-1"
account_id = "0000000000"
tags = {
    env = "prod"
}
dynamodb_read_capacity = 100
dynamodb_write_capacity = 50

prod-us-west-1.tfvars:

region = "us-west-1"
account_id = "0000000000"
tags = {
    env = "prod"
}
dynamodb_read_capacity = 100
dynamodb_write_capacity = 50

我们根据环境和/或地区放置了可能需要为服务或功能更改的所有变量。例如,在测试环境中,发电机的容量可能会比生产环境中的低。