我在创建实例并使用Python Google Cloud的api启动它们时遇到了很多麻烦
基本上,我首先创建了所有虚拟机并设置了服务。然后,一旦一切正常,我停止了虚拟机并创建了Image
,这样我就可以使用映像轻松地创建实例
[编辑] 我想补充一点很好:
以下是我的Python脚本:
import googleapiclient.discovery
import argparse
import os
import time
backend_script = """
#! /bin/bash
cd /mse-tsm-cloudsys-lab1/api/
sudo npm install
sudo npx knex migrate:latest
sudo npx knex seed:run
sudo npm run start
"""
frontend_script = """
#! /bin/bash
cd /mse-tsm-cloudsys-lab1/app/
sudo npm install
sudo npm run build
sudo npm run start
"""
def create_instance(compute, project, zone, name, image, machine, ip, ip_public, tags=[], metadata=[]):
config = {
'name': name,
'machineType': "zones/%s/machineTypes/%s" % (zone, machine),
'disks': [
{
'initializeParams': {
"sourceImage": image
},
"boot": True
}
],
'tags': {
"items": tags
},
"networkInterfaces": [
{
'network': 'global/networks/default',
'networkIP': ip,
'accessConfigs': [
{
'type': 'ONE_TO_ONE_NAT',
'name': 'External NAT',
'natIP': ip_public
}
]
}
],
"metadata": {
"items": metadata
}
}
return compute.instances().insert(
project=project,
zone=zone,
body=config).execute()
def delete_instance(compute, project, zone, name):
return compute.instances().delete(
project=project,
zone=zone,
instance=name).execute()
def list_instances(compute, project, zone):
result = compute.instances().list(project=project, zone=zone).execute()
return result['items'] if 'items' in result else None
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
if 'error' in result:
raise Exception(result['error'])
return result
time.sleep(1)
def main(mode, project, zone, wait=True):
compute = googleapiclient.discovery.build('compute', 'v1')
if(mode == 'list'):
instances = list_instances(compute, project, zone)
print('Instances in project %s and zone %s:' % (project, zone))
for instance in instances:
print(' - ' + instance['name'])
return
print("Creating Database")
instance_name = "postgres-lab1"
image = "projects/tsm-cloudsys-vial/global/images/image-postgres-lab1"
machine = "e2-micro"
ip = "10.132.0.2"
ip_public = "34.79.195.77"
tags = ["postgres-lab1"]
operation1 = create_instance(compute, project, zone, instance_name, image, machine, ip, ip_public)
print("Creating Backend")
instance_name = "backend-lab1"
image = "projects/tsm-cloudsys-vial/global/images/image-backend-lab1"
machine = "e2-micro"
ip = "10.132.0.4"
ip_public = "34.79.111.217"
metadata = [{
"key": "startup-script",
"value": backend_script
}]
tags = ["backend-lab1","http-server","https-server"]
operation2 = create_instance(compute, project, zone, instance_name, image, machine, ip, ip_public, metadata=metadata)
print("Creating Frontend")
instance_name = "frontend-lab1"
image = "projects/tsm-cloudsys-vial/global/images/image-frontend-lab1"
machine = "e2-micro"
ip = "10.132.0.3"
ip_public = "35.187.109.153"
metadata = [{
"key": "startup-script",
"value": frontend_script
}]
tags = ["frontend-lab1","http-server","https-server"]
operation3 = create_instance(compute, project, zone, instance_name, image, machine, ip, ip_public, tags, metadata=metadata)
print("Waiting for VMs to come online")
wait_for_operation(compute, project, zone, operation1['name'])
wait_for_operation(compute, project, zone, operation2['name'])
wait_for_operation(compute, project, zone, operation3['name'])
instances = list_instances(compute, project, zone)
print('Instances in project %s and zone %s:' % (project, zone))
for instance in instances:
print(' - ' + instance['name'])
if wait:
input()
print("Deleting DB")
operation1 = delete_instance(compute, project, zone, "postgres-lab1")
print("Deleting Backend")
operation2 = delete_instance(compute, project, zone, "backend-lab1")
print("Deleting Frontend")
operation3 = delete_instance(compute, project, zone, "frontend-lab1")
wait_for_operation(compute, project, zone, operation1['name'])
wait_for_operation(compute, project, zone, operation2['name'])
wait_for_operation(compute, project, zone, operation3['name'])
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('--mode', help='Wanted mode', default='list')
parser.add_argument('project_id', help='Your Google Cloud project ID.')
parser.add_argument(
'--zone',
default='europe-west1-b',
help='Compute Engine zone to deploy to.')
args = parser.parse_args()
main(args.mode, args.project_id, args.zone)
这3个实例已创建并正在运行,我可以ping所有实例。(是的,其中一个已关闭,因为我正在尝试重新启动它) 但我有两个主要问题:
startup-script
没有得到纠正,因为即使这3个实例正在运行,我也无法像以前手动创建它们时那样访问它们。例如frontend-lab1
应该在端口3000上响应,但在我使用脚本创建它时没有响应我主要关心的是第2个问题,因为我认为它会解决第1个问题。有人能帮我做我的startup-script
吗
[编辑二] 以下是日志:
ct 6 19:24:23 frontend-lab1 systemd[1]: Starting Google Compute Engine Startup Scripts...
Oct 6 19:24:23 frontend-lab1 google_metadata_script_runner[795]: 2021/10/06 19:24:23 logging client: rpc error: code = Unauthenticated desc = transport: metadata: GCE metadata "instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Flogging.write" not defined
Oct 6 19:24:37 frontend-lab1 systemd[1]: systemd-fsckd.service: Succeeded.
Oct 6 19:24:51 frontend-lab1 systemd[1]: systemd-hostnamed.service: Succeeded.
Oct 6 19:25:21 frontend-lab1 GCEGuestAgent[539]: 2021-10-06T19:25:21.4654Z GCEGuestAgent Info: Removing user jeromevialhes.
Oct 6 19:25:22 frontend-lab1 google_guest_agent[539]: 2021/10/06 19:25:22 logging client: rpc error: code = Unauthenticated desc = transport: metadata: GCE metadata "instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Flogging.write" not defined
Oct 6 19:25:22 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:22 GCEMetadataScripts: startup-script: /tmp/metadata-scripts111777770/startup-script: line 3: cd: /mse-tsm-cloudsys-lab1/app/: No such file or directory
Oct 6 19:25:23 frontend-lab1 google_metadata_script_runner[795]: 2021/10/06 19:25:23 logging client: rpc error: code = Unauthenticated desc = transport: metadata: GCE metadata "instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Flogging.write" not defined
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: npm WARN saveError ENOENT: no such file or directory, open '/package.json'
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: npm WARN enoent ENOENT: no such file or directory, open '/package.json'
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: npm WARN !invalid#2 No description
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: npm WARN !invalid#2 No repository field.
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: npm WARN !invalid#2 No README data
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: npm WARN !invalid#2 No license field.
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script:
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: up to date in 0.489s
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script: found 0 vulnerabilities
Oct 6 19:25:27 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:27 GCEMetadataScripts: startup-script:
Oct 6 19:25:27 frontend-lab1 google_metadata_script_runner[795]: 2021/10/06 19:25:27 logging client: rpc error: code = Unauthenticated desc = transport: metadata: GCE metadata "instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Flogging.write" not defined
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! code ENOENT
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! syscall open
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! path /package.json
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! errno -2
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! enoent ENOENT: no such file or directory, open '/package.json'
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! enoent This is related to npm not being able to find a file.
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! enoent
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script:
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! A complete log of this run can be found in:
Oct 6 19:25:28 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:28 GCEMetadataScripts: startup-script: npm ERR! /root/.npm/_logs/2021-10-06T19_25_28_453Z-debug.log
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! code ENOENT
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! syscall open
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! path /package.json
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! errno -2
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! enoent ENOENT: no such file or directory, open '/package.json'
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! enoent This is related to npm not being able to find a file.
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! enoent
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script:
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! A complete log of this run can be found in:
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script: npm ERR! /root/.npm/_logs/2021-10-06T19_25_29_171Z-debug.log
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: startup-script exit status 254
Oct 6 19:25:29 frontend-lab1 GCEMetadataScripts[795]: 2021/10/06 19:25:29 GCEMetadataScripts: Finished running startup scripts.
Oct 6 19:25:29 frontend-lab1 systemd[1]: google-startup-scripts.service: Succeeded.
Oct 6 19:25:29 frontend-lab1 systemd[1]: Finished Google Compute Engine Startup Scripts.
但您可以看到存储库存在:
jeromevialhes@frontend-lab1:~$ ls
mse-tsm-cloudsys-lab1
查看问题中包含的日志,您的custom图像可能有问题。在日志文件的第7行中,它警告未找到目录“/mse-tsm-cloudsys-labl1/app/”:
如果此目录用于包含您的应用程序文件,则可能会导致与NPM无法找到
package.json
等文件以及属于您的应用程序的其他文件相关的后续错误您应该确认应用程序路径是否正确,或者映像是否正确创建。您可以按照this指南从现有VM实例创建自定义映像,并使用Node.js和Python指南确保遵循正确的步骤
相关问题 更多 >
编程相关推荐