我有一个在 Google App Engine 上运行的应用程序,以及一个在 Google Compute Engine 上运行的 AI。我正在触发虚拟机实例在谷歌云存储桶中的变化时启动,并有一个启动脚本,我试图将其存储在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)
虚拟机启动了,但启动脚本没有运行。为了解决这个问题,脚本已经被简化,但这只是我试图运行的一个基本命令。我想直接将脚本添加到控制台中的元数据中,但我使用云函数触发器中的值来运行虚拟机中的命令。我缺少了什么?
我已经尝试用两种方式设置元数据。
"items": [{"key": "startup-script", "value": startup_script}]
as well as:
"items": [{"startup-script" : startup_script}]
两种方式都不行 如果我在shell中手动键入命令,命令运行得很好。
查看您的日志,以确定为什么它不执行。
https:/cloud.google.comcomputedocsstartupscript#viewing_startup_script_logs。
可能你的问题是你试图执行一个python脚本而不是bash脚本。
你的启动脚本应该是这样的。
#! /bin/bash
# ...
python3 paht/to/python_script.py