terraform - 如何使 aws_subnet 资源成为下一个可用资源 cidr_block?

terraform - how to make aws_subnet resource take next available cidr_block?

我正在使用此代码:

resource "aws_subnet" "subnet" {
  vpc_id            = var.vpc_id
  cidr_block        = var.subnet_cidr_block
  availability_zone = var.availability_zone
}

在variables.tf中:

variable "subnet_cidr_block" {
  type = string
  default = "<some ip address>/<some number>"
    description = "the block for your subnet, please check on AWS which address is available in the VPC"
}

由于这是默认的 VPC,其中已经有几个子集,所以每次使用此代码时,我都需要登录 AWS 并检查下一个可用地址是什么。 transformer 有什么办法可以获取下一个可用地址并使用它吗?有什么功能吗?

谢谢。

Terraform 只能与底层 AWS API 提供的内容一起使用,据我所知,EC2 中没有用于显式 跟踪子网分配的机制一种允许您请求分配新地址而无需提前决定地址的方式。如果 EC2 API 具有这样的功能,那么原则上您可以在声明子网时完全省略 cidr_block 并让远程系统自动确定要使用的范围,其方式与声明时发生的情况类似aws_instance 而不指定特定的 private_ip。但是,API.

中没有这样的功能

对于 Terraform 本身,我们能做的最好的事情就是制作一个单独的 Terraform 配置,它本身定义了整个地址分配方案,然后使用生成的数据结构来填充所有 aws_subnet 块。这确实需要您在一个地方集中管理地址 space,因为否则没有什么可以跟踪已经分配的和没有分配的。

因为这是一种常见情况,HashiCorp 提供了 a utility module hashicorp/subnets/cidr,它列出了所有子网分配并封装了为每个子网生成 CIDR 块所需的计算:

module "subnet_addrs" {
  source = "hashicorp/subnets/cidr"

  base_cidr_block = "10.0.0.0/16"
  networks = [
    {
      name     = "us-west-2a"
      new_bits = 8
    },
    {
      name     = "us-west-2b"
      new_bits = 8
    },
  ]
}

resource "aws_vpc" "example" {
  cidr_block = module.subnet_addrs.base_cidr_block
}

resource "aws_subnet" "example" {
  for_each = module.subnet_addrs.network_cidr_blocks

  vpc_id            = aws_vpc.example.id
  availability_zone = each.key
  cidr_block        = each.value
}

该模块的自述文件解释了您需要遵守哪些规则才能随着时间的推移更改地址 space 分配而不中断现有网络,因此如果您选择使用此模块,请务必阅读除了我上面的示例(我从自述文件中复制)之外,它的文档。