Terraform делает именно то, что вы просили. Каждый раз, когда он запускается, он ищет самый последний AMI с именем, начинающимся с ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*
, а затем передает этот идентификатор AMI в ресурс aws_instance
. Поскольку невозможно изменить идентификатор изображения экземпляра, Terraform правильно определяет, что он должен уничтожить старые экземпляры и восстановить их из нового AMI.
Если вы хотите указать конкретный AMI, вам следует либо заставить источник данных возвращать только один AMI (например, указав отметку даты в фильтре name
), либо жестко закодировать идентификатор AMI, который вы хотите использовать.
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20190403"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
или
variable "ami" {
default = "ami-0727f3c2d4b0226d5"
}
Если вы удалите параметр most_recent = true
, то вместо этого ваш источник данных найдет несколько изображений, соответствующих этим критериям, а затем потерпит неудачу, поскольку источник данных aws_ami
может вернуть только один AMI:
ПРИМЕЧАНИЕ. Если при поиске возвращается более или менее одного совпадения, Terraform завершится ошибкой. Убедитесь, что ваш поиск достаточно конкретен, чтобы возвращать только один идентификатор AMI, или используйте most_recent
, чтобы выбрать самый последний. Если вы хотите сопоставить несколько AMI, используйте источник данных aws_ami_ids
.
Также обратите внимание, что я добавил поле owners
в ваш источник данных. Это сейчас требуется начиная с версия 2.0.0
, потому что в противном случае это было бы очень небезопасно, поскольку ваш источник данных мог вернуть любое общедоступное изображение, использующее эту схему именования.