ДИНАМИЧЕСКИЕ БЛОКИ КОДА TERRAFORM

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

Дан­ный функ­ци­о­нал был добав­лен в terraform 0.12 вер­сии. Для рабо­ты созда­дим новую дирек­то­рию, мож­но путем копи­ро­ва­ния из преды­ду­ще­го уро­ка. Дирек­то­рию назо­вем lesson-5. Для напи­са­ния кода мы по-преж­не­му исполь­зу­ем тек­сто­вый редак­тор Atom.

Мы можем создать фай­лик с име­нем DynamicSecurityGroup.tf или пере­име­ну­ем суще­ству­ю­щий webserver.tf если вы доба­ви­ли пап­ку путем копи­ро­ва­ния. Если вы созда­ва­ли путем копи­ро­ва­ния отре­дак­ти­ру­ем файл, убрав строч­ки, кото­рые созда­ют веб-сервер.

Уда­ля­ем. Теперь мы нач­нем писать код Terraform, что­бы у нас появи­лась дина­ми­че­ская груп­па безопасности.

В про­шлой ста­тье мы про­пи­сы­ва­ли 2 пра­ви­ла. Дан­ные пра­ви­ла откры­ва­ли нам пор­ты 80 и 22, ана­ло­гич­но мож­но про­пи­сать, что­бы откры­вал­ся порт 443 ну или любой дру­гой, кото­рый нам необ­хо­дим для кор­рект­но­го инстан­са и рабо­то­спо­соб­но­сти сервиса.

А теперь пред­ста­вим, что нам необ­хо­ди­мо открыть еще 20 раз­ных пор­тов. Мож­но сде­лать это с помо­щью copy-paste, т.е. копи­ро­ва­ни­ем и встав­кой уже суще­ству­ю­щих бло­ков кода с редак­ти­ро­ва­ни­ем про­то­ко­ла и номе­ров пор­тов. В terraform вер­сии 0.12 доба­ви­ли функ­ци­о­нал и назва­ли его DynamicBlocks, что поз­во­лит гене­ри­ро­вать кусоч­ки кода в Terraform.

Доба­вим сле­ду­ю­щую часть кода:

Раз­бе­рем для луч­ше­го пони­ма­ния. Функ­ция Dynamic, далее кавыч­ки двой­ные и внут­ри мы пишем, что-будет дина­ми­че­ским, в нашем слу­чае это функ­ция Ingress. Откры­ва­ем фигур­ные скоб­ки и пишем цикл с помо­щью for_each = ["номерпорта1", "номерпорта2"] ука­зы­вая номе­ра пор­тов. Сле­до­ва­тель­но, цикл for_each прой­дет­ся по каж­до­му из пара­мет­ров и будет при­ме­не­на кон­струк­ция content. Зна­че­ния внут­ри кон­струк­ции content, будут заме­не­ны, а имен­но с како­го пор­та на какой порт откры­ва­ет­ся доступ.

Далее в кон­струк­ции content опи­сы­ва­ем исполь­зу­е­мый про­то­кол сете­во­го уров­ня и cider_blocks – с каких IP или диа­па­зо­нов IP раз­ре­ше­но исполь­зо­вать дан­ной пра­ви­ло. Кон­струк­ция 0.0.0.0/0 поз­во­ля­ет ука­зать, что дан­ное пра­ви­ло с дан­ным пор­том раз­ре­ше­но исполь­зо­вать все­му интер­не­ту вне зави­си­мо­сти от IP адре­са. В целях инфор­ма­ци­он­ной без­опас­но­сти реко­мен­дую исполь­зо­вать кон­крет­ные под­се­ти или кон­крет­ные IP адре­са, конеч­но, если это не пуб­лич­ный сервис.

Если посмот­реть на при­мер, то напи­сан­ное таким обра­зом пра­ви­ло, сге­не­ри­ру­ет нам 5 отдель­ных пра­вил, т.е. полу­ча­ет­ся доста­точ­но удоб­но и сокра­ща­ет нам коли­че­ство стро­чек в коде, а так­же потен­ци­аль­но коли­че­ство оши­бок. Код ста­но­вит­ся более чита­е­мым и легким.

После исполь­зо­ва­ния в коде функ­ции dynamic, мы можем уда­лить все став­шие ненуж­ны­ми функ­ции ingress. Не забы­вай­те изме­нить имя ресур­са. Это дела­ет­ся путем редак­ти­ро­ва­ния пере­мен­ной name в раз­де­ле функ­ции resource, для чита­е­мо­сти кода и удоб­ства управ­ле­ния ресур­са­ми в обла­ке AWS.

После того, как у нас готов наш код, мы можем его запу­стить. Так как, была созда­на новая пап­ка, нам необ­хо­ди­мо ини­ци­а­ли­зи­ро­вать ее исполь­зо­ва­ния. Пере­хо­дим в необ­хо­ди­мую дирек­то­рию, в кото­рой нахо­дит­ся файл. И запус­ка­ем ини­ци­а­ли­за­цию стан­дарт­ной коман­дой terraform init. После вво­да коман­ды ожи­да­ем пару минут, пока Terraform ска­ча­ет все необ­хо­ди­мые моду­ли для под­клю­че­ния и рабо­ты. Сле­ду­ю­щей коман­дой terraform apply мы запус­ка­ем код на испол­не­ние. И полу­ча­ем запрос на под­твер­жде­ние опе­ра­ции. Сре­ди выво­да мы можем видеть:

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