【问题标题】:Applying tags to instances created with for each Terraform将标签应用于为每个 Terraform 创建的实例
【发布时间】:2020-12-01 13:18:18
【问题描述】:

我为每个实例创建了多个 EC2 实例。每个实例都部署到不同的子网中。尝试将标签应用于正在部署的每个实例时出现错误。任何意见将是有益的。以下是我的标签和实例的代码:

resource "aws_instance" "private" {
  for_each      = aws_subnet.private
  ami           = var.ec2_amis[var.region]
  instance_type = var.tableau_instance
  key_name      = aws_key_pair.tableau.key_name
  subnet_id     = each.value.id

  tags = {
    Name = var.ec2_tags[each.key]
  }
}

variable "ec2_tags" {
  type = list(string)
  default = [
    "PrimaryEC2",
    "EC2Worker1",
    "EC2Worker2"
  ]
}

错误

Error: Invalid index

  on vpc.tf line 21, in resource "aws_instance" "private":
  21:     Name = var.ec2_tags[each.key]
    |----------------
    | each.key is "3"
    | var.ec2_tags is list of string with 3 elements

The given key does not identify an element in this collection value.

我之前有这段代码工作过,不知道发生了什么。我对它启动的 AMI 进行了更改,但我不明白为什么这会对标签产生影响。任何建议都会有所帮助。

更新 我在“aws_instance”“私有”代码中使用以下本地块和动态块更新了资源:

locals {
  private_instance = [{
    name = "PrimaryEC2"
    },
    {
      name = "EC2Worker1"
    },
    {
      name = "EC2Worker2"
  }]
}


    dynamic "tags" {
    for_each = local.private_instance

    content {
      Name = tags.value.name
    }
  }

错误

Error: Unsupported block type

  on vpc.tf line 28, in resource "aws_instance" "private":
  28:   dynamic "tags" {

Blocks of type "tags" are not expected here.

任何解决方法的建议都会有所帮助。谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-ec2 foreach


    【解决方案1】:

    如果你想让你的标签动态化,你可以按如下方式创建它们:

      tags = {
        Name = each.key == "0" ? "PrimaryEC2" : "EC2Worker${each.key}" 
      }
    

    您可以按如下方式使用它(假设一切正常):

    resource "aws_instance" "private" {
      for_each      = aws_subnet.private
      ami           = var.ec2_amis[var.region]
      instance_type = var.tableau_instance
      key_name      = aws_key_pair.tableau.key_name
      subnet_id     = each.value.id
    
      tags = {
        Name = each.key == "0" ? "PrimaryEC2" : "EC2Worker${each.key}" 
      }
    }
    

    代码使用conditional expression。它的工作原理如下。

    如果 each.key 等于“0”(即创建第一个实例),则其标签将为“PrimaryEC2”。所有剩余的实例都将被标记为:“EC2Worker1”、“EC2Worker2”、“EC2Worker3”等等,用于尽可能多的子网。

    【讨论】:

    • 嗨@Marcin,如果你能详细说明这个语法,那将会很有帮助。我不太确定我是否理解您的指定方式。我将使用我的动态块和错误的新代码更新问题。
    【解决方案2】:

    此错误的一个可能原因是aws_subnet.private 变量比 ec2 标记列表长,当在 ec2_tags 列表中使用索引 3 查找第 4 个(不存在的元素)时,这将导致错误。

    【讨论】:

    • 我明白了。这就说得通了。也许如果我使用动态“标签”块,那可能会有所帮助。我会试试的。
    • 正如所写,每个子网都有一个实例,并且可能会用完名称标签。也许名称到子网的映射或迭代名称可能会产生所需的行为。
    猜你喜欢
    • 2021-12-09
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多