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

и всех групп безопасности в модуле, включая ту, которая относится к балансировщику:

resource "aws_security_group" "alb" {

  name = "${var.cluster_name}-alb"

  ingress {

    from_port   = local.http_port

    to_port     = local.http_port

    protocol    = local.tcp_protocol

    cidr_blocks = local.all_ips

  }

  egress {

    from_port   = local.any_port

    to_port     = local.any_port

    protocol    = local.any_protocol

    cidr_blocks = local.all_ips

  }

}

Локальные переменные упрощают чтение и поддержку кода, поэтому используйте их как можно чаще.

Выходные переменные модуля

Мощной особенностью групп ASG является возможность сконфигурировать их для увеличения и уменьшения количества запущенных серверов в зависимости от нагрузки. Для этого можно воспользоваться запланированным действием, которое будет менять размер кластера в заданное время суток. Например, если ваш кластер испытывает повышенную нагрузку в рабочее время, вы можете запланировать увеличение и уменьшение количества серверов на 9 утра и 5 вечера соответственно.

Запланированное действие, определенное в модуле webserver-cluster, относится как к тестовой, так и к промышленной среде. Поскольку вам не нужно подобного рода масштабирование во время тестирования, можете пока определить график автомасштабирования прямо в промышленной конфигурации. В главе 5 вы познакомитесь с условным определением ресурсов, что позволит вам переместить запланированное действие в модуль webserver-cluster.

Чтобы определить запланированное действие, добавьте следующих два ресурса aws_autoscaling_schedule в файл prod/services/webserver-cluster/main.tf:

resource "aws_autoscaling_schedule" "scale_out_during_business_hours" {

  scheduled_action_name = "scale-out-during-business-hours"

  min_size              = 2

  max_size              = 10

  desired_capacity      = 10

  recurrence            = "0 9 * * *"

}

resource "aws_autoscaling_schedule" "scale_in_at_night" {

  scheduled_action_name = "scale-in-at-night"

  min_size              = 2

  max_size              = 10

  desired_capacity      = 2

  recurrence            = "0 17 * * *"

}

Первый ресурс aws_autoscaling_schedule используется для увеличения количества серверов до десяти в утреннее время (в параметре recurrence используется синтаксис cron, поэтому "09***" означает «в 9 утра каждый день»), а второй уменьшает этот показатель на ночь ("017***" значит «в 5 вечера каждый день»). Однако в обоих случаях не хватает параметра autoscaling_group_name, который задает имя ASG. Сама группа ASG определяется внутри модуля webserver-cluster. Как же получить доступ к ее имени? В языках общего назначения, таких как Ruby, функции могут возвращать значения:

def example_function(param1, param2)

  return "Hello, #{param1} #{param2}"

end

# Другие участки вашего кода

return_value = example_function("foo", "bar")

В Terraform модули тоже могут возвращать значения. Для этого используется уже знакомый вам механизм: выходные переменные. Вы можете добавить имя ASG в качестве выходной переменной в файле modules/services/webserver-cluster/outputs.tf, как показано ниже:

output "asg_name" {

  value       = aws_autoscaling_group.example.name

  description = "The name of the Auto Scaling Group"

}

Для обращения к выходным переменным модуля используется следующий синтаксис:

module..

Например:

module.frontend.asg_name

Этот синтаксис можно использовать в файле prod/services/webserver-cluster/main.tf, чтобы установить параметр autoscaling_group_name в каждом из ресурсов aws_autoscaling_schedule:

resource "aws_autoscaling_schedule" "scale_out_during_business_hours" {

  scheduled_action_name = "scale-out-during-business-hours"

  min_size              = 2

  max_size              = 10

  desired_capacity      = 10

  recurrence            = "0 9 * * *"

  autoscaling_group_name = module.webserver_cluster.asg_name

}

resource "aws_autoscaling_schedule" "scale_in_at_night" {

  scheduled_action_name = "scale-in-at-night"

  min_size              = 2

  max_size              = 10

  desired_capacity      = 2

  recurrence            = "0 17 * * *"

  autoscaling_group_name = module.webserver_cluster.asg_name

}

Возможно, вам следует сделать доступным еще одно выходное значение в модуле webserver-cluster: доменное имя ALB. Так вы будете знать, какой URL-адрес нужно проверить после развертывания кластера. Для этого в файле /modules/services/webserver-cluster/outputs.tf необходимо еще раз добавить выходную переменную:

output "alb_dns_name" {

  value       = aws_lb.example.dns_name

  description = "The domain name of the load balancer"

}

После этого данный вывод можно «пропустить через» файлы stage/services/webserver-cluster/outputs.tf и prod/services/webserver-cluster/outputs.tf:

output "alb_dns_name" {

  value       = module.webserver_cluster.alb_dns_name

  description = "The domain name of the load balancer"

}

Ваш кластер веб-серверов почти готов к развертыванию. Осталось только принять во внимание несколько подводных камней.

Подводные камни

При создании модулей обращайте внимание:

• на файловые пути;

• вложенные блоки.

Файловые пути

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

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

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

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

Скотт Беркун

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

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

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

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

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