Создать ВМ с доступом к секрету Yandex Lockbox
Через сервис метаданных можно передать в виртуальную машину идентификатор секрета Yandex Lockbox, чтобы затем изнутри ВМ получить значение этого секрета с помощью IAM-токена привязанного к ВМ сервисного аккаунта.
Секреты Yandex Lockbox, как и другие пользовательские данные, передаются в ключе user-data
. Метаданные в каталог user-data
можно передавать как при создании ВМ, так и при ее изменении.
Чтобы передать секрет Yandex Lockbox на виртуальную машину через метаданные:
-
Создайте секрет Yandex Lockbox.
-
Создайте сервисный аккаунт и назначьте ему роль
lockbox.payloadViewer
. -
Создайте файл
metadata.yaml
и поместите в него следующую конфигурацию метаданных создаваемой ВМ:metadata.yaml
#cloud-config datasource: Ec2: strict_id: false secrets: my_secret: <идентификатор_секрета> ssh_pwauth: no users: - name: <имя_пользователя> sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash ssh-authorized-keys: - "<публичный_SSH-ключ_пользователя>" packages: - jq - yq
Где:
-
my_secret
— идентификатор созданного секрета.Важно
Передавайте в каталог
user-data
только идентификаторы ваших секретов, а не их значения. -
name
— имя локального пользователя, который будет создан на ВМ. Например:admin
. -
ssh-authorized-keys
— публичный SSH-ключ создаваемого пользователя ВМ.
-
-
Создайте виртуальную машину:
Консоль управленияCLITerraformAPI-
В консоли управления
выберите каталог, в котором находятся секрет и сервисный аккаунт. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска выберите образ Ubuntu 24.04 LTS.
-
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Сетевые настройки в поле Подсеть укажите идентификатор подсети в зоне доступности создаваемой ВМ или выберите облачную сеть из списка.
-
В блоке Доступ выберите вариант SSH-ключ и укажите данные для доступа к ВМ:
- В поле Логин введите имя пользователя ВМ.
-
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
-
В блоке Общая информация задайте имя ВМ:
- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В блоке Дополнительно выберите созданный ранее сервисный аккаунт.
-
В блоке Метаданные:
- В поле Ключ укажите
user-data
. - В поле Значение вставьте содержимое созданного ранее файла конфигурации
metadata.yaml
.
- В поле Ключ укажите
-
Нажмите кнопку Создать ВМ.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Выполните команду:
yc compute instance create \ --name my-vm \ --hostname <имя_хоста> \ --zone <зона_доступности> \ --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2404-lts-oslogin \ --network-interface subnet-name=<имя_подсети>,ipv4-address=auto,nat-ip-version=ipv4 \ --metadata-from-file user-data="<путь_к_файлу_конфигурации>" \ --service-account-id <идентификатор_сервисного_аккаунта>
Где:
-
--name
— имя создаваемой ВМ. Например:my-vm
. -
--hostname
— имя хоста создаваемой ВМ. Необязательный параметр. Если параметр не задан, в качестве имени хоста будет использовано значение идентификатора ВМ. -
--zone
— зона доступности, в которой будет находиться создаваемая ВМ. -
--network-interface
— настройки сетевого интерфейса создаваемой ВМ:subnet-name
— имя подсети, расположенной в зоне доступности, указанной в параметре--zone
.
-
--metadata-from-file
— ключuser-data
, значением которого является путь к созданному ранее файлу с конфигурациейcloud-config
в формате YAML. Например:--metadata-from-file user-data="/home/user/metadata.yaml"
. -
service-account-id
— идентификатор созданного ранее сервисного аккаунта с назначенной рольюlockbox.payloadViewer
.
Результат
done (31s) id: epde2t9aovjm******** folder_id: b1gt6g8ht345******** created_at: "2025-02-04T18:18:58Z" name: my-vm zone_id: ru-central1-b platform_id: standard-v2 resources: memory: "2147483648" cores: "2" core_fraction: "100" status: RUNNING metadata_options: gce_http_endpoint: ENABLED aws_v1_http_endpoint: ENABLED gce_http_token: ENABLED aws_v1_http_token: DISABLED boot_disk: mode: READ_WRITE device_name: epd27gmf2vu2******** auto_delete: true disk_id: epd27gmf2vu2******** network_interfaces: - index: "0" mac_address: d0:0d:e1:75:2a:c7 subnet_id: e2lqsms4cdl3******** primary_v4_address: address: 192.168.15.25 one_to_one_nat: address: 51.***.***.93 ip_version: IPV4 serial_port_settings: ssh_authorization: OS_LOGIN gpu_settings: {} fqdn: my-vm.ru-central1.internal scheduling_policy: {} service_account_id: ajegtlf2q28a******** network_settings: type: STANDARD placement_policy: {} hardware_generation: legacy_features: pci_topology: PCI_TOPOLOGY_V1
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
# Создание загрузочного диска для ВМ resource "yandex_compute_disk" "boot-disk" { type = "network-ssd" zone = "<зона_доступности>" size = "20" image_id = "fd8bpal18cm4kprpjc2m" } # Создание ВМ resource "yandex_compute_instance" "my-vm" { name = "<имя_ВМ>" platform_id = "standard-v2" zone = "<зона_доступности>" service_account_id = "<идентификатор_сервисного_аккаунта>" resources { cores = "2" memory = "4" } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = "<идентификатор_подсети>" nat = true security_group_ids = ["<идентификатор_группы_безопасности>"] } metadata = { user-data = "${file("<путь_к_файлу_конфигурации>")}" } }
Где:
zone
— зона доступности, в которой будут находиться ВМ и диск.service_account_id
— идентификатор созданного ранее сервисного аккаунта с назначенной рольюlockbox.payloadViewer
.name
— имя создаваемой ВМ. Например:my-vm
.subnet_id
— идентификатор подсети, расположенной в зоне доступности, указанной в параметреzone
.security_group_ids
— идентификатор группы безопасности.user-data
— путь к созданному ранее файлу конфигурацииmetadata.yaml
.
Подробнее о создаваемых ресурсах см. в документации провайдера
. -
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Воспользуйтесь методом REST API create для ресурса Instance или вызовом gRPC API InstanceService/Create.
-
-
Подключитесь по SSH к созданной виртуальной машине и в терминале ВМ:
-
Получите IAM-токен сервисного аккаунта, привязанного к виртуальной машине, и сохраните полученный токен в переменную
YC_TOKEN
. Для этого выполните запрос к каталогуcomputeMetadata
сервиса метаданных:export YC_TOKEN=$(curl -sf -H Metadata-Flavor:Google 169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token | jq -r .access_token)
-
Получите идентификатор секрета, переданный в каталог
user-data
сервиса метаданных при создании ВМ.export my_secret_id=$(curl -sf -H Metadata-Flavor:Google 169.254.169.254/latest/user-data | yq .datasource.secrets.my_secret | tr -d \")
-
Получите и сохраните в переменную
my_secret_value
значение секрета, отправив запрос к API Yandex Lockbox:export my_secret_value=$(curl -sf -H "Authorization: Bearer $YC_TOKEN" "https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/${my_secret_id}/payload" | jq -r .entries[0].textValue) echo $my_secret_value
Результат:
admin@my-vm:~$ echo $my_secret_value my value
-
Другие примеры конфигурации для ключа user-data
см. в разделе Примеры.