Работа с Яндекс.Облаком изнутри виртуальной машины

В этом разделе описано как работать с Яндекс.Облаком изнутри виртуальной машины через API или CLI.

Для автоматизации работы с Яндекс.Облаком изнутри виртуальной машины рекомендуется использовать сервисные аккаунты. Это безопаснее — вам не надо сохранять свой OAuth-токен на виртуальной машине и вы можете ограничить права доступа для сервисного аккаунта.

Для сервисного аккаунта сделана упрощенная аутентификация через API и CLI изнутри виртуальной машины. Чтобы пройти аутентификацию:

  1. Если у вас еще нет сервисного аккаунта, создайте его и настройте права доступа для него.
  2. Привяжите сервисный аккаунт к виртуальной машине.
  3. Аутентифицируйтесь изнутри виртуальной машины.

Привяжите сервисный аккаунт к существующей или к создаваемой виртуальной машине. Привязать можно только один сервисный аккаунт.

Чтобы привязать сервисный аккаунт к виртуальной машине, необходимо иметь разрешение на использование этого аккаунта. Это разрешение входит в роли iam.serviceAccounts.user, editor и выше.

Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

Обновите параметры виртуальной машины, указав сервисный аккаунт с помощью опции --service-account-name или --service-account-id:

yc compute instance update my-instance --service-account-name test

Воспользуйтесь методом update для ресурса Instance. В свойстве serviceAccountId укажите идентификатор сервисного аккаунта.

В консоли можно привязать сервисный аккаунт из того же каталога, где создается виртуальная машина. Если сервисный аккаунт лежит в другом каталоге, воспользуйтесь CLI или API.

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

image

Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

Создайте виртуальную машину, указав сервисный аккаунт с помощью опции --service-account-name или --service-account-id:

yc compute instance create \
  --name my-instance \
  --network-interface subnet-name=default,nat-ip-version=ipv4 \
  --ssh-key ~/.ssh/id_rsa.pub \
  --service-account-name my-robot

Воспользуйтесь методом create для ресурса Instance. В свойстве serviceAccountId укажите идентификатор сервисного аккаунта.

Аутентификация изнутри виртуальной машины

Чтобы аутентифицироваться изнутри виртуальной машины от имени привязанного сервисного аккаунта:

  1. Подключитесь к виртуальной машине по SSH или по RDP.

  2. Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

  3. Создайте новый профиль:

    yc config profile create my-robot-profile
    

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

    Вы также можете получить IAM-токен, например, чтобы аутентифицироваться в API:

    yc iam create-token
    

    Время жизни IAM-токена в этом случае будет меньше чем 12 часов. Запрашивайте IAM-токен чаще, например каждый час или при каждой операции. Чтобы узнать оставшееся время жизни токена, воспользуйтесь инструкцией для API.

  1. Подключитесь к виртуальной машине по SSH или по RDP.

  2. Получите IAM-токен из метаданных в одном из форматов:

    • Google Compute Engine:

      $ curl -H Metadata-Flavor:Google http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
      
      {"access_token":"CggVAgAAA...","expires_in":39944,"token_type":"Bearer"}
      

      IAM-токен будет указан в ответе в поле access_token. Оставшееся время жизни IAM-токена указано в поле expires_in.

    • Amazon EC2:

      $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/default/
      
      {
        "Code" : "Success",
        "Expiration" : "2019-06-28T04:43:32+00:00",
        "Token" : "CggVAgAAA..."
      }
      

      IAM-токен будет указан в ответе в поле Token. Время жизни IAM-токена указано в поле Expiration.

  3. Полученный IAM-токен указывайте при обращении к ресурсам Яндекс.Облака через API. Передайте IAM-токен в заголовке Authorization в следующем формате:

    Authorization: Bearer <IAM-TOKEN>
    

Учитывайте время жизни IAM-токена или запрашивайте токен чаще, например каждый час или при каждой операции.