插值数据源
Interpolate data source
我正在尝试创建一些支持不同 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)
但问题是我无法 variablize/interpolate 资源部分提到的数据源。还有其他方法可以得到我要找的东西吗?
这是我到目前为止尝试的摘录
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/20200818T212500Z
和 mysql/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 名称中进行搜索,并将 return 匹配这些条件的最新名称,因此如果 123456789012
帐户所有者要为同一 MySQL 发布新的 AMI具有不同时间戳的版本,那么它会想要使用该新 AMI 重新创建您的实例。
我正在尝试创建一些支持不同 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)
但问题是我无法 variablize/interpolate 资源部分提到的数据源。还有其他方法可以得到我要找的东西吗?
这是我到目前为止尝试的摘录
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/20200818T212500Z
和 mysql/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 名称中进行搜索,并将 return 匹配这些条件的最新名称,因此如果 123456789012
帐户所有者要为同一 MySQL 发布新的 AMI具有不同时间戳的版本,那么它会想要使用该新 AMI 重新创建您的实例。