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

    ax[1].scatter(X_pca[x], X_pca[1], c=y_train)

    ax[1].set_title('Actual Training Labels')

    ax[2].scatter(X_pca[x], X_pca[1], c=clusters)

  end

  for y in 0..ylimit

    ay[0].scatter(X_pca[y], X_pca[1], c=clusters)

    ay[0].set_title('Predicted Training Labels')

    ay[1].scatter(X_pca[y], X_pca[1], c=y_train)

    ay[1].set_title('Actual Training Labels')

    ay[2].scatter(X_pca[y], X_pca[1], c=clusters)

  end

  #

  # ... еще 20 тысяч строчек...

  #

end

Вы сразу же понимаете, что этот код странный и его лучше разбить на ряд небольших автономных функций, каждая из которых делает что-то одно:

def calculate_images_and_predictions(images_test, predicted)

  x_pca = PCA(n_components=2).fit_transform(X_train)

  clusters = clf.fit_predict(X_train)

  ax = plt.subplots(1, 2, figsize=(4))

  fig = plt.subplots(3, 4, figsize=(5))

  fig.subplots_adjust(top=0.85)

  predicted = svc_model.predict(X_test)

  return list(zip(images_test, predicted))

end

def process_x_coords(ax)

  for x in 0..xlimit

    ax[0].scatter(X_pca[x], X_pca[1], c=clusters)

    ax[0].set_title('Predicted Training Labels')

    ax[1].scatter(X_pca[x], X_pca[1], c=y_train)

    ax[1].set_title('Actual Training Labels')

    ax[2].scatter(X_pca[x], X_pca[1], c=clusters)

  end

  return ax

end

def process_y_coords(ax)

  for y in 0..ylimit

    ay[0].scatter(X_pca[y], X_pca[1], c=clusters)

    ay[0].set_title('Predicted Training Labels')

    ay[1].scatter(X_pca[y], X_pca[1], c=y_train)

    ay[1].set_title('Actual Training Labels')

    ay[2].scatter(X_pca[y], X_pca[1], c=clusters)

  end

  return ay

end

#

# ... множество других мелких функций...

#

Ту же стратегию нужно применять и к Terraform. Представьте, что вы имеете дело с архитектурой, изображенной на рис. 6.1.

Если эта архитектура описана в едином огромном модуле Terraform длиной 20 000 строк, вы должны сразу же почувствовать, что с этим кодом что-то не так. Лучше всего разбить его на ряд небольших автономных модулей, каждый из которых выполняет одну задачу (рис. 6.2).

Модуль webserver-cluster, над которым вы работаете, начинает разрастаться. К тому же он отвечает сразу за три малосвязанные между собой задачи.

• Группа автомасштабирования (ASG). Модуль webserver-cluster развертывает группу ASG, которая умеет выполнять скользящие обновления с нулевым временем простоя.

• Балансировщик нагрузки (ALB). Модуль webserver-cluster развертывает ALB.

• Демонстрационное приложение. Модуль webserver-cluster также развертывает простое демонстрационное приложение.

Рис. 6.1. Относительно сложная архитектура AWS

Рис. 6.2. Относительно сложная архитектура AWS, разбитая на множество мелких модулей

Разделим этот код на три небольших модуля.

• modules/cluster/asg-rolling-deploy. Обобщенный универсальный автономный модуль для развертывания группы ASG, которая умеет выполнять скользящие обновления с нулевым временем простоя.

• modules/networking/alb. Обобщенный универсальный автономный модуль для развертывания ALB.

• modules/services/hello-world-app. Модуль для развертывания демонстрационного приложения.

Прежде чем начинать, не забудьте выполнить команду terraformdestroy для удаления всех копий webserver-cluster, которые могли остаться с предыдущих глав. После этого можете приступать к написанию модулей asg-rolling-deploy и alb. Создайте новую папку modules/cluster/asg-rolling-deploy и переместите (скопируйте и вставьте) следующие ресурсы из файла module/services/webserver-cluster/main.tf в modules/cluster/asg-rolling-deploy/main.tf:

•aws_launch_configuration;

• aws_autoscaling_group;

• aws_autoscaling_schedule (оба экземпляра);

• aws_security_group (для серверов, но не для ALB);

• aws_security_group_rule (оба правила для серверов, но не те, что для ALB);

•aws_cloudwatch_metric_alarm (оба экземпляра).

Далее переместите следующие переменные из файла module/services/webserver-cluster/variables.tf в modules/cluster/asg-rolling-deploy/variables.tf:

•cluster_name;

• ami;

• instance_type;

• min_size;

• max_size;

• enable_autoscaling;

• custom_tags;

•server_port.

Теперь перейдем к модулю ALB. Создайте новую папку modules/networking/alb и переместите следующие ресурсы из файла module/services/webserver-cluster/main.tf в modules/networking/alb/main.tf:

•aws_lb;

• aws_lb_listener;

• aws_security_group (тот, что для ALB, но не те, что для серверов);

•aws_security_group_rule (оба правила для ALB, но не те, что для серверов).

Создайте файл modules/networking/alb/variables.tf и объявите в нем одну переменную:

variable "alb_name" {

  description = "The name to use for this ALB"

  type        = string

}

Используйте эту переменную в качестве аргумента name для ресурса aws_lb:

resource "aws_lb" "example" {

  name               = var.alb_name

  load_balancer_type = "application"

  subnets            = data.aws_subnet_ids.default.ids

  security_groups    = [aws_security_group.alb.id]

}

и аргумента name для ресурса aws_security_group:

resource "aws_security_group" "alb" {

  name = var.alb_name

}

Мы перетасовали много кода, поэтому можете воспользоваться примерами для данной главы на странице github.com/brikis98/terraform-up-and-running-code.

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

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

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

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

Скотт Беркун

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

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

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

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

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