首页 > 解决方案 > 来自两个 terraform 映射的子网之间的随机播放作为 ec2 实例创建的输入

问题描述

对于每个环境,我都有两组 CIDR,我希望 terraform 在创建新实例时在两组之间随机播放。

我查看了 terraformrandom_shuffle提供程序和合并功能,但这些并没有为我的问题提供解决方案。

resource "aws_subnet" "myapp" {
  cidr_block = "${cidrsubnet(var.vpc_cidr[terraform.workspace], 5, count.index + 16 + 5)}"
}

variable "vpc_cidr" {
  type = "map"

  default = {
    QA   = "20.30.100.0/23"
    TEST = "20.37.200.0/23"
    PROD = "20.37.200.0/23"
    DEV  = "20.37.100.0/23"
  }
}

locals {
  "vpc_cidr_2" = {
    QA   = "10.30.182.0/23"
    TEST = "10.37.238.0/23"
    PROD = "<none>"
    DEV  = "<none>"
  }
}

我希望根据 vpc_cidr 或 vpc_cidr2 计算 cidr_block 并在每个之间随机播放。如果找到,它还需要检查并回退到另一张地图。

注意:vpc_cidr是变量,vpc_cidr_2而是局部变量。

标签: amazon-web-servicesterraform

解决方案


random_shuffle是您应该使用的正确资源,但您需要改变将变量和本地变量混合在一起的想法。

resource "aws_subnet" "myapp" {
  vpc_id     = "${aws_vpc.main.id}"
  cidr_block = "${cidrsubnet(lookup(var.vpc_cidr[random_shuffle.vpc_cidr.result], terraform.workspace), 5, count.index + 16 + 5)}"
}

resource "random_shuffle" "vpc_cidr" {
  input = ["vpc_cidr", "vpc_cidr_2"]
}

variable "vpc_cidr" {
  type = "map"

  default = {
    vpc_cidr = {
      "QA"   = "20.30.100.0/23"
      "TEST" = "20.37.200.0/23"
      "PROD" = "20.37.200.0/23"
      "DEV"  = "20.37.100.0/23"
    }

    vpc_cidr_2 = {
      "QA"   = "10.30.182.0/23"
      "TEST" = "10.37.238.0/23"
      "PROD" = "<none>"
      "DEV"  = "<none>"
    }
  }
}

推荐阅读