首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Terraform和count()创建EBS快照

使用Terraform和count()创建EBS快照
EN

Stack Overflow用户
提问于 2019-02-18 01:13:33
回答 1查看 545关注 0票数 0

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

代码语言:javascript
复制
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)}"
}

相反,我得到了以下错误:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-18 02:04:04

在Terraform providers中通常有两种类型的数据源,单数数据源和复数数据源,如aws_amiaws_ami_ids,其中复数数据源通常只返回资源的ID列表,而单数数据源提供有关每个特定资源的更多信息。

不幸的是,亚马逊网络服务提供商还没有为EBS卷实现多个数据源,因此您只能使用单个aws_ebs_volume data source,而不能动态地返回符合某些条件(例如,它们是GP2)的所有EBS卷。

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

这方面的一个快速示例可能如下所示(未经测试):

代码语言:javascript
复制
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小时限制对你来说是一个真正的障碍,否则我会使用它们。已经有一个通过Terraform配置的aws_dlm_lifecycle_policy resource,然后this issue正在跟踪必要的亚马逊网络服务备份资源的创建。

另一种选择是在issue tracker上提出对aws_ebs_volume_ids数据源的特性请求(快速查看,我找不到现有的特性请求)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54735644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档