Terraform AWS - 如何将可用性区域动态分配给创建的实例数

Terraform AWS - How to dynamically assign availability zones to number of instances created

我在尝试将可用区动态分配给我通过 Terraform 创建的 ec2 实例时遇到了问题。

上下文:我创建了一个 shell 脚本来接受用户输入以指定要创建的实例数。根据实例的数量,我想使用 for 或 for_each 循环将每个创建的实例分配给特定的可用区。

shell 脚本

##create ec2 on AWS
#!/bin/bash

echo "Starting EC2 Set up..."

echo "Specify number of EC2 instances to create : "
read number_of_instances

echo "You made a request for $number_of_instances to be created"

terraform validate

terraform apply -var instance_count=${number_of_instances}

main.tf

resource "aws_instance" "my-ec2-instance" {
  ami             = var.ami
  count           = var.instance_count
  key_name        = var.key_name
  instance_type   = var.instance_type
  subnet_id       = var.subnet_id
  security_groups = [data.aws_security_group.my-sec-group.id]

  availability_zone = ##How do I dynamically assign an availability zone here##

  tags = {
    Name    = "my-ec2-instance-tag${count.index + 1}"
    Project = "my terraform project"
  }
}

我的 ec2 的预期输出:

如果我想创建 2 个实例

如果我想创建 3 个实例

如果我想创建 5 个实例

到目前为止我尝试了什么:

variable.tf

variable "availability_zone_map" {
    description = "Availability zone for instance"
    type        = map
    default     = {
        "ap-southeast-1a" = 1 
        "ap-southeast-1b" = 2
        "ap-southeast-1c" = 3
    }
        
}

main.tf

resource "aws_instance" "my-ec2-instance" {
  ami             = var.ami
  count           = var.instance_count
  key_name        = var.key_name
  instance_type   = var.instance_type
  subnet_id       = var.subnet_id
  security_groups = [data.aws_security_group.my-sec-group.id]
  for_each        = var.availability_zone_map
  availability_zone = each.key

  tags = {
    Name    = "my-ec2-instance-tag${count.index + 1}"
    Project = "my terraform project"
  }
}

这绝对是错误的,因为资源将无法同时接收计数和 for_each。

如果有人能帮助我解决这个问题,我将不胜感激?谢谢!

根据评论,目的是在 AWS 中创建一个自动缩放组。

为此你需要两个组件:

因此,您将创建相应的 aws_launch_template

而不是您的 "my-ec2-instance

模板将引用 ASG 的属性 launch_template

instance_count 将分配给 ASG 的 desired_capacity

如果打算使用 ASG,那么 Marcin 的答案是最好的方向。

如果您出于任何原因仍想手动管理 EC2 实例(我遇到过 ASG 无法选择的类似情况),那么以下内容将为您提供所需的内容。

variable "availability_zones" {
    description = "Availability zones for instance"
    type        = list
    default     = [
        "ap-southeast-1a" = 1 
        "ap-southeast-1b" = 2
        "ap-southeast-1c" = 3
    ]
        
}

resource "aws_instance" "my-ec2-instance" {
  ami             = var.ami
  count           = var.instance_count
  key_name        = var.key_name
  instance_type   = var.instance_type
  subnet_id       = var.subnet_id
  security_groups = [data.aws_security_group.my-sec-group.id]
  availability_zone = var.availability_zones[ count %  var.instance_count]

  tags = {
    Name    = "my-ec2-instance-tag${count.index + 1}"
    Project = "my terraform project"
  }
}