将标签应用于为每个Terraform创建的实例

问题描述

我为每个创建了多个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.

任何有关如何修复的建议都将有所帮助。谢谢!

解决方法

如果要使标签动态化,可以按如下方式创建它们:

TextFormField

您将按以下方式使用它(假设其他一切都OK):

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

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

如果each.key等于“ 0”(即正在创建的第一个实例),则其标签将为“ PrimaryEC2”。对于剩余的所有子网,将标记所有剩余的实例:“ EC2Worker1”,“ EC2Worker2”,“ EC2Worker3”,等等。

,

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...