使用 Terraform 从共享快照创建多个 AWS EBS 卷并使用快照描述标记它们
Using Terraform to create multiple AWS EBS volumes from shared snapshot and tagging them with snapshot description
如标题所述,我正在尝试从共享快照创建多个 AWS EBS。
我正在使用 data "aws_ebs_snapshot_ids" 获取快照列表,然后使用 for_each 创建EBS 卷。所以像这样
data "aws_ebs_snapshot_ids" "shared_snapshot_ids" {
filter {
name = "description"
values = ["snap-test*"]
}
}
resource "aws_ebs_volume" "shared_snapshot_volume" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_id = each.value
availability_zone = "us-west-1b"
现在我想用快照描述标记这些卷,但是 数据 "aws_ebs_snapshot_ids doesn't return description, just a list of IDs. So I have to use data "aws_ebs_snapshot" 带有 for_each 循环获取描述,它 returns 快照的地图。
data "aws_ebs_snapshot" "shared_snapshot" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_ids = ["${each.value}"]
}
output "shared_snapshot" {
value = data.aws_ebs_snapshot.shared_snapshot
}
"snap-0000000000001" = {
"data_encryption_key_id" = ""
"description" = "snap-test-2"
"encrypted" = false
"id" = "snap-0000000000001"
"kms_key_id" = ""
"most_recent" = false
"owner_alias" = ""
"owner_id" = ""
"snapshot_id" = "snap-0000000000001"
"snapshot_ids" = [
"snap-0000000000001",
]
"state" = "completed"
"tags" = {}
"volume_id" = ""
"volume_size" = 100
}
"snap-0000000000000" = {
"data_encryption_key_id" = ""
"description" = "snap-test-1"
"encrypted" = false
"id" = "snap-0000000000000"
"kms_key_id" = ""
"most_recent" = false
"owner_alias" = ""
"owner_id" = ""
"snapshot_id" = "snap-0000000000000"
"snapshot_ids" = [
"snap-0000000000000",
]
"state" = "completed"
"tags" = {}
"volume_id" = "vol-0000000000000"
"volume_size" = 8
}
}
我不知道 Terraform 如何或是否可以做到这一点,但我想它需要类似于
resource "aws_ebs_volume" "shared_snapshot_volume" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_id = each.value
availability_zone = "us-west-1b"
tags = {
Name = data.aws_ebs_snapshot.shared_snapshot.[${each.value}].description
}
}
这不起作用,因为它是嵌套插值。请让我知道这是否适用于 Terraform,或者我需要使用其他东西。
您可以使用 aws_ebs_snapshot 数据源获取这些快照 ID 的详细信息:
data "aws_ebs_snapshot" "shared_snapshots" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_ids = [each.value]
}
然后您可以使用 snapshot_id 和 描述 等详细属性构建您的 EBS 卷,如下所示:
resource "aws_ebs_volume" "shared_snapshot_volume" {
for_each = data.aws_ebs_snapshot.shared_snapshots
snapshot_id = each.value.snapshot_id
availability_zone = "us-west-1b"
tags = {
Name = each.value.description
}
}
如标题所述,我正在尝试从共享快照创建多个 AWS EBS。
我正在使用 data "aws_ebs_snapshot_ids" 获取快照列表,然后使用 for_each 创建EBS 卷。所以像这样
data "aws_ebs_snapshot_ids" "shared_snapshot_ids" {
filter {
name = "description"
values = ["snap-test*"]
}
}
resource "aws_ebs_volume" "shared_snapshot_volume" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_id = each.value
availability_zone = "us-west-1b"
现在我想用快照描述标记这些卷,但是 数据 "aws_ebs_snapshot_ids doesn't return description, just a list of IDs. So I have to use data "aws_ebs_snapshot" 带有 for_each 循环获取描述,它 returns 快照的地图。
data "aws_ebs_snapshot" "shared_snapshot" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_ids = ["${each.value}"]
}
output "shared_snapshot" {
value = data.aws_ebs_snapshot.shared_snapshot
}
"snap-0000000000001" = {
"data_encryption_key_id" = ""
"description" = "snap-test-2"
"encrypted" = false
"id" = "snap-0000000000001"
"kms_key_id" = ""
"most_recent" = false
"owner_alias" = ""
"owner_id" = ""
"snapshot_id" = "snap-0000000000001"
"snapshot_ids" = [
"snap-0000000000001",
]
"state" = "completed"
"tags" = {}
"volume_id" = ""
"volume_size" = 100
}
"snap-0000000000000" = {
"data_encryption_key_id" = ""
"description" = "snap-test-1"
"encrypted" = false
"id" = "snap-0000000000000"
"kms_key_id" = ""
"most_recent" = false
"owner_alias" = ""
"owner_id" = ""
"snapshot_id" = "snap-0000000000000"
"snapshot_ids" = [
"snap-0000000000000",
]
"state" = "completed"
"tags" = {}
"volume_id" = "vol-0000000000000"
"volume_size" = 8
}
}
我不知道 Terraform 如何或是否可以做到这一点,但我想它需要类似于
resource "aws_ebs_volume" "shared_snapshot_volume" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_id = each.value
availability_zone = "us-west-1b"
tags = {
Name = data.aws_ebs_snapshot.shared_snapshot.[${each.value}].description
}
}
这不起作用,因为它是嵌套插值。请让我知道这是否适用于 Terraform,或者我需要使用其他东西。
您可以使用 aws_ebs_snapshot 数据源获取这些快照 ID 的详细信息:
data "aws_ebs_snapshot" "shared_snapshots" {
for_each = toset(data.aws_ebs_snapshot_ids.shared_snapshot_ids.ids)
snapshot_ids = [each.value]
}
然后您可以使用 snapshot_id 和 描述 等详细属性构建您的 EBS 卷,如下所示:
resource "aws_ebs_volume" "shared_snapshot_volume" {
for_each = data.aws_ebs_snapshot.shared_snapshots
snapshot_id = each.value.snapshot_id
availability_zone = "us-west-1b"
tags = {
Name = each.value.description
}
}