Введение в IaC и архитектурные основы Yandex Cloud

Курс закладывает фундамент управления облачной инфраструктурой через код. Вы освоите парадигму IaC, разберетесь в иерархии ресурсов Yandex Cloud и подготовите рабочее окружение для автоматизации.

1. Концепция Infrastructure as Code и декларативный подход к управлению ресурсами

Концепция Infrastructure as Code и декларативный подход к управлению ресурсами

Представьте пятничный вечер. Маркетинговый отдел внезапно запускает вирусную рекламную кампанию, и нагрузка на ваш веб-сервис вырастает в десять раз. Чтобы приложение не «упало», вам нужно срочно добавить в кластер еще пятнадцать виртуальных машин, настроить для них сетевые правила, подключить балансировщик нагрузки и выдать доступы к базе данных. Если вы управляете инфраструктурой вручную через веб-интерфейс облачного провайдера, эта задача займет несколько часов напряженной работы, сопровождаемой неизбежными человеческими ошибками. Вы кликаете по меню, копируете IP-адреса в блокнот, забываете открыть нужный порт на седьмом сервере, и система работает нестабильно. Этот подход в профессиональной среде получил ироничное название ClickOps.

ClickOps отлично подходит для изучения облака или запуска разового экспериментального проекта. Но когда инфраструктура становится основой бизнеса, ручное управление превращается в бомбу замедленного действия. Главная проблема ручного управления — отсутствие воспроизводимости. Если ваш дата-центр выйдет из строя, вы не сможете быстро воссоздать точную копию окружения в другом регионе, потому что единственная «документация» — это память инженера, который настраивал серверы полгода назад.

Именно здесь на сцену выходит концепция Infrastructure as Code (IaC) — инфраструктура как код.

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

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

  • Версионирование. Конфигурационные файлы хранятся в системах контроля версий (например, Git). Вы всегда знаете, кто, когда и зачем изменил настройки фаервола, и можете мгновенно откатиться к предыдущей рабочей версии.
  • Командная работа. Изменения в инфраструктуре проходят через процесс Code Review. Прежде чем новый сервер будет создан, другой инженер проверит код и убедится, что он соответствует стандартам безопасности.
  • Тестируемость. Инфраструктурный код можно проверять автоматическими линтерами на наличие уязвимостей еще до того, как ресурсы будут реально созданы в облаке.
  • !Сравнение подходов ClickOps и IaC

    Одним из самых опасных последствий ClickOps является феномен «серверов-снежинок» (Snowflake servers). Это серверы, конфигурация которых со временем стала абсолютно уникальной из-за множества ручных правок, обновлений и «быстрых фиксов», внесенных разными администраторами. Никто в компании не знает точного состояния такого сервера, и все боятся его перезагружать или обновлять. IaC уничтожает этот антипаттерн: если сервер начинает вести себя странно, его не чинят вручную. Его просто удаляют и разворачивают заново из эталонного кода за несколько секунд. Любое расхождение между реальным состоянием сервера и кодом называется дрейфом конфигурации (Configuration Drift), и современные инструменты IaC умеют автоматически его выявлять и устранять.

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

    Императивный подход отвечает на вопрос «КАК сделать?». Это набор последовательных команд, которые нужно выполнить для достижения цели. В мире инфраструктуры императивный подход чаще всего реализуется через Bash-скрипты или прямое использование интерфейса командной строки (CLI) облачного провайдера.

    Представьте, что вы пишете скрипт для создания виртуальной машины. Ваш код будет выглядеть как инструкция:

  • Отправь API-запрос на создание сети "my-network".
  • Дождись ответа об успешном создании.
  • Отправь запрос на создание подсети "my-subnet" внутри этой сети.
  • Отправь запрос на создание виртуальной машины с использованием этой подсети.
  • На первый взгляд, задача решена. Но что произойдет, если вы запустите этот скрипт во второй раз? Скрипт попытается снова создать сеть "my-network", облачный провайдер вернет ошибку «Ресурс с таким именем уже существует», и выполнение прервется. Чтобы сделать императивный скрипт надежным, вам придется добавить сложную логику проверок: «сначала проверь, существует ли сеть; если да — получи ее ID; если нет — создай и сохрани ID; затем проверь подсеть...». Скрипт из десяти строк быстро разрастается до сотен строк запутанного кода, который тяжело поддерживать.

    Императивный подход похож на то, как вы диктуете таксисту каждый поворот: «проедьте 100 метров, поверните направо, на светофоре налево». Если дорога перекрыта, ваша инструкция становится бесполезной, и вам нужно придумывать новый маршрут на ходу.

    Декларативный подход отвечает на вопрос «ЧТО я хочу получить в итоге?». Вы не описываете шаги, вы описываете желаемое конечное состояние системы. Инструмент автоматизации сам решает, как именно достичь этого состояния. Именно эта парадигма лежит в основе современных IaC-инструментов, таких как Terraform.

    В декларативном коде вы просто заявляете: «Мне нужна сеть "my-network", подсеть "my-subnet" и виртуальная машина, подключенная к этой подсети».

    Декларативный подход работает как GPS-навигатор. Вы просто вводите конечный адрес (желаемое состояние). Навигатор сам определяет ваше текущее положение, рассчитывает оптимальный маршрут и, если вы пропустили поворот, автоматически перестраивает путь, чтобы все равно доставить вас в нужную точку.

    Фундаментом декларативного подхода является математическая концепция идемпотентности. В информатике операция называется идемпотентной, если многократное ее применение дает тот же результат, что и однократное. Строго говоря, если — это функция применения инфраструктурного кода, то выполняется условие:

    где — начальное состояние инфраструктуры.

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

    Если кто-то вручную удалит один из этих трех серверов через веб-интерфейс (создав тот самый дрейф конфигурации), следующий запуск декларативного кода обнаружит недостачу и создаст только один недостающий сервер, вернув систему к желаемому состоянию.

    !Процесс работы декларативного IaC-инструмента

    Чтобы реализовать эту магию, декларативные инструменты опираются на механизм сравнения состояний. Процесс работы всегда состоит из трех фаз:

  • Оценка текущего состояния (Current State). Инструмент обращается к API облачного провайдера (например, Yandex Cloud) и собирает информацию о том, какие ресурсы реально существуют в данный момент.
  • Анализ желаемого состояния (Desired State). Инструмент читает ваши конфигурационные файлы.
  • Вычисление разницы (Diff/Plan). Инструмент строит граф зависимостей и вычисляет минимально необходимый набор операций (создание, изменение, удаление), чтобы превратить текущее состояние в желаемое.
  • Инженеру больше не нужно держать в голове, какие ресурсы уже созданы, а какие нет. Код становится единственным источником истины (Single Source of Truth). Если ресурса нет в коде, но он есть в облаке — инструмент предложит его удалить. Если ресурс описан в коде, но его характеристики в облаке отличаются (например, кто-то вручную добавил оперативную память), инструмент вернет характеристики к тем, что указаны в файле. Это жестко пресекает попытки ручного вмешательства и гарантирует, что инфраструктура всегда предсказуема.

    В мире IaC существует важное разделение зон ответственности. Инфраструктурные задачи делятся на два больших класса: Provisioning (предоставление ресурсов) и Configuration Management (управление конфигурацией).

    Provisioning — это создание фундамента. Выделение серверов, настройка виртуальных сетей, создание баз данных как управляемых сервисов, распределение IP-адресов. Это работа с внешним контуром ресурсов. Безоговорочным лидером для этих задач является Terraform. Он строго декларативен и идеально работает с API облачных провайдеров.

    Configuration Management — это настройка того, что находится внутри уже созданных серверов. Установка пакетов (Nginx, Docker), копирование конфигурационных файлов ОС, создание пользователей Linux, запуск системных служб. Для этих задач чаще всего используется Ansible. Он работает поверх уже существующей инфраструктуры (например, той, которую только что создал Terraform). Ansible также стремится к декларативности и идемпотентности, но его архитектура допускает более гибкий, гибридный подход, позволяя при необходимости выполнять последовательные команды внутри операционной системы.

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

    Переход к подходу «Инфраструктура как код» требует изменения инженерного мышления. Приходится отказаться от соблазна «быстро поправить руками» в пользу написания кода, его коммита в репозиторий и запуска автоматики. На первых порах это кажется более медленным путем. Однако инвестиции в декларативный подход окупаются многократно, когда инфраструктура начинает расти. Код, написанный один раз, позволяет разворачивать идентичные среды для разработки, тестирования и продакшена за считанные минуты, гарантируя, что поведение приложения не изменится из-за забытой галочки в настройках сети.

    2. Архитектура Yandex Cloud: иерархия ресурсов, зоны доступности и управление доступом (IAM)

    Один из самых частых сценариев аварий в молодых IT-командах выглядит так: разработчик получает полный доступ к облаку, чтобы развернуть тестовый стенд, и случайно удаляет базу данных с реальными клиентами. Причина кроется не в квалификации инженера, а в отсутствии архитектурных границ. Облако — это не просто бесконечный пул серверов, к которому выдается логин и пароль. Это строгая система координат, состоящая из логических контейнеров, физических дата-центров и гранулярных прав доступа. Прежде чем писать код для развертывания инфраструктуры, необходимо понять, в какие рамки этот код будет помещен.

    Иерархия ресурсов: логические границы инфраструктуры

    В Yandex Cloud все сущности организованы в строгую древовидную структуру. Это решает сразу две задачи: изолирует проекты друг от друга и позволяет гибко списывать деньги с разных счетов. Иерархия состоит из четырех уровней, каждый из которых вложен в предыдущий.

    Организация (Organization) — корневой уровень. Это юридическая и административная граница компании. К организации привязывается корпоративный домен (например, @company.com), здесь настраивается единая система входа (SSO) и подключаются платежные аккаунты. Если компания работает над несколькими независимыми продуктами, все они всё равно будут находиться внутри одной организации.

    Облако (Cloud) — уровень группировки крупных сущностей. Чаще всего облака создают для разделения крупных департаментов или принципиально разных сред. Например, можно создать облако cloud-ecom для интернет-магазина и cloud-analytics для хранилища данных. К каждому облаку привязывается свой платежный аккаунт, что позволяет бухгалтерии четко видеть, сколько денег тратит каждый департамент.

    Каталог (Folder) — самый важный уровень для DevOps-инженера. Каталог является базовым рабочим пространством. Именно внутри каталогов создаются виртуальные машины, сети, кластеры баз данных.

    Каталог выполняет роль «песочницы» (blast radius) — зоны поражения при ошибке. Золотой стандарт архитектуры требует создания отдельных каталогов для разных стадий жизненного цикла продукта:

  • web-prod — боевая среда, куда имеют доступ только CI/CD системы.
  • web-stage — предрелизная среда для тестирования.
  • web-dev — среда для экспериментов разработчиков.
  • Если Terraform-скрипт, запущенный для каталога web-dev, содержит фатальную ошибку, он уничтожит ресурсы только внутри этого каталога. Боевая база данных в web-prod останется в безопасности, так как находится за логической стеной.

    !Иерархия ресурсов Yandex Cloud

    Ресурс (Resource) — конечный элемент инфраструктуры. Это конкретная виртуальная машина, диск, IP-адрес, балансировщик нагрузки или база данных. Каждый ресурс всегда принадлежит строго одному каталогу и не может существовать вне его.

    Физическая топология: Регионы и зоны доступности

    Логическая иерархия описывает, как ресурсы сгруппированы в панели управления. Однако физически эти ресурсы работают на реальном железе. Понимание физической топологии критично для построения систем, которые не падают при отключении электричества или обрыве оптоволоконного кабеля.

    Базовой географической единицей является Регион. В Yandex Cloud основным регионом является ru-central1 (Центральная Россия). Регион — это не одно здание, а кластер из нескольких независимых дата-центров.

    Эти дата-центры называются Зонами доступности (Availability Zones, AZ). На данный момент в Yandex Cloud активно используются зоны ru-central1-a, ru-central1-b и ru-central1-d.

    Зоны доступности спроектированы так, чтобы быть максимально независимыми:

  • Они находятся в разных географических локациях (разные города или районы).
  • Они подключены к разным подстанциям электропитания.
  • Они имеют независимые каналы связи.
  • При этом зоны соединены между собой собственным темным оптоволокном с колоссальной пропускной способностью. Задержка (ping) между зонами доступности обычно составляет менее 1-2 миллисекунд. Это позволяет базам данных синхронно реплицировать информацию из одной зоны в другую без деградации производительности для конечного пользователя.

    Зональные и региональные ресурсы

    При проектировании инфраструктуры через код важно понимать разницу между ресурсами, привязанными к зоне, и ресурсами, привязанными к региону.

    Зональные ресурсы физически существуют в конкретном дата-центре. Если вы создаете виртуальную машину или жесткий диск, вы обязаны указать зону, например, ru-central1-a. Если этот дата-центр полностью обесточится, виртуальная машина станет недоступна. Подсети (Subnets) также являются зональными ресурсами: пул IP-адресов жестко привязан к конкретной зоне.

    Региональные ресурсы распределены по всему региону и сохраняют работоспособность при падении одной из зон. Классический пример — виртуальная сеть (VPC, Virtual Private Cloud). Сеть существует во всем регионе сразу, объединяя подсети из разных зон доступности.

    !Отказоустойчивая архитектура в разных зонах доступности

    Чтобы построить отказоустойчивую систему (High Availability), архитекторы используют комбинацию зональных и региональных ресурсов. Например, создаются три виртуальные машины с одинаковым приложением, но размещаются они в трех разных зонах (a, b и d). Перед ними ставится региональный балансировщик нагрузки. Если экскаватор перерубит кабель питания дата-центра зоны a, балансировщик мгновенно перестанет отправлять туда трафик и переведет всех клиентов на серверы в зонах b и d. Система продолжит работать.

    Управление доступом (IAM): Субъекты, роли и наследование

    Identity and Access Management (IAM) — это подсистема, которая отвечает на три вопроса: Кто пытается выполнить действие? Какое это действие? Где именно оно выполняется?

    В мире ручного управления (ClickOps) доступы часто выдаются конкретным людям. В мире Infrastructure as Code главной действующей силой становится автоматика, что требует иных подходов к безопасности.

    Субъекты (Кто?)

    Субъект — это сущность, которая обращается к API облака с запросом (например, «создай сервер»). В Yandex Cloud есть два основных типа субъектов, важных для инфраструктурной работы:

  • Пользователь (User) — живой человек с Яндекс ID или корпоративным аккаунтом. Пользователи нужны для того, чтобы заходить в веб-консоль, просматривать графики мониторинга или управлять биллингом.
  • Сервисный аккаунт (Service Account) — специальный тип аккаунта, предназначенный для программ и скриптов. У сервисного аккаунта нет пароля в привычном понимании, он не может зайти в веб-консоль. Он аутентифицируется с помощью криптографических ключей.
  • Использование сервисных аккаунтов — фундамент IaC. Terraform, работающий на вашем ноутбуке или в CI/CD пайплайне, всегда должен использовать сервисный аккаунт. Запрещено привязывать развертывание инфраструктуры к личному аккаунту инженера. Если инженер уволится и его учетную запись заблокируют, все автоматические процессы развертывания мгновенно сломаются.

    Роли (Какое действие?)

    Права в облаке не выдаются поштучно (нельзя сказать «разрешаю нажимать вот эту кнопку»). Права группируются в Роли.

    Примитивные роли действуют на все типы ресурсов без разбора:

  • viewer — право только на чтение. Можно смотреть настройки серверов, сетей, баз данных, но ничего нельзя изменить.
  • editor — право на создание, изменение и удаление любых ресурсов.
  • admin — права editor плюс возможность назначать права другим субъектам.
  • Сервисные роли обеспечивают гранулярный доступ согласно принципу наименьших привилегий (Principle of Least Privilege). Если скрипту нужно только загружать файлы в объектное хранилище (S3), ему не нужна роль editor на весь каталог, которая позволит удалить сервер. Ему назначается узкая сервисная роль storage.uploader. Если Terraform должен управлять только сетями, ему выдается роль vpc.admin, и он физически не сможет создать или удалить виртуальную машину.

    Область действия и наследование (Где?)

    Выдача прав — это процесс создания привязки (Binding). Привязка всегда состоит из трех элементов: Субъект + Роль + Ресурс.

    Важнейшая концепция IAM — наследование прав сверху вниз. Права, выданные на более высоком уровне иерархии, автоматически распространяются на все вложенные элементы.

    Если выдать пользователю роль viewer на уровне Облака cloud-ecom, он автоматически получит права на чтение во всех каталогах внутри этого облака (web-prod, web-dev и т.д.) и для всех ресурсов внутри этих каталогов.

    Особенность наследования в Yandex Cloud (как и в большинстве публичных облаков) заключается в том, что права можно только расширять вниз по дереву, но нельзя сужать. Запрещающих правил (Deny) в базовой модели IAM не предусмотрено. Если человек получил роль editor на уровне Облака, вы не сможете запретить ему редактировать конкретный каталог web-prod. Чтобы решить эту задачу, права выдаются иначе: на уровне Облака человеку не дают никаких прав (или дают viewer), а роль editor назначают точечно, только на целевой каталог web-dev.

    Синтез архитектуры для IaC

    Понимание иерархии, топологии и IAM складывается в единый каркас перед началом работы с Terraform.

    Когда DevOps-инженер приступает к автоматизации нового проекта, он не начинает писать код для виртуальных машин. Сначала формируется архитектурный фундамент. В нужной Организации создается Облако. Внутри Облака создается логический изолированный Каталог. Для работы автоматики создается Сервисный аккаунт, которому назначается роль editor строго на этот новый Каталог.

    Только после этого пишется декларативный код, который, используя ключи сервисного аккаунта, обращается к API облака, создает региональную сеть и разворачивает виртуальные машины, распределяя их по разным физическим зонам доступности для защиты от аварий в дата-центрах. Этот каркас гарантирует, что инфраструктура будет отказоустойчивой, безопасной и изолированной от соседей.

    3. Инструментарий инженера: настройка Yandex Cloud CLI и аутентификация для автоматизации

    Инструментарий инженера: настройка Yandex Cloud CLI и аутентификация для автоматизации

    Графический интерфейс облачной консоли спроектирован для людей: он прощает ошибки, предлагает выпадающие списки и скрывает сложность за красивыми кнопками. Но когда дело доходит до автоматизации, веб-интерфейс становится препятствием. Скрипт не может «кликнуть» по кнопке, а Terraform не умеет читать всплывающие подсказки. Любой инструмент концепции Infrastructure as Code общается с облаком исключительно через программные интерфейсы — API (Application Programming Interface). Чтобы начать управлять инфраструктурой как кодом, рабочую станцию инженера необходимо превратить в авторизованный пульт управления, который облако будет распознавать и которому будет доверять.

    Первым шагом к этому становится установка и настройка консольного клиента — Yandex Cloud CLI (Command Line Interface).

    CLI предоставляет текстовый интерфейс к тем же самым API-методам, которые использует веб-консоль. Выполняя команду в терминале, вы инициируете формирование HTTP-запроса, который отправляется на серверы Yandex Cloud, обрабатывается там, а результат возвращается обратно в виде структурированного текста.

    !Схема взаимодействия CLI и API Yandex Cloud

    Главная проблема, которую необходимо решить при настройке любого инструмента автоматизации — это проблема идентификации. Когда API-сервер получает команду на удаление базы данных, он должен абсолютно точно знать, от кого исходит этот запрос, и имеет ли этот субъект соответствующие права в IAM.

    В Yandex Cloud существует два принципиально разных потока аутентификации, которые инженер должен четко разделять: интерактивная аутентификация для человека и статичная аутентификация для машин.

    Интерактивная аутентификация: OAuth-токены

    Когда вы как разработчик или DevOps-инженер садитесь за свой ноутбук и хотите выполнить разовую команду (например, посмотреть список виртуальных машин), вы действуете от лица своего пользовательского аккаунта (Yandex ID или федеративного аккаунта компании).

    Для привязки CLI к вашему личному аккаунту используется команда инициализации:

    Эта команда запускает интерактивный процесс. CLI понимает, что вы человек, и генерирует специальную ссылку. При переходе по ней открывается браузер, где вы вводите свой логин и пароль от Яндекса. После успешного входа Яндекс выдает вам OAuth-токен — длинную строку символов, которая служит временным пропуском. Вы копируете этот токен, вставляете его в терминал, и CLI сохраняет его в своих локальных конфигурационных файлах (обычно в скрытой директории ~/.config/yandex-cloud/).

    С этого момента при каждой команде, например yc compute instance list, CLI незаметно прикрепляет этот OAuth-токен к HTTP-запросу. API облака видит токен, проверяет его валидность, определяет, что он принадлежит вашему Yandex ID, и применяет ваши персональные права доступа.

    Особенности OAuth-токена:

  • Привязка к человеку: Токен ассоциирован с конкретным живым пользователем.
  • Интерактивность получения: Требует наличия веб-браузера и ручного ввода учетных данных.
  • Срок жизни: Токен действителен в течение определенного времени (обычно до года), после чего его нужно обновлять (получать заново).
  • Именно из-за интерактивности получения и привязки к конкретному человеку OAuth-токены категорически не подходят для систем автоматизации. Если вы настроите CI/CD пайплайн, используя свой личный токен, пайплайн сломается, как только срок действия токена истечет. Более того, если пайплайн удалит важный ресурс, в логах аудита (Audit Trails) будет записано, что это сделали лично вы, а не автоматика.

    Машинная аутентификация: Авторизованные ключи

    Для Terraform, Ansible, скриптов и CI/CD систем используется совершенно другой механизм. Вспоминаем, что для неперсонифицированных операций создаются сервисные аккаунты. Но сервисный аккаунт не может открыть браузер и ввести пароль. Ему нужен криптографический способ доказать свою личность.

    Этим способом являются авторизованные ключи (Authorized Keys).

    Авторизованный ключ — это пара из открытого и закрытого ключей (public/private key pair), сгенерированная на стороне Yandex Cloud. Открытая часть остается в облаке и жестко привязывается к конкретному сервисному аккаунту. Закрытая часть скачивается инженером в виде JSON-файла.

    Создание ключа через CLI выглядит так:

    В результате на вашем диске появляется файл key.json, структура которого выглядит примерно следующим образом:

    Этот файл — абсолютный эквивалент логина и пароля с бессрочным действием. Любой процесс, обладающий этим файлом, может формировать запросы к API Yandex Cloud от имени указанного service_account_id. При отправке запроса утилита локально подписывает его с помощью private_key, а облако проверяет подпись с помощью сохраненного у себя открытого ключа.

    > Авторизованные ключи не имеют встроенного срока годности (expiration date). Они действуют до тех пор, пока администратор явно не удалит их в консоли облака. Это делает их идеальными для Terraform, но одновременно накладывает колоссальную ответственность за их хранение.

    Утечка ключей: главная угроза автоматизации

    Самая частая и разрушительная ошибка начинающих инженеров — случайный коммит (сохранение) файла key.json в публичный репозиторий, например, на GitHub.

    Злоумышленники непрерывно сканируют публичные репозитории с помощью ботов. Если бот находит строку -----BEGIN PRIVATE KEY----- рядом с service_account_id Яндекса, ключ моментально извлекается. Если сервисный аккаунт имел широкие права (например, роль editor на каталог), через несколько минут в вашем облаке будут развернуты десятки самых дорогих виртуальных машин с GPU для майнинга криптовалюты. Счет за эти ресурсы придет владельцу облака.

    Чтобы этого избежать, файл с ключом всегда должен добавляться в файл .gitignore вашего проекта до того, как вы сделаете первый коммит.

    Управление контекстом: Профили и Переменные окружения

    Когда инструмент (CLI или Terraform) делает запрос, ему нужно знать не только кто спрашивает (аутентификация), но и где нужно выполнить действие. В Yandex Cloud базовой единицей изоляции является Каталог (Folder).

    Если вы пишете команду yc compute instance create --name web-server, системе нужно понять, в каком именно каталоге создавать сервер. Указывать идентификатор каталога в каждой команде неудобно. Для решения этой проблемы используются профили CLI и переменные окружения.

    Профили CLI (Stateful подход)

    CLI поддерживает концепцию профилей. Профиль — это именованный набор настроек по умолчанию (токен, идентификатор облака, идентификатор каталога, зона доступности по умолчанию).

    Вы можете создать несколько профилей для разных сред:

    Переключаясь между профилями (yc config profile activate prod-profile), вы меняете глобальный контекст вашего терминала. Это удобно для ручной работы, но таит скрытую угрозу: профиль сохраняет состояние (stateful). Если вы забыли, какой профиль сейчас активен, вы можете случайно запустить деструктивную команду, думая, что находитесь в dev, тогда как активен prod.

    Переменные окружения (Stateless подход)

    Для автоматизации и CI/CD систем подход с профилями не применяется. Вместо этого используются переменные окружения (Environment Variables). Это переменные, которые живут только в памяти текущей сессии терминала.

    CLI Yandex Cloud, как и провайдер Terraform, спроектированы так, что переменные окружения всегда имеют наивысший приоритет над настройками профиля.

    Ключевые переменные для работы:

  • YC_TOKEN — для передачи OAuth-токена.
  • YC_SERVICE_ACCOUNT_KEY_FILE — путь к JSON-файлу с авторизованным ключом (используется вместо токена).
  • YC_CLOUD_ID — идентификатор облака.
  • YC_FOLDER_ID — идентификатор каталога.
  • Если вы экспортируете эти переменные в терминале:

    Все последующие команды CLI в этом окне терминала будут игнорировать активный профиль и выполняться от лица сервисного аккаунта в указанном каталоге. Как только вы закроете терминал, переменные исчезнут. Это обеспечивает чистый, предсказуемый контекст (stateless), что является золотым стандартом для запуска Terraform.

    Связка CLI и Terraform

    Настройка Yandex Cloud CLI — это не просто изучение отдельной утилиты. Это подготовка фундамента для Terraform.

    Официальный провайдер Terraform для Yandex Cloud использует ту же самую логику аутентификации и контекста, что и CLI. Когда вы запустите команду terraform apply, Terraform заглянет в переменные окружения вашей системы. Если он найдет там YC_SERVICE_ACCOUNT_KEY_FILE и YC_FOLDER_ID, он автоматически подхватит их и сможет развернуть инфраструктуру, не требуя хардкода учетных данных в конфигурационных .tf файлах.

    Таким образом, научившись аутентифицировать консольную утилиту yc через сервисный аккаунт и управлять контекстом через переменные окружения, вы полностью решили задачу безопасного подключения любых IaC-инструментов к вашему облаку. Ваш локальный терминал теперь готов к тому, чтобы транслировать декларативный код в реальные вычислительные ресурсы.