Четвертую переменную, user_data, нужно передать в скрипт пользовательских данных. Если в модуле webserver-cluster этот скрипт был прописан вручную и мог использоваться лишь для развертывания приложения Hello, World, модуль asg-rolling-deploy позволяет развертывать в ASG любое приложение, так как скрипт теперь передается в виде входной переменной. Итак, передайте переменную user_data ресурсу aws_launch_configuration (заменив ею ссылку на источник данных template_file, которую мы не скопировали в модуль asg-rolling-deploy):
resource "aws_launch_configuration" "example" {
image_id = var.ami
instance_type = var.instance_type
security_groups = [aws_security_group.instance.id]
user_data = var.user_data
# Требуется при использовании группы автомасштабирования
# в конфигурации запуска.
# https://www.terraform.io/docs/providers/aws/r/launch_configuration.html
lifecycle {
create_before_destroy = true
}
}
Следует также добавить парочку полезных переменных в файл modules/cluster/asgrolling-deploy/outputs.tf:
output "asg_name" {
value = aws_autoscaling_group.example.name
description = "The name of the Auto Scaling Group"
}
output "instance_security_group_id" {
value = aws_security_group.instance.id
description = "The ID of the EC2 Instance Security Group"
}
Вывод этих данных делает модуль asg-rolling-deploy еще более универсальным, поскольку с помощью этих выходных значений его пользователи смогут изменять его поведение, подключая собственные правила к группе безопасности.
По аналогичным причинам несколько выходных переменных следует добавить и в файл modules/networking/alb/outputs.tf:
output "alb_dns_name" {
value = aws_lb.example.dns_name
description = "The domain name of the load balancer"
}
output "alb_http_listener_arn" {
value = aws_lb_listener.http.arn
description = "The ARN of the HTTP listener"
}
output "alb_security_group_id" {
value = aws_security_group.alb.id
description = "The ALB Security Group ID"
}
Вы скоро увидите, как их использовать.
Последним шагом будет преобразование webserver-cluster в модуль hello-world-app, способный развернуть приложение Hello, World с помощью asg-rolling-deploy и alb. Для этого переименуйте module/services/webserver-cluster в module/services/hello-world-app. После всех предыдущих изменений в файле module/services/hello-world-app/main.tf должны остаться только следующие ресурсы:
•template_file (для пользовательских данных);
• aws_lb_target_group;
• aws_lb_listener_rule;
• terraform_remote_state (для БД);
• aws_vpc;
• aws_subnet_ids.
Добавьте следующую переменную в файл modules/services/hello-world-app/variables.tf:
variable "environment" {
description = "The name of the environment we're deploying to"
type = string
}
Теперь добавьте созданный вами ранее модуль asg-rolling-deploy в hello-world-app, чтобы развернуть ASG:
module "asg" {
source = "../../cluster/asg-rolling-deploy"
cluster_name = "hello-world-${var.environment}"
ami = var.ami
user_data = data.template_file.user_data.rendered
instance_type = var.instance_type
min_size = var.min_size
max_size = var.max_size
enable_autoscaling = var.enable_autoscaling
subnet_ids = data.aws_subnet_ids.default.ids
target_group_arns = [aws_lb_target_group.asg.arn]
health_check_type = "ELB"
custom_tags = var.custom_tags
}
Добавьте в hello-world-app еще и модуль alb, который вы тоже создали ранее, чтобы развернуть ALB:
module "alb" {
source = "../../networking/alb"
alb_name = "hello-world-${var.environment}"
subnet_ids = data.aws_subnet_ids.default.ids
}
Обратите внимание на то, что входная переменная environment используется для соблюдения соглашения об именовании, чтобы все ваши ресурсы были распределены по пространствам имен в зависимости от среды (например, hello-world-stage, hello-world-prod). Этот код также устанавливает соответствующие значения для переменных subnet_ids, target_group_arns, health_check_type и user_data, которые вы добавили ранее.
Теперь вам нужно настроить целевую группу ALB и правило прослушивателя для этого приложения. Сделайте так, чтобы ресурс aws_lb_target_group в файле modules/services/hello-world-app/main.tf использовал в своем поле name переменную environment:
resource "aws_lb_target_group" "asg" {
name = "hello-world-${var.environment}"
port = var.server_port
protocol = "HTTP"
vpc_id = data.aws_vpc.default.id
health_check {
path = "/"
protocol = "HTTP"
matcher = "200"
interval = 15
timeout = 3
healthy_threshold = 2
unhealthy_threshold = 2
}
}
Теперь сделайте так, чтобы параметр listener_arn ресурса aws_lb_listener_rule указывал на вывод alb_http_listener_arn модуля alb:
resource "aws_lb_listener_rule" "asg" {
listener_arn = module.alb.alb_http_listener_arn
priority = 100
condition {
field = "path-pattern"
values = ["*"]
}
action {
type = "forward"
target_group_arn = aws_lb_target_group.asg.arn
}
}
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии