resource "aws_launch_configuration" "example" {
image_id = "ami-0c55b159cbfafe1f0"
instance_type = var.instance_type
security_groups = [aws_security_group.instance.id]
user_data = data.template_file.user_data.rendered
# Требуется при использовании группы автомасштабирования
# в конфигурации запуска.
# https://www.terraform.io/docs/providers/aws/r/launch_configuration.html
lifecycle {
create_before_destroy = true
}
}
Похожим образом следует обновить определение ASG в том же файле. Присвойте параметрам min_size и max_size входные переменные var.min_size и var.max_size соответственно:
resource "aws_autoscaling_group" "example" {
launch_configuration = aws_launch_configuration.example.name
vpc_zone_identifier = data.aws_subnet_ids.default.ids
target_group_arns = [aws_lb_target_group.asg.arn]
health_check_type = "ELB"
min_size = var.min_size
max_size = var.max_size
tag {
key = "Name"
value = var.cluster_name
propagate_at_launch = true
}
}
Теперь кластер в тестовой среде (stage/services/webserver-cluster/main.tf) можно сделать поменьше и подешевле, указав "t2.micro" для instance_type и 2 для min_size и max_size:
module "webserver_cluster" {
source = "../../../modules/services/webserver-cluster"
cluster_name = "webservers-stage"
db_remote_state_bucket = "(YOUR_BUCKET_NAME)"
db_remote_state_key = "stage/data-stores/mysql/terraform.tfstate"
instance_type = "t2.micro"
min_size = 2
max_size = 2
}
В то же время в промышленной среде можно использовать более крупный тип серверов (например, m4.large) с большим количеством серверов и памяти. Имейте в виду, что этот тип
module "webserver_cluster" {
source = "../../../modules/services/webserver-cluster"
cluster_name = "webservers-prod"
db_remote_state_bucket = "(YOUR_BUCKET_NAME)"
db_remote_state_key = "prod/data-stores/mysql/terraform.tfstate"
instance_type = "m4.large"
min_size = 2
max_size = 10
}
Локальные переменные модулей
Определение параметров модуля с помощью входных переменных — отличный подход, но что, если вам нужно определить переменную внутри модуля для каких-то промежуточных вычислений или просто для того, чтобы не дублировать код, но при этом вы не хотите делать ее доступной в качестве конфигурируемого ввода? Например, балансировщик нагрузки в модуле webserver-cluster (modules/services/webserver-cluster/main.tf) прослушивает стандартный для HTTP порт под номером 80. Сейчас нам приходится копировать и вставлять этот номер в разных местах, в том числе и в прослушивателе балансировщика:
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.example.arn
port = 80
protocol = "HTTP"
# По умолчанию возвращает простую страницу с кодом 404
default_action {
type = "fixed-response"
fixed_response {
content_type = "text/plain"
message_body = "404: page not found"
status_code = 404
}
}
}
А вот группа безопасности балансировщика:
resource "aws_security_group" "alb" {
name = "${var.cluster_name}-alb"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Значения в этой группе безопасности, включая блок CIDR 0.0.0.0/0 (любые IP-адреса), номер порта 0 (любой порт) и произвольный протокол "-1", тоже копируются и вставляются на нескольких участках модуля. Явное и многократное задание этих «магических» значений усложняет чтение и поддержку кода. Их можно вынести во входные переменные, но в таком случае ваш модуль может (случайно) переопределить эти значения, что может быть нежелательным. Вместо этого можно определить
locals {
http_port = 80
any_port = 0
any_protocol = "-1"
tcp_protocol = "tcp"
all_ips = ["0.0.0.0/0"]
}
Локальные значения позволяют назначить любому выражению Terraform имя, которое затем можно использовать в коде модуля. Такие имена видны только в самом модуле, поэтому они не имеют никакого влияния на внешний код, при этом вы не можете перезаписать их извне. Чтобы прочитать локальное значение, нужна
local.
Используйте этот синтаксис для обновления прослушивателя балансировщика нагрузки:
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.example.arn
port = local.http_port
protocol = "HTTP"
# По умолчанию возвращает простую страницу с кодом 404
default_action {
type = "fixed-response"
fixed_response {
content_type = "text/plain"
message_body = "404: page not found"
status_code = 404
}
}
}
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии