【问题标题】:Terraform cidrsubnet function troubleshootTerraform cidrsubnet 功能故障排除
【发布时间】:2021-02-28 04:34:38
【问题描述】:

我有一种情况,我正在尝试使用 Terraform 中的 cidrsubnet 函数动态创建一些子网。这是我的定义:

data "aws_availability_zones" "availability_zones" {
  exclude_names = [
    "us-west-2c",
    "us-west-2d"
  ]
}
locals {
  availability_zone_names = "${data.aws_availability_zones.availability_zones.names}"
}

resource "aws_subnet" "public_subnets" {
  count = "${length(local.availability_zone_names)}"
  vpc_id = "${aws_vpc.vpc.id}"
  cidr_block = "${cidrsubnet(aws_vpc.vpc.cidr_block, 11, count.index)}"
  availability_zone = "${local.availability_zone_names[count.index]}"
  map_public_ip_on_launch = true

  tags {
    Name = "${var.name}-public.${local.availability_zone_names[count.index]}"
  }
}

我只是尝试在该区域的两个可用区中创建这些子网(因此我排除了 2 个可用区。应用此代码后,我在尝试创建的子网之一中得到了我想要的结果. 但是,我试图获取 10.32.2.0/27 的地址的另一个子网的 cidr 块地址,但 cidrsubnet 函数正在生成 10.32.0.32/27。任何我出错的建议都会有所帮助。

计划产出

aws_subnet.public_subnets[1]
  id:                              <computed>
  arn:                             <computed>
  assign_ipv6_address_on_creation: "false"
  availability_zone:               "us-west-2b"
  availability_zone_id:            <computed>
  cidr_block:                      "10.32.0.32/27"

【问题讨论】:

  • 什么是aws_vpc.vpc.cidr_block
  • VPC cidr 为 10.32.0.0/16

标签: amazon-web-services terraform public subnet


【解决方案1】:

如果您想使用前缀 /27 并希望您的子网是:

10.32.0.0/27
10.32.2.0/27
10.32.4.0/27

以此类推,那么您必须将索引乘以 16,因为这些 CIDR 范围不是连续的:

cidr_block = "${cidrsubnet(aws_vpc.vpc.cidr_block, 11, count.index * 16)}"

【讨论】:

  • cidrsubnet 函数文档有 a section on the details of IP addressing 这可能是有用的背景,如果不清楚为什么这里需要乘以 16。使用您自己的基本 CIDR 块和前缀长度来查看每个操作如何更改地址可能会提供有用的信息。
  • 谢谢马丁。我确实看到了该文档,但对它的理解仍然有些困惑。我有一个问题希望得到你的解释。由于我的 newbits 值设置为 11,这意味着我的 vpc cidr 前缀的长度为 27。在计算 netnum 参数时,我将如何解释分解 27 位?
猜你喜欢
  • 2011-01-31
  • 2012-11-10
  • 2012-10-31
  • 2023-03-21
  • 1970-01-01
  • 2013-07-15
  • 2010-11-30
  • 2021-09-11
  • 2012-02-18
相关资源
最近更新 更多