Terraform 查找 AWS 区域

Bra*_*rad 7 amazon-web-services terraform

我的 main.tf 文件中有以下代码:

provider "aws" {
  access_key = "${var.aws_access_key}"
  secret_key = "${var.aws_secret_key}"
  region     = "us-east-1"
  alias      = "us-east-1"
}

provider "aws" {
  access_key = "${var.aws_access_key}"
  secret_key = "${var.aws_secret_key}"
  region     = "us-west-1"
  alias      = "us-west-1"
}

module "us-east_vpc" {
  source = "./setup-networking"

  providers = {
    "aws.region" = "aws.us-east-1"
  }
}

module "us-west_vpc" {
  source = "./setup-networking"

  providers = {
    "aws.region" = "aws.us-west-1"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的模块文件中,我有:

provider "aws" {
  alias = "region"
}

resource "aws_vpc" "default" {
  provider             = "aws.region"
  cidr_block           = "${lookup(var.vpc_cidr, ${aws.region.region})}"
  enable_dns_hostnames = true

  tags {
    Name = "AWS VPC"
  }
}

resource "aws_internet_gateway" "default" {
  provider = "aws.region"
  vpc_id   = "${aws_vpc.default.id}"
}

resource "aws_subnet" "default" {
  provider = "aws.region"
  vpc_id   = "${aws_vpc.default.id}"

  cidr_block        = "${lookup(var.subnet_cidr, ${aws.region.region})}"
  availability_zone = "aws.region"

  tags {
    Name = "AWS Subnet"
  }
}

resource "aws_route_table" "default" {
  provider = "aws.region"
  vpc_id   = "${aws_vpc.default.id}"

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = "${aws_internet_gateway.default.id}"
  }

  tags {
    Name = "Main Gateway"
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您在模块文件代码中看到的那样,我正在尝试查找以从映射变量中查找 VPC CIDR 掩码和子网 CIDR 掩码。

问题是我似乎无法弄清楚如何将区域用作查找值。

如果我硬编码这些值:

cidr_block = "10.10.0.0/16"
cidr_block = "10.10.10.0/24"
Run Code Online (Sandbox Code Playgroud)

该脚本按预期工作,但我不想对值进行硬编码。

有更多 Terraform 经验的人可以帮助我了解如何正确引用该区域以查找正确的值吗?

小智 10

我正在为不同的问题寻找相同的答案。我想获取角色名称的区域,我可以通过执行以下操作获取信息:

1.- 创建一个文件data.tf并添加以下信息:

data "aws_region" "current" {}
Run Code Online (Sandbox Code Playgroud)

2.- 通过在任何 TF 文件中调用此变量来从数据中获取信息:

name = "${var.vpc-name}-${data.aws_region.current.name}-Bastion-Role"
Run Code Online (Sandbox Code Playgroud)

这样,它将获得您正在执行代码的区域,而您不必弄乱provider.tf文件。

  • 这是最好的答案。 (2认同)

yda*_*coR 9

您可以使用aws_region数据源获取提供者当前正在使用的区域。

因此,在您的情况下,您可以执行以下操作:

provider "aws" {
  alias = "region"
}

data "aws_region" "current" {
  provider = "aws.region"
}

resource "aws_vpc" "default" {
  provider             = "aws.region"
  cidr_block           = "${lookup(var.vpc_cidr, ${data.aws_region.current.name})}"
  enable_dns_hostnames = true

  tags {
    Name = "AWS VPC"
  }
}

...
Run Code Online (Sandbox Code Playgroud)

  • 理解 - 这就是为什么我将您的答案标记为已接受。:) 但我只是想为可能偶然发现这篇文章的其他人提供一个工作示例。再次感谢你的帮助!我真的很困惑。 (2认同)