Запуск экземпляра Google Compute с помощью Python

Я пытаюсь запустить экземпляр Google Compute с клиентской библиотекой Google API Python. Это сделано для того, чтобы дешевый экземпляр (работающий на одном ядре) мог периодически запускать и останавливать более дорогой экземпляр (с большим количеством ядер), чтобы снизить затраты.

Я успешно установил различные компоненты и запустил пример скрипта Google create_instance.py (который создает экземпляры, запускает сценарий запуска и удаляет экземпляр). Изучая ссылку PyDoc для Compute Engine API и перекрестно ссылаясь на то, как другие функции instance () работают в примере create_instance.py, я ожидал, что команда запуска экземпляра будет следующей:

python compute.instances().start(project=*, zone=*, instance=*).execute()

Приведенная выше команда дает мне ошибку «Ожидается выражение после '('. At line: 1 char: 34» - это первая скобка.

а. Что я сделал не так?

б. Является ли использование Google API с Python хорошим способом программно запускать экземпляры из других экземпляров?


person fifthace    schedule 20.07.2017    source источник


Ответы (3)


  1. Обычно я ожидал, что вам нужно будет импортировать библиотеку api с помощью оператора import или, возможно, флага времени выполнения (-m somemodule?). Запуск строки Python непосредственно из командной строки обычно не лучший способ продолжить. Вместо этого Google предоставляет gcloud инструмент командной строки.

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

  3. Функция compute.instances().start() принимает обязательные параметры для запуска конкретного остановленного экземпляра. Это означает:

    • the VM instance has been created previously
    • экземпляр ВМ находится в остановленном состоянии
    • перезапускаемый экземпляр идентифицируется конкретным идентификатором проекта, (географической) зоной и именем экземпляра, которое предоставляется при вызове start

Из Google Cloud Python Документация

start (project = , zone =, instance = *) Запускает экземпляр, который был остановлен с помощью метода instance (). stop. Дополнительные сведения см. В разделе «Перезапуск экземпляра».

Аргументы: проект: строка, идентификатор проекта для этого запроса. (обязательно)
zone: string, Имя зоны для данного запроса. (обязательно)
instance: строка, Имя ресурса экземпляра для запуска. (обязательный)

...

person Paul    schedule 20.07.2017
comment
Ты прав. Gcloud намного проще. Что касается вашего второго комментария, вся виртуальная машина существует, она находится в остановленном состоянии, и я заполнил * в команде запуска (я просто не делал их здесь общедоступными) ... - person fifthace; 20.07.2017
comment
@fifthace Я не помню, что импортировать или вызывать для входа в Google Compute API из python, но ожидаю, что он работает аналогично предыдущему опыту с nodejs. См. Мое изменение к №2 - person Paul; 20.07.2017

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

from googleapiclient import discovery

service = discovery.build('compute', 'v1')
print('VM Instance starting')

# Project ID for this request.
project = 'project_name' 

# The name of the zone for this request.
zone = 'zone_value'  

# Name of the instance resource to start.
instance = 'instance_name'

request = service.instances().start(project=project, zone=zone, instance=instance)
response = request.execute()

print('VM Instance started')

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

Здесь важно отметить, что это может запустить экземпляр только в том случае, если он находится в остановленном состоянии, что полностью соответствует моим требованиям.

person user570778    schedule 21.04.2020
comment
Можете ли вы предоставить ссылку или справочник, где у вас есть этот код API? - person zd5151; 26.09.2020
comment
Показанный код вызывается из App Engine? Как это будет работать в облачной функции Google? - person zd5151; 27.09.2020
comment
Я использую этот код в облачной функции для запуска экземпляра Compute Engine, а не приложения. К сожалению, у меня нет ссылки для справки по API, но я могу сказать вам, что это работает для меня. - person user570778; 28.09.2020

Я использовал код, предоставленный @ user570778, и у меня он работал нормально.

`из обнаружения импорта googleapiclient

service = discovery.build ('compute', 'v1') print ('Запуск экземпляра виртуальной машины')

Идентификатор проекта для этого запроса.

проект = 'имя_проекта'

Название зоны для этого запроса.

зона = 'zone_value'

Имя запускаемого ресурса экземпляра.

instance = 'имя_экземпляра'

request = service.instances (). start (проект = проект, зона = зона, экземпляр = экземпляр) response = request.execute ()

print ('Запуск экземпляра виртуальной машины') `Мне интересно, можно ли запустить несколько экземпляров в одной и той же функции?

person Joaze Oliveira    schedule 24.11.2020
comment
Пожалуйста, используйте форматирование кода для форматирования кода, потому что оно упрощает чтение кода. - person GalaxyCat105; 25.11.2020