СОЗДАНИЕ WEB СЕРВЕРА В AWS С ПОМОЩЬЮ TERRAFORM

Thank you for reading this post, don't forget to subscribe!

в дан­ной ста­тье мы посмот­рим, как созда­вать рабо­та­ю­щий web-сер­вер с помо­щью Terraform. Для раз­вер­ты­ва­ния насто­я­ще­го бое­во­го Web сер­ве­ра, нам пона­до­бит­ся создать с помо­щью Terraform два ресур­са. Инстанс EC2 и груп­пу без­опас­но­сти для того, что­бы открыть порт 80 во внеш­ний мир. Для нача­ла созда­дим новую дирек­то­рию Lesson-2 и файл WebServer.tr. Вспо­ми­на­ем имен­но дан­ный файл с дан­ным рас­ши­ре­ни­ем явля­ет­ся основ­ным для напи­са­ния кода и управления.

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

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

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

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

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

Так пер­вый ресурс это инстанс EC2Resource слу­жеб­ное сло­во, далее назва­ние ресур­са в кавыч­ках и имя, кото­рое мы ему даем в кавыч­ках, далее откры­ва­ют­ся и закры­ва­ют­ся фигур­ные скоб­ки. Имен­но меж­ду ними мы и будем опи­сы­вать наш ресурс.

Далее добав­ля­ем ami – кото­рый пока­зы­ва­ет, какой образ мы будем использовать.

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

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

В резуль­та­те испол­не­ния дан­ной части у нас будет создан инстанс EC2.

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

Так же опи­са­ние начи­на­ем со слу­жеб­но­го сло­ва resource, далее назва­ние ресур­са и имя ресур­са в кавыч­ках, а в кон­це откры­ва­ю­ща­я­ся и закры­ва­ю­ща­я­ся скоб­ка в кото­рой пой­дет опи­са­ние ресур­са. Ука­зы­ва­ем параметр
name - этот пара­метр обя­за­тель­ный для кор­рект­но­го отображения,
description – пара­метр не обя­за­тель­ный, но можем указать,
vpc_id мы не ука­зы­ва­ем т.к исполь­зу­ем ресурс vpc по умол­ча­нию. Далее идет опи­са­ние пра­вил сете­вых на язы­ке Terraform. Слу­жеб­ный параметр
ingress для вхо­дя­ще­го тра­фи­ка с фигур­ны­ми скоб­ка­ми где мы вста­вим пор­ты и дру­гие пара­мет­ры дан­но­го пара­мет­ра. И вто­рой слу­жеб­ный параметр
engress для исхо­дя­ще­го тра­фи­ка с фигур­ны­ми скобками.
Cidr_blocks = [“подсеть”], ука­зы­ва­ют отку­да или куда раз­ре­шен дан­ный поток тра­фи­ка т.е под­сеть 0.0.0.0/0 озна­ча­ет весь интер­нет или все подсети.

Обра­ти­те внимание:

  1. Мы раз­ре­ши­ли вхо­дя­щий тра­фик на 80 порт, тот порт на кото­ром будет рабо­тать наш веб сервер.
  2. Мы раз­ре­ши­ли вхо­дя­щий тра­фик на 22 порт, тот порт, кото­рый может при­ни­мать соеди­не­ние для под­клю­че­ния по SSH протоколу.
  3. Мы раз­ре­ши­ли ICMP тра­фик до наше­го сер­ве­ра, что­бы мож­но было из интер­не­та про­ве­рить его доступность.
  4. Мы раз­ре­ши­ли тра­фик на 443 порт, если мы в буду­щем захо­тим сде­лать защи­щен­ное HTTPS соединение.
  5. И мы раз­ре­ши­ли весь исхо­дя­щий тра­фик с сер­ве­ра ука­зав protocol “-1”

В такой кон­фи­гу­ра­ции кода Terraform мы полу­чим два отдель­ных ресур­са Инстанс EC2 и груп­пу без­опас­но­сти, но нас такой вари­ант не устро­ит. Нам необ­хо­ди­мо, что­бы дан­ная груп­па без­опас­но­сти была авто­ма­ти­че­ски при­со­еди­не­на к наше­му сер­ве­ру. Это мож­но сде­лать с помо­щью ново­го пара­мет­ра, кото­рый мы доба­вим в первую часть кода, где мы опи­сы­ва­ли aws_instance. Дан­ный пара­метр назы­ва­ет­ся vpc_security_group_id, с помо­щью дан­но­го пара­мет­ра мож­но сра­зу при­со­еди­нить несколь­ко групп без­опас­но­сти, через знак равен­ства и скоб­ки “= [“номер группы безопасности”]”. Напри­мер, номер груп­пы без­опас­но­сти мож­но взять той, что созда­ет­ся по умолчанию.

Все осталь­ные ука­зы­ва­ют­ся, через запя­тую. Но в нашем слу­чае дан­ный вари­ант не подой­дет, пото­му что у нас долж­но все под­клю­чить­ся авто­ма­ти­че­ски, т.е при­со­еди­нить ту груп­пу без­опас­но­сти, кото­рая создаст­ся и кото­рую мы опи­са­ли ниже. А дела­ет­ся это доста­точ­но про­сто после зна­ка = в квад­рат­ных скоб­ках без кавы­чек встав­ля­ем aws_security_group – то что это груп­па без­опас­но­сти, затем . – раз­де­ли­тель, затем встав­ля­ем имя груп­пы без­опас­но­сти, кото­рую мы созда­ли mywebserver, опять раз­де­ли­тель сим­вол точ­ки ., и мы ходим взять id. В ито­ге полу­ча­ет­ся сле­ду­ю­щий пара­метр и его значение:

vpc_security_group_ids = [aws_security_group.mywebserver.id]

Этой самой строч­кой мы при­вя­за­ли груп­пу без­опас­но­сти к наше­му созда­ва­е­мо­му инстан­су. И как след­ствие воз­ник­ла зави­си­мость инстан­са от груп­пы без­опас­но­сти. Сле­до­ва­тель­но, Terraform создаст сна­ча­ла груп­пу без­опас­но­сти, а затем уже создаст инстанс.

Код Terraform не выпол­ня­ет­ся свер­ху вниз, зача­стую он испол­ня­ет­ся в зави­си­мо­сти от зави­си­мо­стей или вооб­ще одно­вре­мен­но, когда мно­гие части зави­сят друг от дру­га. Сле­до­ва­тель­но, вот в таком коде мы созда­ли зави­си­мость. По коду вы може­те заме­тить, что если необ­хо­ди­мо еще допол­ни­тель­ный порт открыть, напри­мер, в груп­пе без­опас­но­сти, то необ­хо­ди­мо ско­пи­ро­вать часть кода, отве­ча­ю­щую за откры­тие пор­та и доба­вить необ­хо­ди­мые настрой­ки, порт и про­то­кол, под­пра­вить cidr_blocks. После кор­рек­ти­ров­ки вста­вить в пра­виль­ное место, как параметр.

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

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

Далее, как любой скрипт в Linux систе­ме мы пишем сна­ча­ла интер­пре­та­тор или shell кото­рый будет испол­нять и на язы­ке понят­ном для bash. Поэто­му в скрип­те не долж­но быть ника­ких отсту­пов! Это важ­но, даже если пла­гин тек­сто­во­го редак­то­ра пыта­ет­ся поправить.

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

Сна­ча­ла обнов­ля­ем систе­му 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.

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

Как мы видим сна­ча­ла, из-за зави­си­мо­сти созда­ет­ся груп­па без­опас­но­сти. А затем под­ни­ма­ет­ся инстанс, к кото­ро­му и будет при­вя­за­на дан­ная груп­па. Спу­стя пару минут мы можем видеть, что у нас веб сер­вер поднялся.

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

Далее, если нам более дан­ный Web сер­вер не нужен, то мы его можем уни­что­жить про­стой коман­дой terraform destroy. И мы уви­дим, что из-за зави­си­мо­стей ресур­сы будут уни­что­жать­ся в обрат­ном поряд­ке тому, в кото­ром они запус­ка­лись. Сна­ча­ла инстанс, потом груп­па безопасности.

Скрипт вы може­те лег­ко моди­фи­ци­ро­вать и доба­вить более слож­ные дета­ли уста­нов­ки и настрой­ки веб сер­ве­ра – это пол­но­стью рабо­чая конфигурация.