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

Компонуемые модули

Теперь у вас есть два небольших модуля, asg-rolling-deploy и alb, каждый из которых хорошо делает что-то одно. Как их объединить? Как создавать компонуемые модули, пригодные к повторному использованию? Этот вопрос актуален не только для Terraform — программисты размышляют о нем на протяжении десятилетий. Процитирую Дуга Макилроя52, создателя Unix-каналов и ряда других инструментов для Unix, включая diff, sort, join и tr:

Это философия Unix: пишите программы, которые делают что-то одно, и делают это хорошо. Пишите программы, которые могут работать вместе.

Дуг Макилрой

Один из способов этого добиться — использовать композицию функций. Это когда вы можете взять вывод одной функции и передать его в качестве ввода другой. Представьте, что у вас есть следующие небольшие функции на Ruby:

# Простая функция для сложения

def add(x, y)

  return x + y

end

# Простая функция для вычитания

def sub(x, y)

  return x - y

end

# Простая функция для умножения

def multiply(x, y)

  return x * y

end

С помощью композиции функций вы можете их скомпоновать, передав вывод add и sub на вход multiply:

# Сложная функция, объединяющая несколько более простых

def do_calculation(x, y)

  return multiply(add(x, y), sub(x, y))

end

Одним из основных способов сделать функции компонуемыми является минимизация побочных эффектов. Для этого по возможности следует избегать чтения состояния извне, а вместо этого передавать его через входные параметры. Кроме того, вместо записи состояния вовне лучше возвращать результаты своих вычислений через выходные параметры. Минимизация побочных эффектов — это один из основных принципов функционального программирования, который упрощает понимание, тестирование и повторное использование кода. Последнее особенно важно, так как благодаря композиции сложная функция может представлять собой комбинацию более простых.

И хотя избежать побочных эффектов при работе с инфраструктурным кодом нельзя, вы все равно можете следовать тем же основным правилам в своем коде Terraform: передавайте все в виде входных переменных, возвращайте все через выходные и создавайте сложные модули на основе более простых.

Откройте файл modules/cluster/asg-rolling-deploy/variables.tf и добавьте четыре новые входные переменные:

variable "subnet_ids" {

  description = "The subnet IDs to deploy to"

  type        = list(string)

}

variable "target_group_arns" {

  description = "The ARNs of ELB target groups in which to register Instances"

  type        = list(string)

  default     = []

}

variable "health_check_type" {

  description = "The type of health check to perform. Must be one of: EC2, ELB."

  type        = string

  default     = "EC2"

}

variable "user_data" {

  description = "The User Data script to run in each Instance at boot"

  type        = string

  default     = ""

}

Первая переменная, subnet_ids, говорит модулю asg-rolling-deploy о том, в каких подсетях нужно развертываться. Если в модуле webserver-cluster подсети и VPC по умолчанию были прописаны прямо в коде, то этот модуль можно использовать в любых VPC и подсетях благодаря переменной subnet_ids, которая доступна извне. Следующие две переменные, target_group_arns и health_check_type, определяют то, как ASG интегрируется с балансировщиком нагрузки. Если у модуля webserver-cluster был встроенный экземпляр ALB, asg-rolling-deploy задумывался как универсальный модуль, поэтому выбор параметров балансировщика нагрузки с помощью входных переменных позволяет применять ASG в широком спектре сценариев: например, без ALB, с одним балансировщиком, с несколькими NLB и т. д.

Возьмите эти три входные переменные и передайте их ресурсу aws_autoscaling_group в файле modules/cluster/asg-rolling-deploy/main.tf, заменив вручную прописанные параметры, которые ссылались на ресурсы (скажем, ALB) и источники данных (вроде aws_subnet_ids) и не были скопированы в наш модуль asg-rolling-deploy:

resource "aws_autoscaling_group" "example" {

  # Напрямую зависит от имени конфигурации запуска, поэтому вместе

  # с ним всегда нужно заменять и эту группу ASG

  name = "${var.cluster_name}-${aws_launch_configuration.example.name}"

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = var.subnet_ids

  # Настраиваем интеграцию с балансировщиком нагрузки

  target_group_arns = var.target_group_arns

  health_check_type = var.health_check_type

  min_size = var.min_size

  max_size = var.max_size

  # Ждем, пока как минимум столько серверов не пройдут проверку

  # работоспособности, прежде чем считать развертывание ASG завершенным

  min_elb_capacity = var.min_size

  # (...)

}

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

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

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

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

Скотт Беркун

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

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

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

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

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