【问题标题】:Terraform - How to create optional data blockTerraform - 如何创建可选数据块
【发布时间】:2021-04-11 06:31:32
【问题描述】:

我创建了一些数据块来寻找合适的 AMI。 我有 4 个数据块来查找 4 个基于 4 个操作系统的 AMI。例如,

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_id=data.${os_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" {

那么我该如何实现呢?

【问题讨论】:

标签: terraform terraform-provider-aws


【解决方案1】:

一种方法可以是 Terraform 模块和 count 的组合。例如,您可以像这样构建您的项目:

您对 AMI 的 data 查找可以是子文件夹中的一个模块。这个模块的输入是你的os-version

在此模块中,您可以使用variable validation 来验证输入操作系统是否有效。然后,您可以构建每个 data 块。每个data 块都有一个count 值,根据传入的os-version,查找会发生(1 的值)或不发生(0 的值)。

我构建了以下作为一个简单的示例。

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

    arch = "arm64"
}

output "ami_arn" { value = module.ami.arn }
# AMI module
variable "arch" {
  type = string

  validation {
    condition = (
      var.arch == "x86" || var.arch == "arm64"
    )
    error_message = "Valid architectures are 'x86' or 'arm64'."
  }
}

data "aws_ami" "aws_linux_2_x86" {
  count = var.arch == "x86" ? 1 : 0

  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "image-id"
    values = ["ami-0742b4e673072066f"]
  }
}

data "aws_ami" "aws_linux_2_arm64" {
  count = var.arch == "arm64" ? 1 : 0

  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "image-id"
    values = ["ami-015f1226b535bd02d"]
  }
}

output "arn" { value = var.arch == "x86" ? data.aws_ami.aws_linux_2_x86[0].arn : data.aws_ami.aws_linux_2_arm64[0].arn }

这个例子没有过滤os-version,因为我不能轻易地模拟你的环境。但是,实现是一样的。

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

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

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2021-12-31
    • 2022-07-30
    • 2019-12-01
    • 2019-03-19
    • 2021-12-30
    相关资源
    最近更新 更多