Читаем Terraform: инфраструктура на уровне кода полностью

Четвертую переменную, 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

  }

}

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги