【问题标题】:How do you choose an unused VPC CIDR Block with Terraform?如何使用 Terraform 选择未使用的 VPC CIDR 块?
【发布时间】:2020-11-09 13:09:01
【问题描述】:

设置:我将使用 terraform 以编程方式创建环境。已经存在一些 VPC,我想确保在使用 terraform 创建新 VPC 时不会与现有 VPC 发生冲突。

第一步,我可以用这个得到世界的当前状态

data "aws_vpcs" "current" { }

但我不确定如何选择不在列表中的 IP 地址。例如,我们使用172.x.0.0/16 作为格式。

在 terraform 中,如何选择当前未使用的最小 x?

【问题讨论】:

    标签: amazon-web-services terraform amazon-vpc


    【解决方案1】:

    单独的 Terraform 不适合这种动态分配任务,因为结果会不稳定:如果您假设编写一个 Terraform 配置以找到分配的最高 CIDR 块,然后将其用于新的aws_vpc,那么下一次你运行 Terraform,它会发现分配的最高 CIDR 块已经改变,然后计划用更大的数字替换 VPC,并一直这样做,直到 IP 地址空间用完。 Terraform 数据资源在运行之间没有任何“内存”,因为它们旨在允许 Terraform 配置适应其周围不断变化的环境。

    取而代之的是,您更喜欢自上而下的手动分配方法还是动态的“按需分配”方法。从您的问题看来,您更喜欢其中的第二个,但我将首先讨论第一个,因为它是我更常见且更直接的一个。


    对于自上而下的手动分配,您可以编写一个 Terraform 模块,其唯一目的是描述来自您的 IP 地址空间的分配。每次您要分配新的地址空间时,您首先要更改该模块以包括为其地址空间的新分配,然后使用其结果为您当前的配置选择适当的基地址范围。 Terraform Registry 中有一个名为 hashicorp/subnets/cidr 的模块,旨在通过定义 some simple rules for backward-compatible changes to allocations later 来更轻松地构建这样的模块。

    (上面的一个变体是使用一个专门为网络地址空间编目而设计的系统,比如NetBox,但最终这些都归结为同一件事:一个集中管理的地址空间分配注册表,由人和软件可以参考。)


    对于“按需分配”方法,您需要一些单独的系统来响应分配请求并记住分配给每个系统的地址空间,以便它可以保证在未来的 Terraform 上始终将相同的分配返回给每个调用者运行。这样的系统可能需要一个持久的数据存储,以便它可以为每个调用者调用一个地址范围是否已经分配给它,如果是,则返回相同的分配而不是创建一个新的分配。

    我个人不知道有任何专门用于此任务的软件,但您可以自己构建一个简单的服务,该服务通过返回一个新分配的或以前的地址范围来响应包含系统标识符的 HTTP 请求 -使用系统标识符作为唯一键分配:

    data "http" "cidr_block" {
      url = "https://example.com/cidr-block-allocation/example-system"
    }
    
    locals {
      cidr_block = chomp(data.http.cidr_block.body)
    }
    

    在上面我假设这个假设的端点返回一个 text/plain 响应,其中只包含 CIDR 表示法中的地址范围,但它可能是一个 JSON 响应,例如使用 Terraform 的 jsondecode 函数解析。

    data 块与您最初问题中的块之间的重要区别在于,分配的内容的持久记录存在于运行在example.com 的服务器中,与 AWS 中存在的 VPC 无关,因此创建了一个新的指定地址范围内的 VPC 不会更改未来请求的答案。

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多