Автоматизируем облако с Terraform

02/05/2019

Terraform Logo

Облачные технологии с точки зрения концептуального технического подхода предлагают совершенно иной взгляд на управление IT инфраструктурой. Мы теперь не беспокоимся о том, как работает оборудование, как подключены между собой сервера и СХД, кто и каким образом установит операционную систему и драйвера. Главное внимание теперь уделяется непосредственно нашим приложениям и сервисам. Программный продукт Terraform от HashiCorp позволяет эффективно организовывать необходимую нам IT инфраструктуру в облаке и изменять ее в случае надобности с помощью текстовых конфигурационных файлов. Такой подход в работе называется IaaCInfrastructure-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 в целом, мы заметно ускоряем свою работу с облаком, а также при этом автоматизируем многие процессы, которые бы иначе пришлось делать вручную.

Добавить комментарий

Ваш адрес email не будет опубликован.