问题描述
我为每个创建了多个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个(不存在的元素)时,这将导致错误。