Ank*_*ngh 7 amazon-web-services terraform
有没有更好的方法来优化下面的代码,这样我就不必一次又一次地请求可用区,而是可以一次性完成。由于区域是可变的,所以我无法定义硬编码的可用区域。你们可以吗我希望我的公共子网是 /24
provider "aws" {
region = var.region
}
resource "aws_vpc" "app_vpc" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = var.vpc_name
}
}
data "aws_availability_zones" "available" {
state = "available"
}
#provision public subnet
resource "aws_subnet" "public_subnet_01" {
vpc_id = aws_vpc.app_vpc.id
cidr_block = var.public_subnet_01
availability_zone = data.aws_availability_zones.available.names[0]
tags = {
Name = "public_subnet_01"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
resource "aws_subnet" "public_subnet_02" {
vpc_id = aws_vpc.app_vpc.id
cidr_block = var.public_subnet_02
availability_zone = data.aws_availability_zones.available.names[1]
tags = {
Name = "public_subnet_02"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
resource "aws_subnet" "public_subnet_03" {
vpc_id = aws_vpc.app_vpc.id
cidr_block = var.public_subnet_03
availability_zone = data.aws_availability_zones.available.names[2]
tags = {
Name = "public_subnet_03"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
Run Code Online (Sandbox Code Playgroud)
数据源需要考虑的一个重要危险aws_availability_zones是可用区域集可能会随着时间的推移而变化,因此编写配置非常重要,这样您就不会陷入 Terraform 认为您打算替换子网的情况您当前正在使用,因此无法销毁。
其中的一个关键部分是确保 Terraform 了解每个子网属于特定的可用区域,以便当可用区域集发生更改时,Terraform 可以为新可用区域添加新子网或删除现有子网。现在已删除的可用区域,不会影响其他未更改的区域。实现这一目标的最简单方法是将资源for_each与可用区域集一起使用:
resource "aws_subnet" "public" {
for_each = aws_avaiability_zones.available.names
# ...
}
Run Code Online (Sandbox Code Playgroud)
上面将声明子网实例的地址,每个实例都包含可用区域名称,如下所示:
aws_subnet.public["eu-west-1a"]aws_subnet.public["eu-west-1b"]aws_subnet.public["eu-west-1e"]由于它们是由可用区名称标识的,因此 Terraform 可以看到每个子网都属于特定的可用区。
特别是对于子网来说,还有一个额外的挑战:我们必须为每个子网分配自己的 CIDR 块,这意味着我们需要一种系统的方法将 IP 地址空间分配给可用区域,以便网络不会因未来的集合更改而重新编号可用区。
数据aws_availability_zone源的文档包括一个声明映射表的示例,该映射表为每个区域和每个可用区分配一个 1 到 14 之间的数字,然后使用该数字填充 IP 地址的一个八位位组,为每个(区域)创建一个单独的前缀。 ,AZ)对。该示例仅创建一个 VPC 和一个子网,但我们可以通过使用for_each对每个可用区执行此操作来扩展它,只要我们在使用新区域或新可用区后缀时更新映射表即可指定字母(每个字母最多 14 个):
variable "region_number" {
# Arbitrary mapping of region name to number to use in
# a VPC's CIDR prefix.
default = {
us-east-1 = 1
us-west-1 = 2
us-west-2 = 3
eu-central-1 = 4
ap-northeast-1 = 5
}
}
variable "az_number" {
# Assign a number to each AZ letter used in our configuration
default = {
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
# and so on, up to n = 14 if that many letters are assigned
}
}
data "aws_region" "current" {}
# Determine all of the available availability zones in the
# current AWS region.
data "aws_availability_zones" "available" {
state = "available"
}
# This additional data source determines some additional
# details about each VPC, including its suffix letter.
data "aws_availability_zone" "all" {
for_each = aws_avaiability_zones.available.names
name = each.key
}
# A single VPC for the region
resource "aws_vpc" "example" {
cidr_block = cidrsubnet("10.1.0.0/16", 4, var.region_number[data.aws_region.current.name])
}
# A subnet for each availability zone in the region.
resource "aws_subnet" "example" {
for_each = aws_availability_zone.all
vpc_id = aws_vpc.example.id
availability_zone = each.key
cidr_block = cidrsubnet(aws_vpc.example.cidr_block, 4, var.az_number[each.value.name_suffix])
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我们在 工作us-west-2并且存在可用区us-west-2a和us-west-2c,则上面将声明:
aws_vpc.example具有 CIDR 块的单个10.1.48.0/20,其中 48 是十六进制 0x30 的十进制表示形式,其中 3 是 us-west-2 的数字。aws_subnet.example["us-west-2a"]具有us-west-2aCIDR 块的子网10.1.49.0/24,其中 49 是十六进制 0x31 的十进制表示形式。aws_subnet.example["us-west-2c"]具有us-west-2cCIDR 块的子网10.1.51.0/24,其中 51 是十六进制 0x33 的十进制表示形式。请注意, 没有子网10.1.50.0/24,因为 50(十六进制 0x32)是为假设的 保留的us-west-2b。通过按子网号静态分配这些地址,我们可以确保它们不会随着可用区域的添加和删除而随时间而变化。
您可以使用count和cidrsubnets自动创建子网。
一个例子是:
resource "aws_subnet" "public_subnet" {
count = length(data.aws_availability_zones.available.names)
vpc_id = aws_vpc.app_vpc.id
cidr_block = cidrsubnet(aws_vpc.app_vpc.cidr_block, 8, count.index)
availability_zone = data.aws_availability_zones.available.names[count.index]
tags = {
Name = "public_subnet_${count.index}"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
Run Code Online (Sandbox Code Playgroud)
上面将自动在每个可用区中创建子网,并为其分配 cidr 块(/24,假设 vpc 为 /16)。
| 归档时间: |
|
| 查看次数: |
9417 次 |
| 最近记录: |