#amazon-web-services #terraform #terraform-provider-aws
#amazon-веб-сервисы #terraform #terraform-поставщик-aws
Вопрос:
Я пытаюсь создать некоторый общий код Terraform, который поддерживает различные AMI версии MySQL. AMI MySQL отсутствуют в моей учетной записи 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.
Комментарии:
1. Вы получаете ошибку? Если да, не могли бы вы также опубликовать ошибку?
2. Похоже, вы совсем новичок в Terraform. Есть ли причина, по которой вы используете такую старую версию Terraform? Это кардинально не меняет мой ответ, но вы действительно должны использовать не менее 0.12 для получения массы преимуществ, включая новый синтаксис HCL2. При необходимости вам следует объяснить, почему вы все еще используете 0.11, и пометить вопрос
terraform0.11
.
Ответ №1:
Ваши источники данных не делают ничего полезного, потому что вы передаете в них идентификатор AMI, который сводит на нет их смысл. Вместо этого вы должны использовать aws_ami
источник данных для извлечения идентификатора AMI на основе некоторых критериев, таких как владелец и имя. Это позволило бы вам более просто искать их на основе переменной.
Предполагая, что 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
владелец учетной записи должен был опубликовать новый AMI для той же версии MySQL с другой временной меткой, он захочет воссоздать ваш экземпляр с этим новым AMI.
Комментарии:
1. @ydaetskoR, это сработало. Да, я новичок в Terraform и скоро перейду на более новую версию.