插值数据源

问题描述

我正在尝试创建一些支持不同MySQL版本AMI的通用Terraform代码。 MySQL的AMI不在我的AWS账户中。他们在另一个AWS账户中并与我的账户共享。我在用 数据源,以从其他帐户获取最新的MySQL AMI。现在我想要这样的东西

terraform apply -var somevar=mysql5.6 (This should use mysql5.6 AMI for creating resources)
terraform apply -var somevar=mysql5.5 (This should use mysql5.5 AMI for creating resources)

但是问题是我无法对资源部分中提到的数据源进行可变/内插。还有其他方法可以得到我想要的东西吗?

这是我到目前为止尝试过的内容的摘录

data "aws_ami" "mysql56" {
  owners = ["xxxxxxxxxxxx"]

  most_recent = true

  filter {
    name   = "image-id"
    values = ["${var.os_to_ami["mysql56"]}"]
  }
}

data "aws_ami" "mysql55" {
  owners = ["xxxxxxxxxxxx"]

  most_recent = true

  filter {
    name   = "image-id"
    values = ["${var.os_to_ami["mysql55"]}"]
  }
}
variable "os_to_ami" {
  type = "map"
  description = "OS to AMI mapping"
  default = {
        "mysql56" = "ami-xxxxxxxxxxxxxxxxx"
        "mysql57" = "ami-yyyyyyyyyyyyyyyyy"
  }
}

resource "aws_instance" "web" {
ami            = "${data.aws_ami.mysql56}"
...
}

我正在使用Terraform v0.11.0。

解决方法

您的数据源没有做任何有用的事情,因为您将AMI ID传递给了它们,这使它们失去了意义。相反,您应该使用aws_ami数据源根据某些条件(例如所有者和名称)来获取AMI ID。这样一来,您便可以根据变量更简单地查找这些内容。

假设AMI由帐户123456789012共享,并且名称分别为mysql/mysql-5.5/20200818T212500Zmysql/mysql-5.6/20200818T212500Z,那么您将执行以下操作:

variable "mysql_version" {}

data "aws_ami" "mysql" {
  most_recent = true

  filter {
    name   = "name"
    values = ["mysql/mysql-${var.mysql_version}/*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["123456789012"]
}

resource "aws_instance" "mysql" {
  ami           = data.aws_ami.mysql.id
  instance_type = "t3.micro"
}

使用上述方法,您必须提供一个必需的mysql_version变量。然后将其插值到AMI名称中进行搜索,并将返回符合这些条件的最新值,因此,如果123456789012帐户所有者针对同一MySQL版本使用不同的时间戳发布新的AMI,则它将想要使用新的AMI重新创建实例。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...