我想为所有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
答案 0 :(得分:0)
Terraform提供程序中通常有两种类型的数据源,单数形式和复数形式,例如aws_ami
与aws_ami_ids
,其中复数形式通常仅返回资源ID列表,而单数形式提供有关每种特定资源的更多信息。
不幸的是,AWS提供程序尚未为EBS卷实现多个数据源,因此您只能使用单数aws_ebs_volume
data source,而不能仅动态返回符合某些条件的所有EBS卷(例如它们是GP2) )。
作为一个短期解决方案,如果您真的想使用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 DLM或AWS Backup,否则aws_dlm_lifecycle_policy
resource或this issue的限制是一个真正的阻止者。已经有issue tracker通过Terraform进行配置,然后{{3}}正在跟踪必要的AWS Backup资源的创建。
另一种替代方法是在{{3}}上向aws_ebs_volume_ids
数据源提出功能请求(我无法通过快速查找找到现有的功能请求)。