【问题标题】:Launch EC2 servers in multiple subnets using count with terraform使用 terraform 计数在多个子网中启动 EC2 服务器
【发布时间】:2022-01-19 01:33:35
【问题描述】:

我有一个用例,我设置了变量 instance_count = 3,我有 2 个 Private_subnets,这是一个列表 ["subnet-id-A", "subnet-id-B"],我希望我的 terraform 代码动态生成本地地图或列表,可以是这样的

subnets = {
01 = subnet-id-A
02 = subnet-id-B
03 = subnet-id-A
}
OR
subnets = ["subnet-id-A","subnet-id-B","subnet-id-A"]

如果实例数达到 4 则可能是这样的

subnets = {
01 = subnet-id-A
02 = subnet-id-B
03 = subnet-id-A
04 = subnet-id-B
}
OR
subnets = ["subnet-id-A","subnet-id-B","subnet-id-A","subnet-id-B"]

如果实例数变为 2,则可能是这样的

subnets = {
01 = subnet-id-A
02 = subnet-id-B
}
OR
subnets = ["subnet-id-A","subnet-id-B"]

【问题讨论】:

  • 不是生成实际列表,而是使用模运算符(相当于subnet_id = local.subnets[count.index % length(local.subnets)])是一种可接受的解决方案吗?
  • @KaustubhKhavnekar 这很有用,但是,我使用 element(var.subnet_ids,each.value - 1) 在单独的 AZ 中启动了 ec2。由于 element 函数很好地处理了索引并且我们永远不会超出索引,因此无论 EC2 服务的计数有多大,都会将其启动到单独的子网中,子网的选择将是循环的。

标签: amazon-web-services amazon-ec2 terraform-provider-aws infrastructure-as-code private-subnet


【解决方案1】:

Subnet_ids 是一个包含所有私有子网的列表。

这里是代码

locals {
 formatted_count = [for index in range(var.instance_count) : format("0%s", index + 1)]
 instances_count = toset(local.formatted_count)
}
   module "ec2" {
   for_each                    = local.instances_count
   source                      = "terraform-aws-modules/ec2-instance/aws"
   version                     = "3.2.0"
   name                        = var.name
   ami                         = var.ami
   instance_type               = var.instance_type
   key_name                    = var.key_name
   monitoring                  = var.monitoring
   tags                        = var.tags
   vpc_security_group_ids      = var.vpc_security_group_ids
   subnet_id                   = element(var.subnet_ids,each.value - 1)
   }

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2021-09-20
    • 2012-05-08
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多