ћерион Ќетворкс

7 минут чтени€

¬ предыдущих стать€х мы познакомились как управл€ть ресурсами AWS с помощью Terraform, в данной статье мы посмотрим, как создавать работающий web-сервер с помощью Terraform. ƒл€ развертывани€ насто€щего боевого Web сервера, нам понадобитс€ создать с помощью Terraform два ресурса. »нстанс EC2 и группу безопасности дл€ того, чтобы открыть порт 80 во внешний мир. ƒл€ начала создадим новую директорию Lesson-2 и файл WebServer.tr. ¬споминаем именно данный файл с данным расширением €вл€етс€ основным дл€ написани€ кода и управлени€.

Ќапоминаю, что это обычный текстовый файл, который редактируетс€ с помощью любого текстового редактора в нашем случае мы будем использовать текстовый редактор nano.

Mkdir Lesson-2
cd Lesson-2
nano WebServer.tr

—разу будем привыкать к оформлению кода и добавим в код комментарии, комментарии добавл€ютс€ следующим образом. —тавим знак решетки # и за ней пишем комментарий.

#-----------------------------------------------
# Terraform
#
#Build WebServer during BootStrap
#--------------------------------------------------

ƒл€ начала пишем, кто провайдер и регион дл€ размещени€ наших ресурсов.

provider "aws" {
  region = "eu-central-1"
}    

 стати, есть интересный сайт awsregion.info на котором можно посмотреть название регионов и место размещение. —айт на момент написани€ статьи обновл€етс€ и поддерживаетс€ в актуальном состо€нии.

“ак первый ресурс это инстанс EC2. Resource служебное слово, далее название ресурса в кавычках и им€, которое мы ему даем в кавычках, далее открываютс€ и закрываютс€ фигурные скобки. »менно между ними мы и будем описывать наш ресурс.

ƒалее добавл€ем ami Ц который показывает, какой образ мы будем использовать.

Instance_type Ц тип и размер ресурса, который мы будем использовать.

¬ итоге смотрим, что у нас получилось в первой итерации кода:

resource "aws_instance" "WebServer_my" {
  ami                    = "ami-0767046d1677be5a0" #Amazon Linux ami
  instance_type          = "t2.micro"
}    

¬ результате исполнени€ данной части у нас будет создан инстанс EC2.

ƒалее создадим 2-й ресурс aws_security_group, фактически это правило сети дл€ брандмауэра.

“ак же описание начинаем со служебного слова resource, далее название ресурса и им€ ресурса в кавычках, а в конце открывающа€с€ и закрывающа€с€ скобка в которой пойдет описание ресурса. ”казываем параметр name - этот параметр об€зательный дл€ корректного отображени€, description Ц параметр не об€зательный, но можем указать, vpc_id мы не указываем т.к используем ресурс vpc по умолчанию. ƒалее идет описание правил сетевых на €зыке Terraform. —лужебный параметр ingress дл€ вход€щего трафика с фигурными скобками где мы вставим порты и другие параметры данного параметра. » второй служебный параметр engress дл€ исход€щего трафика с фигурными скобками. Cidr_blocks = [УподсетьФ], указывают откуда или куда разрешен данный поток трафика т.е подсеть 0.0.0.0/0 означает весь интернет или все подсети.

WebServer.tr

ќбратите внимание:

  1. ћы разрешили вход€щий трафик на 80 порт, тот порт на котором будет работать наш веб сервер.
  2. ћы разрешили вход€щий трафик на 22 порт, тот порт, который может принимать соединение дл€ подключени€ по SSH протоколу.
  3. ћы разрешили ICMP трафик до нашего сервера, чтобы можно было из интернета проверить его доступность.
  4. ћы разрешили трафик на 443 порт, если мы в будущем захотим сделать защищенное HTTPS соединение.
  5. » мы разрешили весь исход€щий трафик с сервера указав protocol У-1Ф

¬ такой конфигурации кода Terraform мы получим два отдельных ресурса »нстанс EC2 и группу безопасности, но нас такой вариант не устроит. Ќам необходимо, чтобы данна€ группа безопасности была автоматически присоединена к нашему серверу. Ёто можно сделать с помощью нового параметра, который мы добавим в первую часть кода, где мы описывали aws_instance. ƒанный параметр называетс€ vpc_security_group_id, с помощью данного параметра можно сразу присоединить несколько групп безопасности, через знак равенства и скобки У= [Уномер группы безопасностиФ]Ф. Ќапример, номер группы безопасности можно вз€ть той, что создаетс€ по умолчанию.

Security Groups

¬се остальные указываютс€, через зап€тую. Ќо в нашем случае данный вариант не подойдет, потому что у нас должно все подключитьс€ автоматически, т.е присоединить ту группу безопасности, котора€ создастс€ и которую мы описали ниже. ј делаетс€ это достаточно просто после знака = в квадратных скобках без кавычек вставл€ем aws_security_group Ц то что это группа безопасности, затем . Ц разделитель, затем вставл€ем им€ группы безопасности, которую мы создали mywebserver, оп€ть разделитель символ точки ., и мы ходим вз€ть id. ¬ итоге получаетс€ следующий параметр и его значение:

vpc_security_group_ids = [aws_security_group.mywebserver.id]

Ётой самой строчкой мы прив€зали группу безопасности к нашему создаваемому инстансу. » как следствие возникла зависимость инстанса от группы безопасности. —ледовательно, Terraform создаст сначала группу безопасности, а затем уже создаст инстанс.

 од Terraform не выполн€етс€ сверху вниз, зачастую он исполн€етс€ в зависимости от зависимостей или вообще одновременно, когда многие части завис€т друг от друга. —ледовательно, вот в таком коде мы создали зависимость. ѕо коду вы можете заметить, что если необходимо еще дополнительный порт открыть, например, в группе безопасности, то необходимо скопировать часть кода, отвечающую за открытие порта и добавить необходимые настройки, порт и протокол, подправить cidr_blocks. ѕосле корректировки вставить в правильное место, как параметр.

» дл€ того, чтобы завершить настройку нашего Web сервера, нам необходимо написать параметр user_data. ¬ амазоне это называетс€ bootstrapping, т.е начальна€ загрузка.

User_data = <<EOF
—крипт
EOF    

 ак вы видите сам скрипт будет находитс€ между EOF, а знак << говорит о том, что скрипт мы подаем на ввод.

ƒалее, как любой скрипт в Linux системе мы пишем сначала интерпретатор или shell который будет исполн€ть и на €зыке пон€тном дл€ bash. ѕоэтому в скрипте не должно быть никаких отступов! Ёто важно, даже если плагин текстового редактора пытаетс€ поправить.

“еперь сам скрипт:

user_data              = <<EOF
#!/bin/bash
apt -y update
apt -y install apache2
myip=`curl http://169.254.169.254/latest/meta-data/local-ipv4`
echo "<h2>WebServer with IP: $myip</h2><br> Build by Terraform!" > /var/www/html                                                                                                                                                             /index.html
sudo service httpd start
chkconfig httpd on
EOF

—начала обновл€ем систему apt Цy update, далее команда apt Цy install apache2 устанавливаем apache веб сервер непосредственно. —ледующа€ строка присваиваем значение переменной myip, с помощью получени€ данных из самого амазона curl http://169.254.169.254/latest/meta-data/local-ipv4. ƒалее просто добавл€ем в индексную страницу по умолчанию вывод того что мы получили с подстановкой IP. —ледующа€ строка стартует сервис, и последн€€ строка провер€ет конфигурацию апача.

“аким образом, мы получаем полностью готовый скрипт. Ќам остаетс€ его сохранить в файле и инициализировать Terraform, командой terraform init и даем команду на применение terraform apply.

terraform apply

¬ результате команды мы видим, что будет создано 2 ресурса, все, как и планировалось. »нстанс и группа безопасности.

2 ресурса

 ак мы видим сначала, из-за зависимости создаетс€ группа безопасности. ј затем поднимаетс€ инстанс, к которому и будет прив€зана данна€ группа. —пуст€ пару минут мы можем видеть, что у нас веб сервер подн€лс€.

Web-сервер

IP-адрес можно найти в консоли.

IP-адрес

ƒалее, если нам более данный Web сервер не нужен, то мы его можем уничтожить простой командой terraform destroy. » мы увидим, что из-за зависимостей ресурсы будут уничтожатьс€ в обратном пор€дке тому, в котором они запускались. —начала инстанс, потом группа безопасности.

—крипт вы можете легко модифицировать и добавить более сложные детали установки и настройки веб сервера Ц это полностью рабоча€ конфигураци€.


—кидки 50% в Merion Academy

¬ыбрать курс