部署 EC2 实例时 Terraform 条件动态 ebs_block_device
Terraform conditional dynamic ebs_block_device while deploying EC2 instances
我正在尝试使用条件 ebs_block_device
创建多个 EC2 实例。这是输入对象:
"Ec2Instances" : [
{
"AmiId" : "",
"VpcId" : "vpc-c2401eaa",
"KeyName" : "",
"SubnetId" : "subnet-82e4c4eb",
"PrivateIp" : "null",
"VolumeSize" : 100,
"VolumeType" : "null",
"Ec2InstanceName" : "test",
"Ec2InstanceType" : "t2.micro"
},
{
"AmiId" : "",
"VpcId" : "vpc-c2401eaa",
"KeyName" : "",
"SubnetId" : "subnet-82e4c4eb",
"PrivateIp" : "null",
"VolumeSize" : 0,
"VolumeType" : "null",
"Ec2InstanceName" : "null",
"Ec2InstanceType" : "t2.micro"
}]
我正在尝试编写一个逻辑,其中只有 VolumeSize
不为 0 时才应创建 ebs_block_device
卷。计数在块中不起作用,所以我不确定是否这可以通过 terraform 来实现。
resource "aws_instance" "virtual_machine" {
count = length(var.Ec2Instances)
depends_on = [
aws_network_interface.bootstrap_cluster_network_interface
]
ami = var.Ec2Instances[count.index].AmiId == "" || var.Ec2Instances[count.index].AmiId == null || var.Ec2Instances[count.index].AmiId == "null" ? data.aws_ami.ec2_vm.id : var.Ec2Instances[count.index].AmiId
instance_type = var.Ec2Instances[count.index].Ec2InstanceType == "" || var.Ec2Instances[count.index].Ec2InstanceType == null || var.Ec2Instances[count.index].Ec2InstanceType == "null" ? "${local.default_instance_type}" : var.Ec2Instances[count.index].Ec2InstanceType
key_name = var.Ec2Instances[count.index].KeyName == null || var.Ec2Instances[count.index].KeyName == "" || var.Ec2Instances[count.index].KeyName == "null" ? local.key_name : var.Ec2Instances[count.index].KeyName
network_interface {
network_interface_id = aws_network_interface.bootstrap_cluster_network_interface[count.index].id
device_index = 0
}
root_block_device {
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = sum([lookup(local.custom_amis, var.Ec2Instances[count.index].AmiId, 40), var.Ec2Instances[count.index].VolumeSize == null || var.Ec2Instances[count.index].VolumeSize == "" || var.Ec2Instances[count.index].VolumeSize == "" ? 0 : var.Ec2Instances[count.index].VolumeSize])
encrypted = true
tags = "${merge(
tomap({
Name = var.Ec2Instances[count.index].Ec2InstanceName == "" || var.Ec2Instances[count.index].Ec2InstanceName == null || var.Ec2Instances[count.index].Ec2InstanceName == "null" ? "${local.VolumeName}-${count.index}" : "${var.Ec2Instances[count.index].Ec2InstanceName}-volume"}), var.Tags
)}"
}
ebs_block_device {
device_name = "/dev/sda2"
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = var.Ec2Instances[count.index].VolumeSize
encrypted = true
}
}
你可以dynamic blocks。假设代码中的其他所有内容都是正确的,您可以这样做:
resource "aws_instance" "virtual_machine" {
count = length(var.Ec2Instances)
depends_on = [
aws_network_interface.bootstrap_cluster_network_interface
]
ami = var.Ec2Instances[count.index].AmiId == "" || var.Ec2Instances[count.index].AmiId == null || var.Ec2Instances[count.index].AmiId == "null" ? data.aws_ami.ec2_vm.id : var.Ec2Instances[count.index].AmiId
instance_type = var.Ec2Instances[count.index].Ec2InstanceType == "" || var.Ec2Instances[count.index].Ec2InstanceType == null || var.Ec2Instances[count.index].Ec2InstanceType == "null" ? "${local.default_instance_type}" : var.Ec2Instances[count.index].Ec2InstanceType
key_name = var.Ec2Instances[count.index].KeyName == null || var.Ec2Instances[count.index].KeyName == "" || var.Ec2Instances[count.index].KeyName == "null" ? local.key_name : var.Ec2Instances[count.index].KeyName
network_interface {
network_interface_id = aws_network_interface.bootstrap_cluster_network_interface[count.index].id
device_index = 0
}
root_block_device {
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = sum([lookup(local.custom_amis, var.Ec2Instances[count.index].AmiId, 40), var.Ec2Instances[count.index].VolumeSize == null || var.Ec2Instances[count.index].VolumeSize == "" || var.Ec2Instances[count.index].VolumeSize == "" ? 0 : var.Ec2Instances[count.index].VolumeSize])
encrypted = true
tags = "${merge(
tomap({
Name = var.Ec2Instances[count.index].Ec2InstanceName == "" || var.Ec2Instances[count.index].Ec2InstanceName == null || var.Ec2Instances[count.index].Ec2InstanceName == "null" ? "${local.VolumeName}-${count.index}" : "${var.Ec2Instances[count.index].Ec2InstanceName}-volume"}), var.Tags
)}"
}
dynamic "ebs_block_device" {
for_each = var.Ec2Instances[count.index].VolumeSize > 0 ? [1] : []
content {
device_name = "/dev/sda2"
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = var.Ec2Instances[count.index].VolumeSize
encrypted = true
}
}
}
我正在尝试使用条件 ebs_block_device
创建多个 EC2 实例。这是输入对象:
"Ec2Instances" : [
{
"AmiId" : "",
"VpcId" : "vpc-c2401eaa",
"KeyName" : "",
"SubnetId" : "subnet-82e4c4eb",
"PrivateIp" : "null",
"VolumeSize" : 100,
"VolumeType" : "null",
"Ec2InstanceName" : "test",
"Ec2InstanceType" : "t2.micro"
},
{
"AmiId" : "",
"VpcId" : "vpc-c2401eaa",
"KeyName" : "",
"SubnetId" : "subnet-82e4c4eb",
"PrivateIp" : "null",
"VolumeSize" : 0,
"VolumeType" : "null",
"Ec2InstanceName" : "null",
"Ec2InstanceType" : "t2.micro"
}]
我正在尝试编写一个逻辑,其中只有 VolumeSize
不为 0 时才应创建 ebs_block_device
卷。计数在块中不起作用,所以我不确定是否这可以通过 terraform 来实现。
resource "aws_instance" "virtual_machine" {
count = length(var.Ec2Instances)
depends_on = [
aws_network_interface.bootstrap_cluster_network_interface
]
ami = var.Ec2Instances[count.index].AmiId == "" || var.Ec2Instances[count.index].AmiId == null || var.Ec2Instances[count.index].AmiId == "null" ? data.aws_ami.ec2_vm.id : var.Ec2Instances[count.index].AmiId
instance_type = var.Ec2Instances[count.index].Ec2InstanceType == "" || var.Ec2Instances[count.index].Ec2InstanceType == null || var.Ec2Instances[count.index].Ec2InstanceType == "null" ? "${local.default_instance_type}" : var.Ec2Instances[count.index].Ec2InstanceType
key_name = var.Ec2Instances[count.index].KeyName == null || var.Ec2Instances[count.index].KeyName == "" || var.Ec2Instances[count.index].KeyName == "null" ? local.key_name : var.Ec2Instances[count.index].KeyName
network_interface {
network_interface_id = aws_network_interface.bootstrap_cluster_network_interface[count.index].id
device_index = 0
}
root_block_device {
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = sum([lookup(local.custom_amis, var.Ec2Instances[count.index].AmiId, 40), var.Ec2Instances[count.index].VolumeSize == null || var.Ec2Instances[count.index].VolumeSize == "" || var.Ec2Instances[count.index].VolumeSize == "" ? 0 : var.Ec2Instances[count.index].VolumeSize])
encrypted = true
tags = "${merge(
tomap({
Name = var.Ec2Instances[count.index].Ec2InstanceName == "" || var.Ec2Instances[count.index].Ec2InstanceName == null || var.Ec2Instances[count.index].Ec2InstanceName == "null" ? "${local.VolumeName}-${count.index}" : "${var.Ec2Instances[count.index].Ec2InstanceName}-volume"}), var.Tags
)}"
}
ebs_block_device {
device_name = "/dev/sda2"
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = var.Ec2Instances[count.index].VolumeSize
encrypted = true
}
}
你可以dynamic blocks。假设代码中的其他所有内容都是正确的,您可以这样做:
resource "aws_instance" "virtual_machine" {
count = length(var.Ec2Instances)
depends_on = [
aws_network_interface.bootstrap_cluster_network_interface
]
ami = var.Ec2Instances[count.index].AmiId == "" || var.Ec2Instances[count.index].AmiId == null || var.Ec2Instances[count.index].AmiId == "null" ? data.aws_ami.ec2_vm.id : var.Ec2Instances[count.index].AmiId
instance_type = var.Ec2Instances[count.index].Ec2InstanceType == "" || var.Ec2Instances[count.index].Ec2InstanceType == null || var.Ec2Instances[count.index].Ec2InstanceType == "null" ? "${local.default_instance_type}" : var.Ec2Instances[count.index].Ec2InstanceType
key_name = var.Ec2Instances[count.index].KeyName == null || var.Ec2Instances[count.index].KeyName == "" || var.Ec2Instances[count.index].KeyName == "null" ? local.key_name : var.Ec2Instances[count.index].KeyName
network_interface {
network_interface_id = aws_network_interface.bootstrap_cluster_network_interface[count.index].id
device_index = 0
}
root_block_device {
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = sum([lookup(local.custom_amis, var.Ec2Instances[count.index].AmiId, 40), var.Ec2Instances[count.index].VolumeSize == null || var.Ec2Instances[count.index].VolumeSize == "" || var.Ec2Instances[count.index].VolumeSize == "" ? 0 : var.Ec2Instances[count.index].VolumeSize])
encrypted = true
tags = "${merge(
tomap({
Name = var.Ec2Instances[count.index].Ec2InstanceName == "" || var.Ec2Instances[count.index].Ec2InstanceName == null || var.Ec2Instances[count.index].Ec2InstanceName == "null" ? "${local.VolumeName}-${count.index}" : "${var.Ec2Instances[count.index].Ec2InstanceName}-volume"}), var.Tags
)}"
}
dynamic "ebs_block_device" {
for_each = var.Ec2Instances[count.index].VolumeSize > 0 ? [1] : []
content {
device_name = "/dev/sda2"
volume_type = var.Ec2Instances[count.index].VolumeType == "" || var.Ec2Instances[count.index].VolumeType == "null" || var.Ec2Instances[count.index].VolumeType == null ? "${local.default_volume_type}" : var.Ec2Instances[count.index].VolumeType
volume_size = var.Ec2Instances[count.index].VolumeSize
encrypted = true
}
}
}