部署 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
        }
    }

}