Terraform + SageMaker Часть 1b: Инициализация Terraform с помощью Terraform Cloud

Помогаем вам приступить к созданию ресурсов в AWS SageMaker с помощью Terraform (теперь с Terraform Cloud!)

Привет всем! Мы снова вернулись с заведомо неожиданным постом с немного забавной предысторией. Как вы, возможно, помните из нашего исходного поста, мы познакомились с Terraform, запустив команды Terraform непосредственно на вашем локальном компьютере и сохранив файл .tfstate в серверной части AWS S3. Все в этом посте по-прежнему на 100% актуально, и, поскольку он объясняет множество концепций Terraform в целом, я определенно рекомендую вам вернуться и просмотреть это, если вы новичок в Terraform.

Правда, почему я пишу этот новый пост с использованием Terraform Cloud, связана с двумя моими маленькими дочками. Как вы, возможно, знаете, у меня есть интересная установка для личной разработки, в которой я использую iPad Pro в качестве основной машины, и, зная, что iPad имеет свои ограничения для разработки программного обеспечения, я использую Raspberry Pi в качестве вычислительного аксессуара для установки. или запускать любые программные пакеты, которые изначально не могут работать на iPad. Ниже показано, как выглядит эта общая установка, и я написал целую серию статей о том, как вы можете подражать этой же настройке, если хотите.

Моим 3 и 4-летним дочерям нравится мой Raspberry Pi. Когда я имею в виду любовь, я имею в виду, что они просто думают, что это круто. 😂 Они еще слишком молоды, чтобы понять, для чего я их использую, но их любопытные умы все еще любят играть с этим. И, по моей глупости, чехол, который я купил для защиты Raspberry Pi, изображенный выше, не скреплен винтами. Все это красиво встает на место, поэтому, если вам когда-либо нужно было быстро добраться до платы Pi, то этот чехол идеально подходит для этого.

Что ж ... этот безвинтовой корпус не совсем защищен от детей. Мои дочери, как известно, бегают по дому с моим Raspberry Pi и, конечно же, роняют его. На прошлой неделе они уронили его настолько сильно, что он погнулся и сломал карту microSD, на которой размещалась операционная система и данные Pi, что фактически сделало мой Raspberry Pi бесполезным, пока я не смог получить новую карту microSD и загрузить ее должным образом. Слава богу, Raspberry Pi сам по себе был в полном порядке, и я усвоил урок: корпус Raspberry Pi с винтами должен быть доставлен ко мне домой сегодня!

Тем не менее, этот пост является прямым ответом на следующий вопрос: Как я могу запустить Terraform, если у меня нет инструментов Terraform, работающих на моем локальном компьютере? (Или, более конкретно, в моем случае , как я могу продолжать использовать Terraform, когда мои дочери «ломают» мой Raspberry Pi?) Как вы могли догадаться по названию этой публикации, ответ - Terraform Cloud! В этом посте мы расскажем, как можно использовать Terraform Cloud вместо локального Terraform, но я считаю важным повторить, что этот пост НЕ является прямой заменой того, что мы рассмотрели в исходном посте. Если вам нравится запускать команды Terraform локально, вы можете пропустить этот пост и продолжить работу с этим шаблоном.

В остальной части нашей серии Terraform + SageMaker вы сможете попеременно использовать либо локальный Terraform, либо Terraform Cloud. Если вы предпочитаете использовать Terraform Cloud, я снова рекомендую вам просмотреть наш оригинальный пост, поскольку он охватывает много общих знаний для тех из вас, кто только начинает работать с Terraform. Предполагается, что вы знакомы с содержанием исходного сообщения.

Хорошо, прежде чем мы перейдем к настройке Terraform Cloud, давайте кратко поговорим о некоторых преимуществах использования Terraform Cloud.

Почему Terraform Cloud?

Как бы хороша ни была работа с Terraform с локальной машины, есть некоторые проблемы с масштабируемостью, с которыми нужно быть особенно осторожными, если ими не управлять должным образом. Эти проблемы включают следующее:

  • Внутреннее расположение файла tfstate: Terraform позволяет гибко хранить tfstate файл с множеством опций, которые могут быть как благословением, так и проклятием. Благо - гибкость опций, но проклятие - то, что ваша организация может иметь tfstate файлы, плавающие повсюду, если ваши команды решат использовать другие варианты внутреннего хранилища.
  • Случайная перезапись файла tfstate: подниму руку и признаю, что я узнал об этом на собственном опыте, к счастью, только в среде песочницы! Настраивая серверную часть вручную в конфигурации Terraform, вы ДОЛЖНЫ убедиться, что ваш tfstate ключ отличается, если вы используете ту же общую опцию серверной части. Например, если вы и ваш друг используете одну и ту же корзину AWS S3 в качестве бэкэнда и оба устанавливаете для ключа tfstate значение my-terraform-backend.tfstate, вы БУДЕТЕ перезаписывать работу друг друга. А это также означает, что вы можете случайно вывести из строя чужую инфраструктуру. Это огромный риск!
  • Отслеживание ваших модулей Terraform: я знаю, что мы еще не рассмотрели модули, но, как вы могли догадаться, наличие многоразовых модулей Terraform имеет большое значение для быстрого создания и запуска аналогичной инфраструктуры. последовательный способ. Вполне возможно разместить все наши модули Terraform локально, но, опять же, вы рискуете столкнуться с проблемой разрастания, если ваши группы разработки не будут последовательно управлять расположением этих модулей.

Это всего лишь несколько вопросов, чтобы назвать несколько. В качестве средства решения всех этих и других проблем HashiCorp разработала Terraform Cloud и Terraform Enterprise более высокого уровня. Вот лишь некоторые из этих функций:

  • Прямая интеграция VCS (например, GitHub, GitLab и т. Д.)
  • Удаленный запуск Terraform
  • Безопасное хранение файла tfstate в самом Terraform Cloud
  • Общедоступный или частный реестр модулей
  • Политика Sentinel

Terraform Cloud предлагает различные предложения с увеличивающимся количеством функций в зависимости от стоимости. (Вы можете прочитать обо всех этих предложениях здесь.) Для наших целей мы будем придерживаться бесплатного варианта базового уровня, поскольку в этой серии Terraform + SageMaker предполагается, что вы - одинокий актер, и поэтому вам не о чем беспокоиться. о командах людей. Однако важно отметить, что если вы намереваетесь масштабировать Terraform в своей организации, я настоятельно рекомендую вам рассмотреть одно из многоуровневых предложений Terraform Cloud или Terraform Enterprise.

Давайте прямо сейчас перейдем к использованию Terraform Cloud! 😃

Настройка учетной записи Terraform Cloud

Естественно, наш первый шаг в работе с Terraform Cloud - это настройка учетной записи Terraform Cloud. Вы можете сделать это, перейдя на основной веб-сайт Terraform Cloud и нажав кнопку Создать учетную запись. Я не собираюсь здесь описывать эти точные шаги, поскольку регистрация учетной записи Terraform Cloud довольно интуитивно понятна. Он запросит у вас такие вещи, как ваш адрес электронной почты и то, как вы хотите назвать свою организацию, и вы можете заполнить все, что вам подходит. Я лично назвал свою организацию dkhundley, потому что это просто хороший брендинг! 😂

После завершения регистрации вы должны увидеть экран, который выглядит следующим образом:

Перейдем к подключению вашего VCS-провайдера.

Подключение вашего провайдера VCS

Как очень кратко упоминалось выше, одним из больших преимуществ Terraform Cloud является прямая интеграция с поставщиком VCS, таким как GitHub или GitLab. Это позволяет Terraform Cloud подключаться к вашему репозиторию VCS, чтобы предпринимать соответствующие действия при внесении определенных изменений в репозиторий. Например, вы можете настроить все таким образом, чтобы при отправке нового кода Terraform в ветку main Terraform Cloud мог автоматически обнаруживать эти новые изменения и автоматически применять эти изменения к вашей инфраструктуре. Очень круто!

Чтобы использовать эту функцию, мы сначала должны убедиться, что ваш провайдер VCS правильно подключен к вашей учетной записи Terraform Cloud. Для наших целей я собираюсь использовать для этого GitHub, но вы, безусловно, можете использовать своего поставщика VCS по своему выбору!

Для краткости я не собираюсь копировать здесь все эти шаги о том, как это сделать, а вместо этого укажу вам на официальную документацию HashiCorp по этой теме. Если вы успешно настроили своего поставщика VCS, теперь вы должны увидеть, что ваш провайдер отображается следующим образом:

Хорошо! Теперь приступим к созданию вашего первого рабочего пространства Terraform Cloud, подключенного к репозиторию исходного кода!

Создание рабочей области Terraform Cloud

(Обратите внимание, прежде чем переходить к этому разделу: по иронии судьбы это НЕ работает в пользовательском интерфейсе при работе с мобильным браузером, включая браузер на моем любимом iPad. Есть какая-то ошибка, которая не позволяет пользовательскому интерфейсу правильно создавать рабочее пространство. Я уведомил HashiCorp об этом, и они активно изучают этот вопрос. Спасибо, HashiCorp! Есть обходной путь, который я использовал в виде клиента Python под названием terrasnek, и хотя он отлично сработал для создания моего рабочего пространства, мы не собираюсь рассказать об этом здесь, так как пользовательский интерфейс намного проще.)

Итак, подключив вашего поставщика VCS, мы можем приступить к созданию нашего первого рабочего пространства! В рабочей области мы будем использовать Terraform Cloud для отслеживания конкретных изменений в нашем репозитории и внесения изменений соответствующим образом. Для простоты мы будем прослушивать основную main ветку и вручную запускать эквивалентные команды plan и apply.

Чтобы на самом деле создать свое рабочее пространство, используйте шаги пользовательского интерфейса, чтобы…

  • Выберите свой рабочий процесс (в нашем случае это будет VCS)
  • Подключитесь к своей VCS, которая предоставляет действительно удобный пользовательский интерфейс для выбора точного репозитория от вашего поставщика VCS, который вы создали в предыдущем разделе.
  • Настройте свои параметры
  • Создайте рабочее пространство!

Прошу прощения, если эти шаги кажутся немного… краткими. Как отмечалось выше, я не мог заставить пользовательский интерфейс работать для меня должным образом, так как я использую свой iPad, но я делал это раньше на обычном компьютере и помню, что пользовательский интерфейс был очень интуитивно понятным.

В любом случае, как только вы создадите свое рабочее пространство, вам понадобится как минимум еще одна вещь. Как вы могли вспомнить в исходном сообщении, вам необходимо убедиться, что Terraform имеет правильные учетные данные, чтобы правильно выполнить создание инфраструктуры. Это означает использование тех же AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, которые мы создали вместе с нашей ролью IAM. Если вам нужно напомнить, как это сделать, ознакомьтесь с официальной документацией AWS здесь.

Имея под рукой эти идентификаторы AWS, перейдите на вкладку «Переменные» в пользовательском интерфейсе обзора рабочей области. В этом пользовательском интерфейсе у вас есть возможность ввести два типа переменных: «Переменные Terraform» и «Переменные среды». Мы пропустим раздел «Переменные Terraform», так как в будущих публикациях мы будем использовать фактический файл .tfvars, а в разделе «Переменные среды» вы поместите свои соответствующие AWS_ACCESS_KEY_ID и AWS_SECRET_KEY_ID. Определенно не стесняйтесь устанавливать флажок "Деликатная", пока вы это делаете! Вот как выглядит мой экран после этого шага:

Быстрая проверка кода Terraform

Как вы, возможно, помните из исходного сообщения, мы протестировали некоторые базовые команды Terraform, чтобы создать очень простой IAM с очень ограниченным доступом. Мы собираемся использовать тот же код с двумя небольшими изменениями. Есть два файла конфигурации Terraform: один для серверной части, а другой для роли IAM. Вот код для iam.tf:

## DATA BLOCKS
## ----------------------------------------------------------------
# Creating the data that will be used by the IAM policy
data "aws_iam_policy_document" "s3_ls_policy_data" {
  statement {
    actions = [
      "s3:ListAllMyBuckets"
    ]
resources = [
      "arn:aws:s3:::*"
    ]
  }
}
# Creating the assume role policy data
data "aws_iam_policy_document" "s3_ls_assume_role_data" {
  statement {
    actions = ["sts:AssumeRole"]
principals {
      type        = "Service"
      identifiers = ["s3.amazonaws.com"]
    }
  }
}
## RESOURCE BLOCKS
## ----------------------------------------------------------------
# Creating the IAM policy using the data block from above
resource "aws_iam_role_policy" "s3_ls_policy" {
  name   = "s3_ls_iam_policy"
  policy = data.aws_iam_policy_document.s3_ls_policy_data.json
  role   = aws_iam_role.s3_ls_role.id
}
# Creating the IAM role associated to the resources above
resource "aws_iam_role" "s3_ls_role" {
  name               = "s3_ls_iam_role_tfcloud"
  description        = "This role allows for all S3 buckets to be listed."
  assume_role_policy = data.aws_iam_policy_document.s3_ls_assume_role_data.json
}

И код backend.tf:

# terraform {
#   backend "s3" {
#     bucket = "dkhundley-terraform-test"
#     key    = "terraform-sagemaker-tutorial.tfstate"
#     region = "us-east-1"
#   }
# }
provider "aws" {
  region = "us-east-1"
}

По сравнению с исходным постом есть два изменения: одно большое и одно маленькое. Небольшое изменение - это изменение имени роли IAM с s3_ls_iam_role на s3_ls_iam_tfcloud, и это просто для того, чтобы гарантировать, что наш результат исходит из этого «нового» кода Terraform. Большое изменение заключается в том, что я закомментировал блок terraform, содержащий серверную часть S3. Помните, что Terraform Cloud предлагает функцию безопасного хранения tfstate файла. Это делается по умолчанию, если серверная часть отсутствует. ОДНАКО, если бы я оставил этот бэкэнд-блок S3 там, бэкэнд бы пошел туда. (Это не совсем плохо, но нежелательно, если вы предпочитаете, чтобы Terraform Cloud хранил ваш tfstate файл.)

Я немного забегаю вперед, но просто чтобы показать вам, что мой tfstate файл действительно теперь находится в Terraform Cloud, посмотрите этот снимок экрана, который я сделал сразу после того, как Terraform Cloud создал мои ресурсы:

Хорошо, теперь давайте продолжим и используем Terraform Cloud для создания этих вещей в AWS!

Создание ресурсов с помощью команд пользовательского интерфейса, вводимых вручную

Здесь начинается самое интересное, в основном потому, что это очень легко сделать и приятно смотреть. В рабочем пространстве вы увидите кнопку с надписью «Очередь вручную» в правом верхнем углу экрана. Если вы нажмете на нее, откроется вспомогательный интерфейс, который выглядит следующим образом:

Чтобы начать этап планирования (или terraform plan, если вы помните из интерфейса командной строки), все, что вам нужно сделать, это заполнить это необязательное поле «причина» и нажать фиолетовую кнопку «План очереди». Это начнет фазу планирования, и вас должен встретить экран, на котором будут представлены выходные данные плана, а также возможность пользовательского интерфейса для утверждения планов фактического развертывания. (Также эквивалент terraform apply из интерфейса командной строки)

И как только Terraform Cloud создаст ваши ресурсы на AWS, вы получите экран с таким приятным зеленым цветом, указывающим на успех!

Уничтожение ресурсов с помощью пользовательского интерфейса

Обычно это не то, что люди хотят делать, поскольку это очень рискованный шаг в производственной среде, поэтому команда уничтожения (которую вы можете вспомнить как terraform destroy в интерфейсе командной строки) не так очевидна, как команда plan / apply. . В пользовательском интерфейсе рабочей области переключите раскрывающийся список «Настройки» и выберите вариант «Уничтожение и удаление». Откроется пользовательский интерфейс, который выглядит следующим образом:

Для тех, кто плохо знаком с Terraform в целом, эти термины могут немного сбивать с толку, поэтому позвольте мне быстро пояснить различие здесь:

  • Уничтожить инфраструктуру. Это эквивалентно команде terraform destroy из интерфейса командной строки. Эта команда просматривает все ресурсы, указанные в файле tfstate, и выполняет план удаления этих ресурсов на AWS. В нашем конкретном примере это означает, что созданная нами выше роль IAM исчезнет.
  • Удалить рабочую область. Эта функция используется только в облаке Terraform и по сути эквивалентна удалению вашего tfstate файла из серверной части S3. (Очевидно, что в Terraform Cloud есть еще кое-что для удаления, поскольку в нем есть переменные, настройки и другие мелкие настройки.) Хотя удаление вашего рабочего пространства приведет к удалению вашего tfstate файла, оно НЕ удалит ресурсы, которые вы создали с этим tfstate файлом. Для нас это означает, что роль IAM, созданная в предыдущем разделе, остается активной даже после удаления файла tfstate.

Естественно, нам нужен первый вариант, поскольку он удалит роль и политику IAM, как мы и ожидали. Переключите разрушение, нажав кнопку плана «Очередь уничтожения», которая должна дать вам экран, похожий на тот, который вы видели раньше:

Да, это практически тот же экран, что и при первоначальном создании ресурсов. Точно так же запуск формального удаления этих ресурсов выполняется нажатием кнопки «Подтвердить и применить». Terraform применит эти удаления, и пуф! Ваша роль IAM больше не существует.

Заключение

Это в значительной степени завершает все, что я хотел показать с помощью Terraform Cloud. Опять же, вы можете продолжать использовать локальные команды с Terraform CLI с серверной частью S3. Это просто предлагает вам представление о том, как сделать это по-другому, не говоря уже о том, что мы почти не коснулись всего того, что Terraform Cloud может предложить через интерфейс командной строки. Эти функции включают…

  • Политика Sentinel
  • Автоматически применяется
  • Управление командами и группами
  • Параметры автоматического уведомления для членов команды
  • И более!

(Сейчас я чувствую себя продавцом Terraform Cloud / Enterprise, поэтому мне просто нужно выбросить его: нет, HashiCorp меня никоим образом не поддерживает. 😂)

Спасибо, что прочитали этот пост! В следующем мы начнем применять эти новые навыки Terraform, чтобы запачкать руки в SageMaker. Жду встречи с вами тогда.