[英]Applying tags to instances created with for each 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.
任何如何解決的建議都會有所幫助。 謝謝!
如果你想讓你的標簽動態化,你可以按如下方式創建它們:
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}"
}
}
該代碼使用條件表達式。 它的工作原理如下。
如果 each.key 等於“0”(即,正在創建第一個實例),則其標簽將為“PrimaryEC2”。 所有剩余的實例都將被標記為:“EC2Worker1”、“EC2Worker2”、“EC2Worker3”等等,用於盡可能多的子網。
此錯誤的一個可能原因是aws_subnet.private
變量比 ec2 標簽列表長,當您在 ec2_tags 列表中使用索引 3 查找第 4 個(不存在的元素)時,這將導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.