如何解决插值数据源
我正在尝试创建一些支持不同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/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名称中进行搜索,并将返回符合这些条件的最新值,因此,如果123456789012
帐户所有者针对同一MySQL版本使用不同的时间戳发布新的AMI,则它将想要使用新的AMI重新创建实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。