Terraform-如何创建可选数据块

Terraform-如何创建可选数据块,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我已经创建了一些数据块来查找正确的AMI。 我有4个数据块来查找4个基于AMI的4个操作系统。例如 data "aws_ami" "centos" { owners = ["123456789"] most_recent = true filter { name = "name" values = ["CentOS*${var.os-version}*

我已经创建了一些数据块来查找正确的AMI。 我有4个数据块来查找4个基于AMI的4个操作系统。例如

data "aws_ami" "centos" {
    owners = ["123456789"]
    most_recent = true
    filter {
        name = "name"
        values = ["CentOS*${var.os-version}*x86_64"]
    }
}
data "aws_ami" "suse" {
    owners = ["amazon"]
    most_recent = true
    filter {
        name = "name"
        values = ["suse-sles-${var.os-version}-sp*-v????????-hvm-ssd-x86_64"]
    }
}
我像下面那样调用它们
ami\u id=data.${os\u name}.image id

所以我只想运行已经调用的数据块。如果用户选择“suse”,则只有suse数据块将运行。不是所有的。 现在这是一个问题,因为用户选择基于操作系统的版本。例如,16.04只适用于ubuntu,而不适用于任何其他数据块,因此其他数据块会引发如下异常:

Error: Your query returned no results. Please change your search criteria and try again.

  on main.tf line 79, in data "aws_ami" "suse":
  79: data "aws_ami" "suse" {


那么我该如何实现它呢?

一种方法可以是将地形模块和
计数相结合。例如,您可以这样构造项目:

AMI的
数据
查找可以是子文件夹中的一个模块。此模块的输入将是您的
操作系统版本

在该模块内,您必须验证输入操作系统是否有效。然后,您可以构造每个
数据块。每个
数据
块都有一个
计数
值,根据传入的
操作系统版本
,在该值处进行查找(值
1
)或不进行查找(值
0

作为一个简单的例子,我构建了以下内容

# Main Terraform project
module "ami" {
    source = "./ami"

    arch = "arm64"
}

output "ami_arn" { value = module.ami.arn }
此示例不适用于
os版本
,因为我无法轻松模拟您的环境。然而,实现是相同的

AMI模块的输出是ARN,或者您选择的任何其他有效输出,然后您可以将其传递给构建EC2实例


在这种情况下,您不必使用模块,可以在主代码中执行相同级别的验证和
count
操作。我选择了这种方法,假设您有一个EC2模块,您正在为其编码。

一种方法可以是地形模块和
计数的组合。例如,您可以这样构造项目:

AMI的
数据
查找可以是子文件夹中的一个模块。此模块的输入将是您的
操作系统版本

在该模块内,您必须验证输入操作系统是否有效。然后,您可以构造每个
数据块。每个
数据
块都有一个
计数
值,根据传入的
操作系统版本
,在该值处进行查找(值
1
)或不进行查找(值
0

作为一个简单的例子,我构建了以下内容

# Main Terraform project
module "ami" {
    source = "./ami"

    arch = "arm64"
}

output "ami_arn" { value = module.ami.arn }
此示例不适用于
os版本
,因为我无法轻松模拟您的环境。然而,实现是相同的

AMI模块的输出是ARN,或者您选择的任何其他有效输出,然后您可以将其传递给构建EC2实例


在这种情况下,您不必使用模块,可以在主代码中执行相同级别的验证和
count
操作。我选择这种方法的前提是您有一个为其编码的EC2模块。

您已经看过条件/计数了吗?这可能会有所帮助。您是否已经了解了条件/计数?这可能会有帮助