Сценарий запуска в метаданных не запущен (Python, Google Compute Engine, Cloud Storage Trigger) - PullRequest
2 голосов
/ 30 мая 2020

У меня есть приложение, работающее на Google App Engine, и ИИ, работающее на Google Compute Engine. Я запускаю экземпляр виртуальной машины для запуска при изменении в корзине Google Cloud Storage, и у меня есть сценарий запуска, который я пытаюсь сохранить в метаданных экземпляра GCE. Мои облачные функции выглядят так:

import os
from googleapiclient.discovery import build


def start(event, context):
    file = event
    print(file["id"])

    string = file["id"]

    new_string = string.split('/')
    user_id = new_string[1]
    payment_id = new_string[2]
    name = new_string[3]

    print(name)

    if name == "uploadcomplete.txt":
        startup_script = """ #! /bin/bash
                sudo su username
                cd directory/directory
                python analysis.py -- gs://location/{userId}/{paymentId}
                """.format(userId=user_id, paymentId=payment_id)
        # initialize compute api
        service = build('compute', 'v1', cache_discovery=False)
        print('VM Instance starting')
        project = 'zephyrd'
        zone = 'us-east1-c'
        instance = 'zephyr-a'

        # get metadata fingerprint in order to set new metadata
        metadata = service.instances().get(project=project, zone=zone, instance=instance)
        metares = metadata.execute()
        fingerprint = metares["metadata"]["fingerprint"]

        # set new metadata
        bodydata = {"fingerprint": fingerprint,
                    "items": [{"key": "startup-script", "value": startup_script}]}
        meta = service.instances().setMetadata(project=project, zone=zone, instance=instance,
                                               body=bodydata).execute()
        print(meta)

        # confirm new metdata
        instanceget = service.instances().get(project=project, zone=zone, instance=instance).execute()
        print("'New Metadata:", instanceget['metadata'])
        print(instanceget)

        # start VM
        request = service.instances().start(project=project, zone=zone, instance=instance)
        response = request.execute()
        print('VM Instance started')
        print(response)

ВМ запускается, но скрипт запуска не запускается. Сценарий был упрощен для целей вопроса, но это всего лишь основная c команда, которую я пытаюсь запустить. Я бы добавил сценарий непосредственно к метаданным в консоли, но я использую значения из триггера облачной функции для выполнения команд в виртуальной машине. Что мне не хватает?

Я пытался установить метаданные двумя способами:

"items": [{"key": "startup-script", "value": startup_script}]

а также:

"items": [{"startup-script" : startup_script}]

Ни то, ни другое не работает. Команды выполняются прекрасно, если я вручную набираю их в оболочке.

1 Ответ

2 голосов
/ 02 июня 2020

Посмотрите в свои журналы, чтобы определить, почему он не выполняется.

https://cloud.google.com/compute/docs/startupscript#viewing_startup_script_logs

Вероятно, проблема в том, что вы пытаетесь выполнить сценарий python вместо сценария bash.

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

#! /bin/bash

# ...
python3 paht/to/python_script.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...