如何通过地形在所有地区部署AWS资源



我需要在我的AWS组织中的所有账户/地区部署AWS GuardDuty。我的第一步是将GuardDuty的管理委托给一个指定的帐户。由于GuardDuty是一个地区资源,我需要在所有地区执行这样的授权。请注意,我们几乎在AWS的每个地区都有业务。

这里有一种完成这项任务的暴力方法:

provider "aws" {
region  = "us-east-1"
alias   = "us-east-1"
}
provider "aws" {
region  = "us-east-2"
alias   = "us-east-2"
}
# Do the same for the remaining regions
resource "aws_guardduty_organization_admin_account" "us-east-1" {
provider = aws.us-east-1
admin_account_id = "123456789..."
}
resource "aws_guardduty_organization_admin_account" "us-east-2" {
provider = aws.us-east-2
admin_account_id = "123456789..."
}
# Do the same for the remaining regions

这是可行的,但有几个缺点:

  • 大量重复
  • 我需要记住在添加新区域时更新此代码

问题:有更好的方法吗?这里有一个关于这个场景的老话题:https://github.com/hashicorp/terraform/issues/451

然而,当时似乎没有好的选择,所以我想看看现在是否有更好的选择。

理想情况下,我希望利用data "aws_regions" "all" {}在现有区域上循环,并动态创建委派资源和提供者。

我尝试了@Matt Schuchard:建议的方法

给定此资源:

resource "aws_guardduty_organization_admin_account" "us-east-1" {
# interpolate in for expression here since not allowed in provider argument
for_each = toset([for region in data.aws_regions.this.names : "aws.${region}"])
provider         = each.value
admin_account_id = "123456789..."
}

Terraform 1.0.10,产生以下错误:

Error: Failed to query available provider packages
Could not retrieve the list of available versions for provider hashicorp/each: ...

您需要providerresource块的for_each元参数来迭代单个块内的所有AWS区域。如果尝试将for_each元参数与provider块一起使用,则错误消息显示:

提供程序参数名称"for_each";保留供Terraform在未来版本中使用。

这是未来发展的路线图。

然而,可以使用资源块中的for_each元参数来实现这一点。首先,您建议使用数据aws_regions检索所有可用区域,以始终真正针对所有区域:

data "aws_regions" "this" {}

其中CCD_ 9和CCD_。类型为CCD_ 12的导出的资源属性CCD_。

假设您正在按照问题中所述配置提供程序及其别名,那么您将在资源块中使用以下list

resource "aws_guardduty_organization_admin_account" "us-east-1" {
# interpolate in for expression here since not allowed in provider argument
for_each = toset([for region in data.aws_regions.this.names : "aws.${region}"])
provider         = each.value
admin_account_id = "123456789..."
}

并且这将管理所有期望的AWS区域中的资源。

最新更新