【问题标题】:Create EBS snapshot using Terraform and count()使用 Terraform 和 count() 创建 EBS 快照
【发布时间】:2019-07-11 03:36:32
【问题描述】:

我想为所有 gp2 类型的 EBS 卷创建快照。我有以下代码:

data "aws_ebs_volume" "ebs_volumes" {
  filter {
    name   = "volume-type"
    values = ["gp2"]
  }
}

resource "aws_ebs_snapshot" "ebs_snapshot" {
  count = "${length(data.aws_ebs_volume.ebs_volumes.ids)}"
  volume_id = "${element(data.ebs_volume.ebs_volumes.ids, count.index)}"
}

相反,我收到以下错误:

terraform plan

Error: resource 'aws_ebs_snapshot.ebs_snapshot' config: unknown resource 'data.ebs_volume.ebs_volumes' referenced in variable data.ebs_volume.ebs_volumes.ids

由于我使用的是数据源,data.aws_ebs_volume 返回的列表是动态的,而不是Create snapshots of multiple EBS volumes using Terraform 中讨论的静态variable

使用terraform show

data.aws_ebs_volume.ebs_volumes:
  id = vol-00b3eaaf04b9377cb
  arn = arn:aws:ec2:us-east-1:ACCOUNT_ID:volume/vol-00b3eaaf04b9377cb
  availability_zone = us-east-1c
  encrypted = false
  filter.# = 1
  filter.3737401200.name = volume-type
  filter.3737401200.values.# = 1
  filter.3737401200.values.0 = gp2
  iops = 100
  kms_key_id =
  most_recent = false
  size = 8
  snapshot_id = snap-01d81204beb02804b
  tags.% = 0
  volume_id = vol-00b3eaaf04b9377cb
  volume_type = gp2

【问题讨论】:

  • 您是否有理由希望直接使用 Terraform 执行此操作,而不是使用 AWS Backup 或 AWS 的 Data Lifecycle Manager?
  • 嗨。是的。 Lifecycle 仅每 12/24 小时拍摄一次快照。我正在编写一个可以使用 TF 的测试,并且对玩 TF 很感兴趣。感谢您的提问!
  • 您是否可以扩展您的问题以包括您将针对每个卷执行的操作(例如,您将如何过滤要快照的卷?)即使您必须静态地执行它然后解释你希望如何动态地做到这一点?
  • @ydaetskcoR 你好。我编辑了我的问题,不确定这是否更明确。由于有数百台机器,我需要按需计算 EBS 卷列表。
  • 值得一提的是,DLM 现在支持每 2 小时运行一次快照:aws.amazon.com/about-aws/whats-new/2019/02/…

标签: amazon-web-services terraform


【解决方案1】:

Terraform 提供程序中通常有 2 种类型的数据源,单数和复数,例如 aws_amiaws_ami_ids,复数通常只返回资源 ID 列表,单数提供更多信息每个特定的资源。

不幸的是,AWS 提供商尚未为 EBS 卷实现复数数据源,因此您只能使用单数 aws_ebs_volume data source,并且不能动态返回符合某些条件(例如它们是 GP2)的所有 EBS 卷。

作为短期修复,如果您真的想使用 Terraform 直接管理创建快照,您可以使用 external data source 获取 Terraform 之外的 EBS 卷列表。

一个简单的例子可能看起来像这样(未经测试):

data "external" "all_gp2_ebs_volumes" {
  # Should run something like:
  # `aws ec2 describe-volumes --query 'Volumes[].VolumeId' --filters Name=volume-type,Values=gp2`
  # but return the result in a way that the data source needs it.
  program = ["python", "${path.module}/get-all-gp2-ebs-volumes.py"]
}

resource "aws_ebs_snapshot" "ebs_snapshot" {
  count     = "${length(data.external.all_gp2_ebs_volumes.result.ids)}
  volume_id = "${data.external.all_gp2_ebs_volumes.result.ids[count.index]}"
}

除非 AWS DLMAWS Backup 的 2 小时期限限制对你来说是一个真正的障碍,出于某种原因,我会使用它们。已经有一个 aws_dlm_lifecycle_policy resource 通过 Terraform 进行配置,然后 this issue 正在跟踪必要的 AWS Backup 资源的创建。

另一种选择是在 issue tracker 上针对 aws_ebs_volume_ids 数据源提出功能请求(我无法通过快速浏览找到现有功能请求)。

【讨论】:

  • 非常感谢。我不知道这两个数据源的区别,我总是对这两个感到困惑。有很好的知识。我会解决的。
猜你喜欢
  • 2019-04-06
  • 2019-04-07
  • 2018-09-04
  • 2019-08-16
  • 1970-01-01
  • 2019-06-13
  • 2016-07-09
  • 2020-07-27
  • 2020-11-27
相关资源
最近更新 更多