AWS EC2 с Terraform

ToC

  1. Packer от Hashicorp
  2. Terraform для AWS
  3. AWS VPC с Terraform
  4. AWS EC2 с Terraform

Что такое EC2

Amazon Elastic Compute Cloud (Amazon EC2) — веб-сервис, который предоставляет вычислительные мощности в облаке (по простому - виртуальные сервера). Сервис входит в инфраструктуру Amazon Web Services.

Настройка

Приступим к конфигурации EC2.

Первое, что необходимо сделать - это создать AMI из которого мы будем создавать сервера.

В примере по ссылке мы создали обычный сервер, но можно туда добавить, например, Nginx и упаковать ваш сайт. Вопрос масштабирования вашего сайта я оставлю за рамками данной заметки.

Итак, добавляем несколько переменных.

  1. aws_key_name - переменная, которая указывает на имя ssh ключа, который будет добавлен в запускаемый сервер.
  2. public_az - публичная зона доступности, т.е. зона, в которой будет развернут сервер.

Добавляем их в variables.tf:

variable "aws_key_name" {}
variable "public_az" {}

и в terraform.tfvars:

aws_key_name = "aws"
public_az = "eu-central-1a"

Дальше создаем файл ssh_proxy.tf и добавляем для начала security группу:

resource "aws_security_group" "ssh_proxy" {
    name = "vpc_proxy"
    description = "Proxy scurity policies."

    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"]
    }

    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }

    vpc_id = "${aws_vpc.MyVPC.id}"

    tags {
        Name        = "SshProxy",
        Description = "Security group for SSH proxy to VPC"
    }
}

Таким образом мы создадим группу безопасности с правилами доступа к этому серверу (группе серверов).

Правила ingress описывают разрешения для входящих соединений, а egress - для исходящих. Т.к. это сервер ssh, через который мы будем получать доступ ко внутренним серверам, то и портов тут надо не много - только ssh. Все остальное будет запрещено.

Если хотите, то можете ужесточить правила по своему усмотрению.

Дальше опишем блок получения данных об AMI, из которого мы будем создавать виртуальный сервер:

data "aws_ami" "ssh_proxy_ami" {
  most_recent = true

  filter {
    name   = "architecture"
    values = ["x86_64"]
  }
  filter {
    name   = "name"
    values = ["ssh-proxy_*"]
  }
  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
  name_regex = "ssh-proxy_.*"
  owners     = ["${data.aws_caller_identity.current.account_id}"]
}

Этот блок выберет самый последний образ AMI, имя которого начинается с 'ssh-proxy_' и принадлежит нам, как владельцу.

Теперь запускаем сам сервер:

resource "aws_instance" "ssh_proxy" {
    ami = "${data.aws_ami.ssh_proxy_ami.image_id}"
    availability_zone = "${var.public_az}"
    instance_type = "t2.micro"
    key_name = "${var.aws_key_name}"
    vpc_security_group_ids = ["${aws_security_group.ssh_proxy.id}"]
    associate_public_ip_address = true
    subnet_id = "${aws_subnet.aws-subnet-public.id}"
    source_dest_check = false
    monitoring = false
    root_block_device = {
      volume_size = "10"
      volume_type = "gp2"
    }
    user_data                   = <<EOF
#!/bin/bash
echo "Server ready" > /tmp/up.log
EOF
    tags {
        Name        = "SshProxy",
        Description = "SSH Proxy to VPC"
    }
}

И, наконец, привязываем к нему статический IP адрес, чтоб он у нас не менялся при пересоздании истанса:

resource "aws_eip" "eip_proxy" {
  instance = "${aws_instance.ssh_proxy.id}"
}

output "ssh_proxy_ip" {
  value = "${aws_eip.eip_proxy.public_ip}"
}

Заодно выведем этот адрес, чтоб всегда можно было знать, куда к нему обращаться.

В итоге мы имеем пограничный хост к нашей внутренней сети, через который мы можем ходить на внутренние сервера по ssh.

В исходниках на GitHub я так же сделаю несколько хостов с Nginx, которые будут у нас раздавать какие-то файлы через ELB (Elastic Load Balancer) балансировщик нагрузки, о котором мы поговорим в следующий раз.

Чтоб уничтожить все созданные ресурсы (кроме AMI) надо сделать destroy:

$ terraform destroy -var-file=terraform.tfvars


Comments !