Читаем Terraform: инфраструктура на уровне кода полностью

В главе 2 с помощью консоли AWS вы создали учетную запись AWS и пользователя Access Management (IAM). Теперь с помощью этого пользователя вы можете создавать и администрировать всех будущих пользователей IAM прямо в коде Terraform. Рассмотрим следующий код, который должен находиться в файле live/global/iam/main.tf:

provider "aws" {

  region = "us-east-2"

}

resource "aws_iam_user" "example" {

  name = "neo"

}

Здесь используется ресурс aws_iam_user для создания одного нового пользователя IAM. Но если необходимо создать трех пользователей? В языке программирования общего назначения вы бы применили цикл for:

# Это просто псевдокод. Он не будет работать в Terraform.

for (i = 0; i < 3; i++) {

  resource "aws_iam_user" "example" {

    name = "neo"

  }

}

В языке Terraform нет встроенной поддержки циклов for и другой традиционной процедурной логики, поэтому такой синтаксис работать не будет. Однако у каждого ресурса Terraform есть метапараметр под названием count. Это самая старая, простая ограниченная разновидность итератора в Terraform: она просто определяет, сколько копий ресурса нужно создать. Вот как с помощью этого параметра создать трех пользователей IAM:

resource "aws_iam_user" "example" {

  count = 3

  name  = "neo"

}

У этого кода есть одна проблема: у всех трех пользователей IAM будет одно и то же имя. Это приведет к ошибке, так как имена пользователей должны быть уникальными. Если бы у вас был доступ к стандартному циклу for, вы могли бы использовать индекс i, чтобы изменить каждое имя:

# Это просто псевдокод. Он не будет работать в Terraform.

for (i = 0; i < 3; i++) {

  resource "aws_iam_user" "example" {

    name = "neo.${i}"

  }

}

Чтобы добиться того же в Terraform и получить индекс каждой итерации в цикле, можно воспользоваться ссылкой count.index:

resource "aws_iam_user" "example" {

  count = 3

  name  = "neo.${count.index}"

}

Если выполнить команду plan для представленного выше кода, можно увидеть, что Terraform собирается создать трех пользователей IAM с разными именами ("neo.0", "neo.1", "neo.2"):

Terraform will perform the following actions:

  # aws_iam_user.example[0] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo.0"

    + path          = "/"

    + unique_id     = (known after apply)

  }

  # aws_iam_user.example[1] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo.1"

    + path          = "/"

    + unique_id     = (known after apply)

  }

  # aws_iam_user.example[2] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo.2"

    + path          = "/"

    + unique_id     = (known after apply)

  }

Plan: 3 to add, 0 to change, 0 to destroy.

Конечно, такое имя, как "neo.0", будет не очень полезным. Но если совместить count.index с некоторыми встроенными в Terraform функциями, каждую итерацию этого цикла можно изменить еще сильнее.

Например, все нужные вам имена пользователей IAM можно перечислить во входной переменной внутри live/global/iam/variables.tf:

variable "user_names" {

  description = "Create IAM users with these names"

  type        = list(string)

  default     = ["neo", "trinity", "morpheus"]

}

В языке программирования общего назначения с циклами и массивами вы бы назначили каждому пользователю IAM отдельное имя путем поиска значений в массиве var.user_names по индексу i:

# Это просто псевдокод. Он не будет работать в Terraform.

for (i = 0; i < 3; i++) {

  resource "aws_iam_user" "example" {

    name = vars.user_names[i]

  }

}

В Terraform то же самое можно сделать с помощью count в сочетании:

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

ARRAY[]

Например, вот как взять из массива var.user_names элемент с индексом 1:

var.user_names[1]

• с функцией length. У Terraform есть встроенная функция под названием length, которая имеет следующий синтаксис:

length()

Как вы уже догадались, функция length возвращает количество элементов в заданном массиве. Она также работает со строками и ассоциативными массивами.

Если все это объединить, получится следующее:

resource "aws_iam_user" "example" {

  count = length(var.user_names)

  name  = var.user_names[count.index]

}

Теперь, если выполнить команду plan, можно увидеть, что Terraform собирается создать трех пользователей IAM с уникальными именами:

Terraform will perform the following actions:

  # aws_iam_user.example[0] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo"

    + path          = "/"

    + unique_id     = (known after apply)

  }

  # aws_iam_user.example[1] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "trinity"

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги

Старший брат следит за тобой. Как защитить себя в цифровом мире
Старший брат следит за тобой. Как защитить себя в цифровом мире

В эпоху тотальной цифровизации сложно представить свою жизнь без интернета и умных устройств. Но даже люди, осторожно ведущие себя в реальном мире, часто недостаточно внимательно относятся к своей цифровой безопасности. Между тем с последствиями такой беспечности можно столкнуться в любой момент: злоумышленник может перехватить управление автомобилем, а телевизор – записывать разговоры зрителей, с помощью игрушек преступники могут похищать детей, а к видеокамерам можно подключиться и шпионить за владельцами. Существуют и государственные проекты наподобие «Умного города», подразумевающие повсеместное внедрение видеокамер и технологий распознавания лиц.Все это не значит, что нужно стремиться к цифровому затворничеству и панически избегать гаджетов, но необходимо изучить и соблюдать элементарные правила безопасности. Михаил Райтман в своей книге рассказывает, как максимально снизить вероятность утечки персональных данных, осложнив задачу потенциальным злоумышленникам.

Михаил Анатольевич Райтман

Зарубежная компьютерная, околокомпьютерная литература
Восстановление данных на 100%
Восстановление данных на 100%

В книге изложены методы восстановления данных с различных носителей информации – жестких дисков, массивов RAID, CD, DVD, карт флэш-памяти, карт фотоаппаратов и мобильных телефонов. Ремонт поврежденного оборудования рассматривается в издании только как один из аспектов всего процесса извлечения данных. Основная тема – извлечение данных, поврежденных из-за физических или логических нарушений в работе компьютерной системы либо неверных действий пользователя. В книге рассматривается восстановление случайно удаленных файлов, извлечение ценной информации с поломанных жестких дисков; описываются программы и методика восстановления данных с поврежденных массивов RAID, что критически важно для работы корпоративных компьютерных систем.Книга не требует специальной подготовки читателя: простые пошаговые процедуры восстановления данных предваряются описанием принципов их хранения на различных носителях.

Петр Андреевич Ташков

Зарубежная компьютерная, околокомпьютерная литература / Прочая компьютерная литература / Книги по IT