如何根据变量为 EBS 卷添加附加标签?

How to add additional tag for EBS volume base on variable?

我正在使用这个 EC2 module 进行精简改动来创建 EC2 实例和 EBS 卷,代码工作没有问题,但我需要在 EBS 中添加挂载点作为标签,所以我可以使用数据过滤器获取该值并使用 Ansible 挂载它。 我试图通过 depoy-ec2.tf 配置文件将标签值添加到“动态”ebs_block_device”。根据 Terraform documentation 标签是一个可选值。无论如何,当我执行它时它提供了标签值不支持的参数错误。感谢您的支持以了解此处的问题。

我的代码如下。

模块main.tf

locals {
  is_t_instance_type = replace(var.instance_type, "/^t(2|3|3a){1}\..*$/", "1") == "1" ? true : false
}

resource "aws_instance" "this" {
  count = var.instance_count

  ami              = var.ami
  instance_type    = var.instance_type
  user_data        = var.user_data
  user_data_base64 = var.user_data_base64
  subnet_id = length(var.network_interface) > 0 ? null : element(
    distinct(compact(concat([var.subnet_id], var.subnet_ids))),
    count.index,
  )
  key_name               = var.key_name
  monitoring             = var.monitoring
  get_password_data      = var.get_password_data
  vpc_security_group_ids = var.vpc_security_group_ids
  iam_instance_profile   = var.iam_instance_profile

  associate_public_ip_address = var.associate_public_ip_address
  private_ip                  = length(var.private_ips) > 0 ? element(var.private_ips, count.index) : var.private_ip
  ipv6_address_count          = var.ipv6_address_count
  ipv6_addresses              = var.ipv6_addresses

  ebs_optimized = var.ebs_optimized

  dynamic "root_block_device" {
    for_each = var.root_block_device
    content {
      delete_on_termination = lookup(root_block_device.value, "delete_on_termination", null)
      encrypted             = lookup(root_block_device.value, "encrypted", null)
      iops                  = lookup(root_block_device.value, "iops", null)
      kms_key_id            = lookup(root_block_device.value, "kms_key_id", null)
      volume_size           = lookup(root_block_device.value, "volume_size", null)
      volume_type           = lookup(root_block_device.value, "volume_type", null)
    }
  }

  dynamic "ebs_block_device" {
    for_each = var.ebs_block_device
    content {
      delete_on_termination = lookup(ebs_block_device.value, "delete_on_termination", null)
      device_name           = ebs_block_device.value.device_name
      encrypted             = lookup(ebs_block_device.value, "encrypted", null)
      iops                  = lookup(ebs_block_device.value, "iops", null)
      kms_key_id            = lookup(ebs_block_device.value, "kms_key_id", null)
      snapshot_id           = lookup(ebs_block_device.value, "snapshot_id", null)
      volume_size           = lookup(ebs_block_device.value, "volume_size", null)
      volume_type           = lookup(ebs_block_device.value, "volume_type", null)
      tags                  = lookup(ebs_block_device.value, "mount", null)
      
    }
  }

  dynamic "ephemeral_block_device" {
    for_each = var.ephemeral_block_device
    content {
      device_name  = ephemeral_block_device.value.device_name
      no_device    = lookup(ephemeral_block_device.value, "no_device", null)
      virtual_name = lookup(ephemeral_block_device.value, "virtual_name", null)
    }
  }

  dynamic "metadata_options" {
    for_each = length(keys(var.metadata_options)) == 0 ? [] : [var.metadata_options]
    content {
      http_endpoint               = lookup(metadata_options.value, "http_endpoint", "enabled")
      http_tokens                 = lookup(metadata_options.value, "http_tokens", "optional")
      http_put_response_hop_limit = lookup(metadata_options.value, "http_put_response_hop_limit", "1")
    }
  }

  dynamic "network_interface" {
    for_each = var.network_interface
    content {
      device_index          = network_interface.value.device_index
      network_interface_id  = lookup(network_interface.value, "network_interface_id", null)
      delete_on_termination = lookup(network_interface.value, "delete_on_termination", false)
    }
  }

  source_dest_check                    = length(var.network_interface) > 0 ? null : var.source_dest_check
  disable_api_termination              = var.disable_api_termination
  instance_initiated_shutdown_behavior = var.instance_initiated_shutdown_behavior
  placement_group                      = var.placement_group
  tenancy                              = var.tenancy

  tags = merge(
    {
      "Name" = var.instance_count > 1 || var.use_num_suffix ? format("%s${var.num_suffix_format}-EC2", var.name, count.index + 1) : format("%s-EC2",var.name)
    },
    {
      "ResourceName" = var.instance_count > 1 || var.use_num_suffix ? format("%s${var.num_suffix_format}-EC2", var.name, count.index + 1) : format("%s-EC2",var.name)
    },
    {"Account" = var.Account,
    "Environment" = var.Environment, 
    "ApplicationName" = var.ApplicationName,
    "ApplicationID" = var.ApplicationID,
    "Project" = var.Project,
    "ProjectCode" = var.ProjectCode,
    "Workload" = var.Workload, 
    "Division" = var.Division, 
    "Purpose" = var.Purpose, 
    "VersionNumber" = var.VersionNumber, 
    "RelVersion" = var.RelVersion, 
    "OSVersion" = var.OSVersion, 
    "DBVersion" = var.DBVersion,
    "DataClassification" = var.DataClassification,
    "Automation" = var.Automation,
    "AWSResoureceType" = "EC2",
    "BusinessEntitiy" = var.BusinessEntitiy,
    "CostCentre" = var.CostCentre,
    "BaseImageName" = var.BaseImageName},
    var.tags,
  )

  volume_tags = merge(
    {
      "Name" = var.instance_count > 1 || var.use_num_suffix ? format("%s${var.num_suffix_format}-EBS", var.name, count.index + 1) : format("%s-EBS",var.name)
    },
    {
      "ResourceName" = var.instance_count > 1 || var.use_num_suffix ? format("%s${var.num_suffix_format}-EBS", var.name, count.index + 1) : format("%s-EBS",var.name)
    },
    
    {"Account" = var.Account,
    "Environment" = var.Environment,
    "ApplicationName" = var.ApplicationName,
    "ApplicationID" = var.ApplicationID,
    "Project" = var.Project,
    "ProjectCode" = var.ProjectCode,
    "Workload" = var.Workload,
    "Division" = var.Division,
    "Purpose" = var.Purpose,
    "VersionNumber" = var.VersionNumber,
    "RelVersion" = var.RelVersion,
    "OSVersion" = var.OSVersion,
    "DBVersion" = var.DBVersion,
    "DataClassification" = var.DataClassification,
    "Automation" = var.Automation,
    "AWSResoureceType" = "EC2",
    "BusinessEntitiy" = var.BusinessEntitiy,
    "CostCentre" = var.CostCentre,
    "BaseImageName" = var.BaseImageName},
    var.volume_tags,
  )

  credit_specification {
    cpu_credits = local.is_t_instance_type ? var.cpu_credits : null
  }
}

部署-ec2.tf

module "mn-ec2" {
    source = "../../../terraform12-modules/aws/ec2-instance"

    instance_count = var.master_nodes

    name                        = "${var.Account}-${var.Environment}-${var.ApplicationName}-${var.Project}-${var.Division}-${var.Purpose}-MN"
    ami                         = var.ami_id
    instance_type               = var.master_node_ec2_type
    subnet_ids                   = ["${data.aws_subnet.primary_subnet.id}","${data.aws_subnet.secondory_subnet.id}","${data.aws_subnet.tertiary_subnet.id}"]
    vpc_security_group_ids      = ["${module.sg-application-servers.this_security_group_id}"]
    iam_instance_profile        = "${var.iam_instance_profile}"
    key_name                    = var.key_pair_1
    
    Project                     = upper(var.Project)
    Account                     = var.Account
    Environment                 = var.Environment
    ApplicationName             = var.ApplicationName
    ApplicationID               = var.ApplicationID
    ProjectCode                 = var.ProjectCode
    Workload                    = var.Workload
    Division                    = var.Division
    RelVersion                  = var.RelVersion
    Purpose                     = var.Purpose
    DataClassification          = var.DataClassification
    CostCentre                  = var.CostCentre
    Automation                  = var.Automation
    tags = {
        node_type = "master"
    }
    volume_tags = {
        node_type = "master"
    }

    root_block_device = [
        {
        encrypted = true
        kms_key_id = var.kms_key_id
        volume_type = "gp2"
        volume_size = 250
        },
    ]
    ebs_block_device = [
        {
        device_name = "/dev/sdc"
        encrypted = true
        kms_key_id = var.kms_key_id
        volume_type = "gp2"
        volume_size = 500
        mount = "/x02"            
        },
        {
        device_name = "/dev/sdd"
        encrypted = true
        kms_key_id = var.kms_key_id
        volume_type = "gp2"
        volume_size = 1000
        mount = "/x03"            
        },
        {
        device_name = "/dev/sde"
        encrypted = true
        kms_key_id = var.kms_key_id
        volume_type = "gp2"
        volume_size = 10000
        mount = "/x04"            
        },

    ]
}

AWS 提供商的问题,它没有太多选择,所以我升级到 terraform-provider-aws_3.24.0_linux_amd64.zip 现在可以为每个 EBS 卷添加特定标签

我运行陷入了类似的问题。从 terraform-provider-aws=2 更改为 terraform-provider-aws=3 有效。