如何将使用 cidrsubnets 的子网的 CIDR 范围传递给 Terraform 版本 0.14 中的 VPC 模块

Posted

技术标签:

【中文标题】如何将使用 cidrsubnets 的子网的 CIDR 范围传递给 Terraform 版本 0.14 中的 VPC 模块【英文标题】:How to pass CIDR range for subnets using cidrsubnets to VPC module in Terraform Version 0.14 【发布时间】:2021-07-25 08:10:37 【问题描述】:

Terraform cidrsubnets 为我提供了我想要的以下子网。

我正在使用的 Terraform 版本:Terraform v0.14.9

> cidrsubnets("172.16.0.0/18", 6, 6, 6, 6)
tolist([
  "172.16.0.0/24",
  "172.16.1.0/24",
  "172.16.2.0/24",
  "172.16.3.0/24",
])
Requirement
==========
Main CIDR range = 172.16.0.0/18
Public Subnets = [172.16.0.0/24, 172.16.1.0/24]
Private Subents = [172.16.2.0/24, 172.16.3.0/24]

如何使用上述 CIDR 范围为公共子网和私有子网传递 Terraform cidrsubnets 函数到下面的 VPC 模块。

variable "vpc_cidr" 
  default = "172.16.0.0/18"


data "aws_availability_zones" "azs" 
  state = "available"


module "vpc" 
  
  source  = "terraform-aws-modules/vpc/aws"
  version = "2.77.0"

  name                 = "my-vpc"
  cidr                 = var.vpc_cidr
  azs                  = data.aws_availability_zones.azs.names
  private_subnets      = ["172.16.1.0/24", "172.16.2.0/24"] <= I want to pass these subnets from cidrsubnets function
  public_subnets       = ["172.16.3.0/24", "172.16.4.0/24"] <= I want to pass these subnets from cidrsubnets function
  enable_nat_gateway   = true
  single_nat_gateway   = true
  enable_dns_hostnames = true




有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

您可以在cidrsubnets 之上使用slice 函数。由于cidrsubnets 将返回一个列表,因此根据索引对其进行切片,您将获得 2 个包含公共和私有 IP 的列表:

module "vpc" 
  ...
  private_subnets      = slice(cidrsubnets(var.vpc_cidr, 6, 6, 6, 6),0,2)
  public_subnets       = slice(cidrsubnets(var.vpc_cidr, 6, 6, 6, 6),2,4)
  ...


【讨论】:

以上是关于如何将使用 cidrsubnets 的子网的 CIDR 范围传递给 Terraform 版本 0.14 中的 VPC 模块的主要内容,如果未能解决你的问题,请参考以下文章

AWS VPC 模块公有和私有子网 - Terraform

CIDR 子网是不是有本机 .NET 类型?

子网划分的CIDR

如何将 IP 地址与子网匹配并获取 SUM

如何使用 mySQL 工作台连接到 AWS 私有子网 VPC 中的 RDS

如何使用python获取ip和子网掩码地址[关闭]