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, над которым вы работаете, начинает разрастаться. К тому же он отвечает сразу за три малосвязанные между собой задачи.
Рис. 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.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии