Terraform: инфраструктура на уровне кода | страница 54
resource "aws_launch_configuration" "example" {
image_id = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
security_groups = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p ${var.server_port} &
EOF
}
Теперь вы можете создать саму группу ASG, используя ресурс aws_autoscaling_group:
resource "aws_autoscaling_group" "example" {
launch_configuration = aws_launch_configuration.example.name
min_size = 2
max_size = 10
tag {
key = "Name"
value = "terraform-asg-example"
propagate_at_launch = true
}
}
Эта группа ASG включает в себя от двух до десяти серверов EC2 (сначала запускается только два), каждый из которых имеет тег terraform-asg-example. Обратите внимание, что ASG использует ссылку в качестве имени конфигурации запуска. Это приводит к проблеме: конфигурация запуска неизменяема, поэтому, если вы измените любой ее параметр, Terraform попытается заменить ее целиком. Обычно при замене ресурса Terraform сначала удаляет его старую версию и затем создает новую, но, поскольку ASG теперь ссылается на старый ресурс, Terraform не сможет его удалить.
Чтобы решить эту проблему, можно воспользоваться параметром жизненного цикла. Он поддерживается всеми ресурсами Terraform и определяет их создание, обновление и/или удаление. Особенно полезным параметром жизненного цикла является create_before_destroy. Если присвоить ему true, Terraform поменяет порядок замены ресурсов на противоположный. В итоге сначала будет создана замена (с обновлением всех ссылок таким образом, чтобы они указывали на нее, а не на старый ресурс) и только потом произойдет удаление старого ресурса. Добавьте раздел lifecycle в aws_launch_configuration, как показано ниже:
resource "aws_launch_configuration" "example" {
image_id = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
security_groups = [aws_security_group.instance.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p ${var.server_port} &
EOF
# Требуется при использовании группы автомасштабирования
# в конфигурации запуска.
# https://www.terraform.io/docs/providers/aws/r/launch_configuration.html
lifecycle {
create_before_destroy = true
}
}
Для работы группы ASG требуется еще один параметр: subnet_ids. Он определяет подсети VPC, в которых должны быть развернуты серверы EC2 (справочная информация о подсетях дается во врезке «Сетевая безопасность» на с. 79). Каждая подсеть находится в изолированной зоне доступности AWS (то есть в отдельном вычислительном центре), поэтому, развертывая свои серверы по разным подсетям, вы гарантируете, что ваш сервис продолжит работать, даже если некоторые из вычислительных центров выйдут из строя. Список подсетей можно прописать прямо в коде, но такое решение будет сложно поддерживать и переносить. Вместо этого лучше использовать соответствующий