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 个实例
- my-ec2-instance1 应该分配给 ap-southeast-1a
- my-ec2-instance2 应该分配给 ap-southeast-1b
如果我想创建 3 个实例
- my-ec2-instance1 应该分配给 ap-southeast-1a
- my-ec2-instance2 应该分配给 ap-southeast-1b
- my-ec2-instance3 应该分配给 ap-southeast-1c
如果我想创建 5 个实例
- my-ec2-instance1 应该分配给 ap-southeast-1a
- my-ec2-instance2 应该分配给 ap-southeast-1b
- my-ec2-instance3 应该分配给 ap-southeast-1c
- my-ec2-instance4 应该分配给 ap-southeast-1a
- my-ec2-instance5 应该分配给 ap-southeast-1b
到目前为止我尝试了什么:
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"
}
}
我在尝试将可用区动态分配给我通过 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 个实例
- my-ec2-instance1 应该分配给 ap-southeast-1a
- my-ec2-instance2 应该分配给 ap-southeast-1b
如果我想创建 3 个实例
- my-ec2-instance1 应该分配给 ap-southeast-1a
- my-ec2-instance2 应该分配给 ap-southeast-1b
- my-ec2-instance3 应该分配给 ap-southeast-1c
如果我想创建 5 个实例
- my-ec2-instance1 应该分配给 ap-southeast-1a
- my-ec2-instance2 应该分配给 ap-southeast-1b
- my-ec2-instance3 应该分配给 ap-southeast-1c
- my-ec2-instance4 应该分配给 ap-southeast-1a
- my-ec2-instance5 应该分配给 ap-southeast-1b
到目前为止我尝试了什么:
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"
}
}