Некоторое время мы использовали Terraform для управления нашей инфраструктурой, и в настоящее время я занимаюсь рефакторингом ее части. Нам нужны две группы автомасштабирования внутри AWS, где одна группа запускает последнюю версию наших AMI, а другая группа использует предыдущую версию. Таким образом, я пытаюсь найти оба AMI.
Сначала ищем последний выпуск. Вот как работает наша текущая инфраструктура, и это нормально:
data "aws_ami" "ami_latest" {
most_recent = true
filter {
name = "name"
values = ["server-name-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["self"]
}
Теперь я хочу найти нашу предыдущую версию. Я думал, что смогу использовать name_regex
< / a> в Terraform и выполните отрицательный просмотр имени, которое я только что вернул в первом блоке, возвращая, таким образом, предыдущий последний выпуск:
data "aws_ami" "ami_previous" {
most_recent = true
filter {
name = "name"
values = ["server-name-*"]
}
#our AMIs have . in them, so I'm escaping for the regex:
name_regex ="^(?!${replace(data.aws_ami.ami_latest.name, ".", "\\.")}).+"
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["self"]
}
Однако это приводит к сбою:
panic: regexp: Compile (`^ (?! server-name-1234.1234.1234.1234). +`): ошибка синтаксического анализа регулярного выражения: недопустимый или неподдерживаемый синтаксис Perl: `(?!`
В настоящее время мы используем Terraform 0.11.10. Хотя у нас есть планы по обновлению до 0.12+, в наших скриптах есть ряд мест, которые необходимо будет обновить, чтобы исправить различные критические изменения между ними.
Есть ли способ отфильтровать AMI, чтобы получить то, что мне нужно в 0.11.10? Есть ли способ заставить встроенный name
фильтр сделать это?
В качестве альтернативы, есть ли в 0.12.6 обновленная поддержка регулярных выражений? - Я не хочу исправлять все проблемы, чтобы попробовать 0.12.6, просто чтобы обнаружить, что у него все еще есть та же проблема.
Альтернативным подходом было бы использование самих фильтров - кажется, если я отфильтрую список AMI непосредственно в консоли AWS, я смогу получить то, что мне нужно, используя два фильтра по имени: server-name-*
и !'server-name.123.123.123.123'
, где вторая - последняя версия. Это возвращает мне нужную мне информацию. Однако я не могу заставить это работать в блоках фильтров в Terraform. Я пробовал различные комбинации по линиям:
filter {
name = "name"
values = ["server-name-*", "!'${data.aws_ami.ami_latest.name}'"]
}
И попробуйте другие вещи, такие как использование двух блоков фильтров, установка первого отрицательного и т. Д. Ни один из них не приводит к обнаружению AMI - похоже, что, хотя отрицаемые фильтры работают на консоли, они не работают через API, поэтому это тоже тупик.