首页 > 解决方案 > 使用 Terraform 从共享快照创建多个 AWS EBS 卷并用快照描述标记它们

问题描述

如标题所述,我正在尝试从共享快照创建多个 AWS EBS。

我正在使用数据“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不返回描述,只是一个 ID 列表。所以我必须使用带有for_each循环的数据“aws_ebs_snapshot”来获取描述,它返回一个快照的映射。

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 是否可以实现,或者我需要使用其他东西。

标签: terraformterraform-provider-aws

解决方案


您可以使用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
  }
}

推荐阅读