Amazon web services 地形规划是一种方式,但不是另一种方式?

Amazon web services 地形规划是一种方式,但不是另一种方式?,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,地形v0.12.17 我只有两个简单的文件 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"] }

地形v0.12.17

我只有两个简单的文件

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\u 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".
您混淆了和数据源

如果需要返回多个数据源,则只应使用多个数据源。然后,您可以将这些ID传递到返回更多有用信息的单个数据源中,或者只将ID传递到包含ID列表的内容中,例如
aws\u autoscaling\u组
resource的
vpc\u zone\u标识符
参数

在您的情况下,如果您只需要与标记匹配的最新快照,则只需使用以下选项:

data "aws_ebs_snapshot" "jenkins_master" {
  most_recent = true

  filter {
    name   = "tag:Name"
    values = ["jenkins-master"]
  }

  filter {
    name   = "status"
    values = ["completed"]
  }
}
然后,这将从您期望的数据源获取数据


在您的问题中,您可以看到,当您仅针对数据源时,Terraform计划并成功应用,但只有当您的计划包含对不存在的资源或数据源输出的使用时,Terraform才会抱怨,因为它没有在
-target
模式下评估所有内容。一般来说,如果您必须使用
-target
,那么某个地方出了问题,您应该将其视为一个危险信号。

您不能以这样的文件为目标,因此不清楚您在这里做什么,您似乎已经混淆了以创建一个示例。你只能针对特定的资源等。你能确保你的问题包含一个适当的可重复的例子吗?你似乎还把
aws\U ebs\U快照\U ID
aws\U ebs\U快照
混淆了。这些是不同的数据源。如果使用
aws\u ebs\u snapshot
,则应具有所需的
volume\u size
输出。相反,复数数据源只返回ID,然后您可以使用
aws\u ebs\u快照
数据源迭代这些ID,以便稍后获得
volume\u size
。好的,我用一个目标的真实资源更新了我的示例。@ydaetskcoR请发布您的第二条评论作为答案。谢谢