Terraform v0.12.17
我只有2个简单文件
snapshot_id.tf = gets a list of my completed EBS volume snapshot ids
data "aws_ebs_snapshot_ids" "jenkins_master" {
filter {
name = "tag:Name"
values = ["jenkins-master"]
}
filter {
name = "status"
values = ["completed"]
}
}
ebs_volume_green.tf = use above data resource to create an EBS volume
resource "aws_ebs_volume" "jenkins_master_ebs_green" {
availability_zone = var.availability_zones.green
snapshot_id = data.aws_ebs_snapshot_ids.jenkins_master.id
size = data.aws_ebs_snapshot_ids.jenkins_master.volume_size
type = "gp2"
tags = {
Name = "jenkins-master-green"
Environment = "sandbox"
Product = "Jenkins"
Role = "master"
}
}
这通过了,因此很明显资源已经定义了volume_size
。
$ terraform plan -target ebs_volume_green.tf -out out.output
$ terraform apply out.output
但这失败了,即,如果我没有指定-target
选项。为什么?
$ terraform plan -out out.output
Error: Unsupported attribute
on ebs_volume_green.tf line 4, in resource "aws_ebs_volume" "jenkins_master_ebs_green":
4: size = data.aws_ebs_snapshot_ids.jenkins_master.volume_size
This object has no argument, nested block, or exported attribute named
"volume_size".
答案 0 :(得分:1)
您已经混淆了aws_ebs_snapshot_ids
和aws_ebs_snapshot
数据源。
仅在需要返回多个内容时才应使用复数数据源。然后,您可以将这些ID传递到返回更多有用信息的单个数据源中,或者仅将ID传递到带有ID列表的对象中,例如aws_autoscaling_group
资源的vpc_zone_identifier
参数。
对于您来说,如果您只想要与标签匹配的最新快照,则只需使用以下内容:
data "aws_ebs_snapshot" "jenkins_master" {
most_recent = true
filter {
name = "tag:Name"
values = ["jenkins-master"]
}
filter {
name = "status"
values = ["completed"]
}
}
这将具有您期望的数据源中的volume_size
attribute。
在您的问题中,您可以看到仅以数据源为目标即可计划并成功应用,但是仅当您的计划中包含不存在的资源或数据源输出使用情况时,Terraform才会抱怨,因为它不是以-target
模式评估所有内容。通常,如果您必须使用-target
,那么某处出了点问题,您应该将其视为危险信号。