Использование модулей Yandex Cloud в Terraform
- Подготовьте облако к работе
- Установите Terraform
- Получите данные для аутентификации
- Создайте файл конфигурации Terraform
- Настройте провайдер
- Подключите модуль управления виртуальными сетями
- Подключите модуль Managed Service for Kubernetes
- Проверьте и отформатируйте файлы конфигураций
- Создайте ресурсы
- Как удалить созданные ресурсы
- См. также
Yandex Cloud предоставляет
На этой странице рассказано, как подключить модули и использовать их для создания тестовой инфраструктуры: облачной сети с тремя подсетями Yandex Virtual Private Cloud и кластера Yandex Managed Service for Kubernetes.
Чтобы создать вашу первую инфраструктуру в Yandex Cloud с помощью Terraform:
- Подготовьте облако к работе.
- Установите Terraform.
- Получите данные для аутентификации.
- Создайте файл конфигурации Terraform.
- Настройте провайдер.
Если ресурсы больше вам не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры, разворачиваемой через Terraform в этом руководстве, входят:
- Плата за региональный мастер Managed Service for Kubernetes (см. тарифы Managed Service for Kubernetes).
- Плата за постоянно запущенные виртуальные машины в группе узлов Managed Service for Kubernetes (см. тарифы Yandex Compute Cloud).
- Плата за использование динамических публичных IP-адресов (см. тарифы Virtual Private Cloud).
Установите Terraform
Из зеркала
Внимание
Зеркало может быть недоступно.
Вы можете скачать дистрибутив Terraform для вашей платформы из зеркалаPATH
:
export PATH=$PATH:/path/to/terraform
С сайта HashiCorp
Используйте один из способов:
-
Скачайте дистрибутив Terraform
и установите его согласно инструкции . -
Установите Terraform с помощью пакетного менеджера Chocolatey
, используя команду:choco install terraform
Скачайте дистрибутив Terraform
Используйте один из способов:
-
Скачайте дистрибутив Terraform
и установите его согласно инструкции . -
Установите Terraform с помощью пакетного менеджера Homebrew
, используя команду:brew install terraform
Получите данные для аутентификации
Чтобы управлять инфраструктурой Yandex Cloud с помощью Terraform, используйте сервисный аккаунт. Это позволит гибко настраивать права доступа к ресурсам.
Также вы можете использовать Terraform от имени аккаунта на Яндексе или федеративного аккаунта, однако этот способ является менее безопасным. Подробности см. в конце раздела.
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его.
-
Если у вас еще нет сервисного аккаунта, создайте его:
Консоль управленияCLIAPI-
В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. -
На вкладке Сервисные аккаунты нажмите кнопку Создать сервисный аккаунт.
-
Введите имя сервисного аккаунта.
Требования к формату имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
Нажмите кнопку Создать.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Выполните команду для создания сервисного аккаунта:
yc iam service-account create --name <имя_сервисного_аккаунта>
Где
name
— имя сервисного аккаунта в формате:- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
Результат:
id: ajehr0to1g8b******** folder_id: b1gv87ssvu49******** created_at: "2022-09-14T09:03:11.665153755Z" name: sa-terraform
Чтобы создать сервисный аккаунт, воспользуйтесь вызовом gRPC API ServiceAccountService/Create или методом create для ресурса
ServiceAccount
REST API. -
-
Назначьте сервисному аккаунту роли, необходимые для управления ресурсами Yandex Cloud:
Сервисному аккаунту можно назначать роли на любые ресурсы в любом облаке, если эти ресурсы относятся к той же организации, что и сервисный аккаунт. Также сервисному аккаунту можно назначать роли на саму организацию.
Консоль управленияCLIAPIЧтобы назначить сервисному аккаунту роль на каталог:
- В консоли управления
выберите каталог. - Перейдите на вкладку Права доступа.
- Нажмите кнопку Настроить доступ.
- В открывшемся окне выберите раздел Сервисные аккаунты.
- Выберите сервисный аккаунт из списка или воспользуйтесь поиском.
- Нажмите кнопку
Добавить роль и выберите роль в каталоге. - Нажмите кнопку Сохранить.
-
Узнайте идентификатор сервисного аккаунта (столбец
ID
), которому нужно назначить роль:yc iam service-account list
Результат:
+----------------------+--------------+ | ID | NAME | +----------------------+--------------+ | aje6ij7qvdhb******** | sa-terraform | +----------------------+--------------+
-
Назначьте сервисному аккаунту роль на ресурс:
yc <service-name> <resource> add-access-binding <resource-name>|<resource-id> \ --role <role-id> \ --subject serviceAccount:<service-account-id>
Где:
<service-name>
— название сервиса, на чей ресурс назначается роль, напримерresource-manager
.<resource>
— категория ресурса, напримерcloud
— для назначения роли на все облако илиfolder
— для назначения роли на каталог.<resource-name>
— имя ресурса. Вы можете указать ресурс по имени или идентификатору (имя облака или каталога).<resource-id>
— идентификатор ресурса (идентификатор облака или каталога).<role-id>
— назначаемая роль, напримерresource-manager.clouds.owner
.<service-account-id>
— идентификатор сервисного аккаунта, которому назначается роль.
Пример:
yc resource-manager folder add-access-binding **********9n9hi2qu --role editor --subject serviceAccount:**********qhi2qu
Результат:
done (1s)
Чтобы назначить сервисному аккаунту роль на облако или каталог, воспользуйтесь методом REST API
updateAccessBindings
для ресурса Cloud или Folder:-
Выберите роль, которую хотите назначить сервисному аккаунту. Описание ролей можно найти в документации Yandex Identity and Access Management в справочнике ролей Yandex Cloud.
-
Узнайте ID каталога с сервисными аккаунтами.
-
Получите IAM-токен для авторизации в API Yandex Cloud.
-
Получите список сервисных аккаунтов в каталоге, чтобы узнать их идентификаторы:
export FOLDER_ID=b1gvmob95yys******** export IAM_TOKEN=CggaATEVAgA... curl \ --header "Authorization: Bearer ${IAM_TOKEN}" \ "https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts?folderId=${FOLDER_ID}"
Результат:
{ "serviceAccounts": [ { "id": "ajebqtreob2d********", "folderId": "b1gvmob95yys********", "createdAt": "2018-10-18T13:42:40Z", "name": "my-robot", "description": "my description" } ] }
-
Сформируйте тело запроса, например в файле
body.json
. В свойствеaction
укажитеADD
, в свойствеroleId
— нужную роль, напримерeditor
, а в свойствеsubject
— типserviceAccount
и идентификатор сервисного аккаунта:body.json:
{ "accessBindingDeltas": [{ "action": "ADD", "accessBinding": { "roleId": "editor", "subject": { "id": "ajebqtreob2d********", "type": "serviceAccount" } } }] }
-
Назначьте роль сервисному аккаунту. Например, на каталог с идентификатором
b1gvmob95yys********
:export FOLDER_ID=b1gvmob95yys******** export IAM_TOKEN=CggaAT******** curl \ --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --data '@body.json' \ "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/${FOLDER_ID}:updateAccessBindings"
- В консоли управления
-
Настройте профиль CLI для выполнения операций от имени сервисного аккаунта:
CLI-
Создайте авторизованный ключ для сервисного аккаунта и запишите его файл:
yc iam key create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --folder-name <имя_каталога_с_сервисным_аккаунтом> \ --output key.json
Где:
service-account-id
— идентификатор сервисного аккаунта.folder-name
— имя каталога, в котором создан сервисный аккаунт.output
— имя файла с авторизованным ключом.
Результат:
id: aje8nn871qo4******** service_account_id: ajehr0to1g8******** created_at: "2022-09-14T09:11:43.479156798Z" key_algorithm: RSA_2048
-
Создайте профиль CLI для выполнения операций от имени сервисного аккаунта. Укажите имя профиля:
yc config profile create <имя_профиля>
Результат:
Profile 'sa-terraform' created and activated
-
Задайте конфигурацию профиля:
yc config set service-account-key key.json yc config set cloud-id <идентификатор_облака> yc config set folder-id <идентификатор_каталога>
Где:
service-account-key
— файл с авторизованным ключом сервисного аккаунта.cloud-id
— идентификатор облака.folder-id
— идентификатор каталога.
-
-
Добавьте аутентификационные данные в переменные окружения:
BashPowerShellexport YC_TOKEN=$(yc iam create-token) export YC_CLOUD_ID=$(yc config get cloud-id) export YC_FOLDER_ID=$(yc config get folder-id)
Где:
YC_TOKEN
— IAM-токен.YC_CLOUD_ID
— идентификатор облака.YC_FOLDER_ID
— идентификатор каталога.
$Env:YC_TOKEN=$(yc iam create-token) $Env:YC_CLOUD_ID=$(yc config get cloud-id) $Env:YC_FOLDER_ID=$(yc config get folder-id)
Где:
YC_TOKEN
— IAM-токен.YC_CLOUD_ID
— идентификатор облака.YC_FOLDER_ID
— идентификатор каталога.
Примечание
Время жизни IAM-токена — не больше 12 часов, но рекомендуется запрашивать его чаще, например каждый час.
Важно
Управление ресурсами от имени аккаунта на Яндексе или федеративного аккаунта пользователя является менее безопасным, чем использование сервисного аккаунта.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
Если вы используете федеративный аккаунт, аутентифицируйтесь в CLI от имени федеративного пользователя.
Добавьте аутентификационные данные в переменные окружения:
export YC_TOKEN=$(yc iam create-token)
export YC_CLOUD_ID=$(yc config get cloud-id)
export YC_FOLDER_ID=$(yc config get folder-id)
Где:
YC_TOKEN
— IAM-токен.YC_CLOUD_ID
— идентификатор облака.YC_FOLDER_ID
— идентификатор каталога.
$Env:YC_TOKEN=$(yc iam create-token)
$Env:YC_CLOUD_ID=$(yc config get cloud-id)
$Env:YC_FOLDER_ID=$(yc config get folder-id)
Где:
YC_TOKEN
— IAM-токен.YC_CLOUD_ID
— идентификатор облака.YC_FOLDER_ID
— идентификатор каталога.
Примечание
Время жизни IAM-токена — не больше 12 часов, но рекомендуется запрашивать его чаще, например каждый час.
Создайте файл конфигурации Terraform
-
Создайте новую директорию с произвольным названием, например
cloud-terraform
. В ней будут храниться конфигурационные файлы и сохраненные состояния Terraform и инфраструктуры.Важно
Каждая конфигурация должна находиться в отдельной директории.
-
Создайте в новой директории конфигурационный файл с расширением
.tf
, напримерmain.tf
.
Настройте провайдер
Примечание
Настройки применимы для Terraform 0.13
и более поздних версий. Рекомендуется использовать последнюю стабильную версию Terraform.
-
Если раньше у вас был настроен провайдер из реестра HashiCorp, сохраните его настройки:
Linux/macOSWindowsmv ~/.terraformrc ~/.terraformrc.old
mv $env:APPDATA/terraform.rc $env:APPDATA/terraform.rc.old
-
Укажите источник, из которого будет устанавливаться провайдер.
Linux/macOSWindowsОткройте файл конфигурации Terraform CLI:
nano ~/.terraformrc
Примечание
Файл
.terraformrc
должен располагаться в корне домашней папки пользователя, например,/home/user/
или/User/user/
.Откройте файл конфигурации Terraform CLI
terraform.rc
в папке%APPDATA%
вашего пользователя.Чтобы узнать абсолютный путь к папке
%APPDATA%
, выполните командуecho %APPDATA%
для cmd или$env:APPDATA
для PowerShell.Добавьте в него следующий блок:
provider_installation { network_mirror { url = "https://terraform-mirror.yandexcloud.net/" include = ["registry.terraform.io/*/*"] } direct { exclude = ["registry.terraform.io/*/*"] } }
Подробнее о настройках зеркал см. в документации
. -
В начале конфигурационного файла
.tf
добавьте следующие блоки:terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">= 0.13" } provider "yandex" { zone = "<зона_доступности_по_умолчанию>" }
Где:
source
— глобальный адрес источника провайдера.required_version
— минимальная версия Terraform, с которой совместим провайдер.provider
— название провайдера.zone
— зона доступности, в которой по умолчанию будут создаваться все облачные ресурсы.
-
Выполните команду
terraform init
в папке с конфигурационным файлом.tf
. Эта команда инициализирует провайдеров, указанных в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера.
Если провайдер не установился, создайте обращение в поддержку
Если вы использовали файл .terraform.lock.hcl
, перед инициализацией выполните команду terraform providers lock
, указав адрес зеркала, откуда будет загружаться провайдер, и платформы, на которых будет использоваться конфигурация:
terraform providers lock -net-mirror=https://terraform-mirror.yandexcloud.net -platform=<название_платформы_1> -platform=<название_платформы_2> yandex-cloud/yandex
Где:
-net-mirror
— адрес зеркала, откуда будет загружаться провайдер.-platform
— платформы, на которых будет использоваться конфигурация. Возможные значения:windows_amd64
— 64-bit Windows.linux_amd64
— 64-bit Linux.darwin_arm64
— 64-bit macOS.
Если вы использовали модули Terraform, сначала выполните terraform init
, затем удалите lock-файл, а затем выполните команду terraform providers lock
.
Более подробную информацию о команде terraform providers lock
см. в документации Terraform
Подключите модуль управления виртуальными сетями
Добавьте в конфигурацию модуль terraform-yc-vpc
— с его помощью можно управлять сетевой инфраструктурой вашего облака: сетями, подсетями, шлюзами и другими объектами Virtual Private Cloud. Создайте тестовую сеть с тремя подсетями в разных зонах доступности:
module "yc-vpc" {
source = "github.com/terraform-yc-modules/terraform-yc-vpc.git"
network_name = "test-module-network"
network_description = "Test network created with module"
private_subnets = [{
name = "subnet-1"
zone = "ru-central1-a"
v4_cidr_blocks = ["10.10.0.0/24"]
},
{
name = "subnet-2"
zone = "ru-central1-b"
v4_cidr_blocks = ["10.11.0.0/24"]
},
{
name = "subnet-3"
zone = "ru-central1-d"
v4_cidr_blocks = ["10.12.0.0/24"]
}
]
}
Подключите модуль Managed Service for Kubernetes
Добавьте в конфигурацию модуль terraform-yc-vpc
и конфигурацию кластера Managed Service for Kubernetes с региональным мастером и двумя группами узлов:
module "kube" {
source = "github.com/terraform-yc-modules/terraform-yc-kubernetes.git"
network_id = "${module.yc-vpc.vpc_id}"
master_locations = [
for s in module.yc-vpc.private_subnets:
{
zone = s.zone,
subnet_id = s.subnet_id
}
]
master_maintenance_windows = [
{
day = "monday"
start_time = "23:00"
duration = "3h"
}
]
node_groups = {
"yc-k8s-ng-01" = {
description = "Kubernetes nodes group 01"
fixed_scale = {
size = 3
}
node_labels = {
role = "worker-01"
environment = "testing"
}
},
"yc-k8s-ng-02" = {
description = "Kubernetes nodes group 02"
auto_scale = {
min = 2
max = 4
initial = 2
}
node_labels = {
role = "worker-02"
environment = "dev"
}
max_expansion = 1
max_unavailable = 1
}
}
}
Проверьте и отформатируйте файлы конфигураций
-
Проверьте конфигурацию командой:
terraform validate
Если конфигурация является допустимой, появится сообщение:
Success! The configuration is valid.
-
Отформатируйте файлы конфигураций в текущем каталоге и подкаталогах:
terraform fmt
Результат:
main.tf variables.tf
Создайте ресурсы
-
После проверки конфигурации выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. Это проверочный этап: ресурсы не будут созданы. Если в конфигурации есть ошибки, Terraform на них укажет.
Внимание
Все созданные с помощью Terraform ресурсы тарифицируются. Внимательно проверьте план.
-
Чтобы создать ресурсы, выполните команду:
terraform apply
-
Подтвердите создание ресурсов: введите в терминал слово
yes
и нажмите Enter.Terraform создаст все требуемые ресурсы, а в терминале будут указаны IP-адреса созданных виртуальных машин. Проверить появление ресурсов и их настройки можно в консоли управления
.
Как удалить созданные ресурсы
Чтобы удалить ресурсы, созданные с помощью Terraform:
-
Выполните команду:
terraform destroy
Внимание
Terraform удалит все ресурсы, созданные в текущей конфигурации: кластеры, сети, подсети, виртуальные машины и т. д.
После выполнения команды в терминал будет выведен список удаляемых ресурсов.
-
Введите слово
yes
и нажмите Enter.