02/05/2019

Облачные технологии с точки зрения концептуального технического подхода предлагают совершенно иной взгляд на управление IT инфраструктурой. Мы теперь не беспокоимся о том, как работает оборудование, как подключены между собой сервера и СХД, кто и каким образом установит операционную систему и драйвера. Главное внимание теперь уделяется непосредственно нашим приложениям и сервисам. Программный продукт Terraform от HashiCorp позволяет эффективно организовывать необходимую нам IT инфраструктуру в облаке и изменять ее в случае надобности с помощью текстовых конфигурационных файлов. Такой подход в работе называется IaaC — Infrastructure-as-a-Code. Все, что нужно знать при таком подходе, для разворачивания нашей инфраструктуры — правила и параметры по созданию нужных сервисов в облаке.
IaaC (Infrastructure-as-a-Code) — подход к работе с IT инфраструктурой, который заключается в том, что создаваемая и поддерживаемая нами инфраструктура представлена в текстовом файле в виде кода. Этот подход подразумевает использование облачной или виртуализованной инфраструктуры под собой, при котором нет необходимости взаимодействовать непосредственно с аппаратным обеспечением. Для создания того или иного элемента инфраструктуры, мы просто добавляем нужный код с описанием этого элемента. Избавляясь от проблем с настройкой и поддержанием реального железа, мы заметно увеличиваем производительность труда инженеров и сисадминов.
Пример настройки сервисов EC2 и ELB в AWS
Для того, чтобы показать как работает Terraform, давайте настроим несколько сервисов в облаке AWS. Terraform поддерживает очень большое количество публичных облаков. Примеры на базе AWS — показательны, так как сервис сам по себе передовой в мире, плюс предлагает большое количество типов услуг. В нашем случае мы создадим виртуальную машину EC2 и балансировщик нагрузки ELB, а также необходимые дополнительные конфигурации в security-group для пропуска трафика.
Вопросы установки Terraform тут не будем затрагивать. Это делается легко и просто как в Linux, так и на MacOS. Также описывать базовые вещи не будем. У HashiCorp есть прекрасный ресурс для обучения по Terraform — https://learn.hashicorp.com/terraform/. Рекомендую всем для обязательного изучения при работе с Terraform.
Итак, для начала создадим файл с переменными, в которых будут прописаны наши персональные данные для подключения к облаку AWS. Файл назовем variables.tf. Все файлы с расширением .tf в текущей папке будут обработаны terrafrom при выполнении.
variable "access_key" {}
variable "secret_key" {}
variable "region" {
default = "us-east-2"
}
Конкретные значения этих переменных пропишем в файле terraform.tfvars, который также обрабатывается terraform при запуске.
access_key = "SOMEACCESSKEY" secret_key = "SOMESECRETKEY" region = "us-east-2"
Теперь, создадим файл с базовыми настройками подключения к AWS и описанием инстанса EC2. Файл назовем ec2.tf. Его содержимое представлено ниже.
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
resource "aws_instance" "web1" {
ami = "ami-4b7d572e"
instance_type = "t2.micro"
key_name = "MyKeyPair"
vpc_security_group_ids = ["${aws_security_group.my_sg.id}"]
}
resource "aws_eip" "ip" {
instance = "${aws_instance.web1.id}"
}
Выше мы создаем provider, который описывает параметры подключения к AWS. После этого создаем инстанс EC2 web1 и публичный адрес этого инстанса. В настройках инстанса указана переменная security-group, которая указывает на те правила пропуска трафика из Интернета к нашим ресурсам в облаке Amazon. Данная security-group прописана у нас в отдельном файле acl.tf. Содержимое этого файла ниже.
name = "my_sg"
description = "Security Group for access EC2."
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = ["0.0.0.0/0"]
}
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"]
}
tags {
Name = "MySG",
Description = "Security group for my aws services"
}
}
В правилах мы разрешаем HTTP, SSH и ICMP входящий трафик, а также весь исходящий трафик.
И в завершение создадим базовый классический балансировщик нагрузки aws elb, который будет пробрасывать трафик снаружи на наши aws сервера (в данном примере на 1 виртуальный сервер). Файл elb.tf приведен ниже.
resource "aws_elb" "elb" {
name = "my-elb"
subnets = ["${aws_instance.web1.subnet_id}"]
security_groups = ["${aws_security_group.my_sg.id}"]
listener {
instance_port = 80
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
}
health_check {
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 3
target = "HTTP:80/"
interval = 30
}
instances = ["${aws_instance.web1.id}"]
cross_zone_load_balancing = true
idle_timeout = 400
connection_draining = true
connection_draining_timeout = 400
tags {
Name = "terraform-elb"
}
}
В файле elb.tf мы создаем балансировщик как ресурс aws_elb. В нем указываем, какой тип трафика мы будем принимать, а также на какие инстансы EC2 этот трафик будем балансировать.
Вот пожалуй и все. Выполняем в консоли команду #terraform apply. В результате выполнения этой команды получаем разворачиванией нашей IT инфраструктуры в облаке Amazon. Можно подключаться к инстансу EC2 через SSH, устанавливать нужный софт для веб приложения. Но это уже не про terraform, поэтому останавливаться на этом не будем.
C помощью команды #aws elb describe-load-balancers узнаем DNS имя нашего балансировщика. Теперь направив HTTP трафик на это имя, мы получим данный трафик на наших EC2 серверах.
Резюме
В примере мы разобрали создание в облаке AWS двух очень популярных сервисов EC2 и ELB. Terraform поддерживает работу и с другими сервисами AWS, а также других провайдеров публичных облаков, таких как GCP, Azure и т.д. Используя файлы конфигураций tf и terraform в целом, мы заметно ускоряем свою работу с облаком, а также при этом автоматизируем многие процессы, которые бы иначе пришлось делать вручную.