AWS EC2 с Terraform
ToC
Что такое EC2
Amazon Elastic Compute Cloud (Amazon EC2) — веб-сервис, который предоставляет вычислительные мощности в облаке (по простому - виртуальные сервера). Сервис входит в инфраструктуру Amazon Web Services.
Настройка
Приступим к конфигурации EC2.
Первое, что необходимо сделать - это создать AMI из которого мы будем создавать сервера.
В примере по ссылке мы создали обычный сервер, но можно туда добавить, например, Nginx и упаковать ваш сайт. Вопрос масштабирования вашего сайта я оставлю за рамками данной заметки.
Итак, добавляем несколько переменных.
- aws_key_name - переменная, которая указывает на имя ssh ключа, который будет добавлен в запускаемый сервер.
- 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
Комментарии: