我有一个管理AWS GuardDuty的Terraform模块。
在模块中,声明了aws_guardduty_detector
资源。尽管我需要为列表中的每个区域配置这些资源之一,但该资源不允许指定区域。所使用的区域显然需要由提供者声明(?)。
缺少module for_each似乎是问题的一部分,或者至少,模块for_each(如果存在)可能会让我对每个区域都声明一次整个模块。
因此,我想知道是否有可能以某种方式为列表中的每个区域声明一个提供程序?
或者,除了编写Shell脚本包装程序或进行code generation之外,还有其他干净的方法可以解决我可能没有想到的问题吗?
答案 0 :(得分:1)
为支持类似的流程,我发现了解决此问题的两种方法
.tfvars
文件。对于第一个选项,在一个文件中包含多个AWS提供程序可能会很混乱。您必须给每个别名一个别名,然后每次创建resource
时,都必须在资源上设置provider
属性,以便Terraform知道要针对哪个区域提供者执行。此外,如果其中一个区域的提供程序无法初始化,则可能是该区域已关闭,则整个脚本将无法运行,直到您将其删除或该区域已备份。
对于第二个选项,您可以为需要设置的资源编写Terraform,然后只需多次运行模块,每个区域.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
我们根据环境和/或地区放置了可能需要为服务或功能更改的所有变量。例如,在测试环境中,发电机的容量可能会比生产环境中的低。