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 в целом, мы заметно ускоряем свою работу с облаком, а также при этом автоматизируем многие процессы, которые бы иначе пришлось делать вручную.