Google compute engine 使用关闭脚本创建新的google云实例

Google compute engine 使用关闭脚本创建新的google云实例,google-compute-engine,Google Compute Engine,我正在尝试使用关闭脚本从正在关闭的实例中创建一个新实例 脚本有三个任务, 1.创建一个空文件 2.获取要创建的新实例的名称 3.为要生成的下一个新实例生成名称 4.使用生成的名称从此实例中创建新实例 以下是脚本: #!/bin/bash touch /home/ubuntu/newfile.txt new_instance_name=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/ne

我正在尝试使用关闭脚本从正在关闭的实例中创建一个新实例

脚本有三个任务, 1.创建一个空文件 2.获取要创建的新实例的名称 3.为要生成的下一个新实例生成名称 4.使用生成的名称从此实例中创建新实例

以下是脚本:

#!/bin/bash

touch /home/ubuntu/newfile.txt

new_instance_name=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/next_instance_name -H "Metadata-Flavor: Google")

next_instance_name="instance-"$(printf "%04d" $((${new_instance_name: -4}+1)))

gcloud beta compute --project=xxxxxxxxx instances create $new_instance_name --zone=us-central1-c --machine-type=f1-micro --subnet=default --network-tier=PREMIUM --metadata=next_instance_name=$next_instance_name --maintenance-policy=MIGRATE --service-account=XXXXXXXX-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/cloud-platform --image=image-1 --image-project=xxxxxxxx --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=$new_instance_name
使用
chmod+x
可执行此脚本,脚本的文件名为
/home/ubuntu/shtudown\u script.sh
。此实例的元数据
shutdown script
也是
/home/ubuntu/shtudown\u script.sh

当我从实例中手动运行脚本时,脚本的所有部分都运行良好,因此会创建一个新文件,并且在当前实例关闭时也会创建一个新实例

但是,当我
停止
实例时从API调用它时,它只会使用
touch
命令创建我创建的文件,而不会像以前那样创建新实例


我在这里做错了什么吗?

如果在您使用以下命令停止VM实例时关闭脚本起作用:

$sudo关机-立即关机

并且当通过按下“停止”按钮从云控制台停止VM实例时不起作用,那么我怀疑这种行为是意料之中的

停止VM实例时,关闭脚本的运行时间有限;但是,如果您使用“sudo shutdown”命令请求关机,则此限制不适用。您可以阅读有关此行为的更多信息


如果您想了解更多关于关机期间的信息,您可以阅读相关内容。

因此我能够重现您描述的行为。我运行了一个bash脚本,类似于您作为关闭脚本提供的脚本,它只会创建名为“newfile.txt”的空文件

然后我决定附加gcloud命令的输出以查看发生了什么。我不得不调整bash脚本以适应我的项目。下面是我运行的bash脚本,用于将输出复制到文件:

#!/bin/bash

touch /home/ubuntu/newfile.txt

gcloud beta compute --project=xxx instances create instance-6 --zone=us-central1-c --machine-type=f1-micro --subnet=default --maintenance-policy=MIGRATE --service-account=xxxx-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/cloud-platform --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=instance-6 > /var/output.txt 2>&1
我收到的输出如下:

错误:(gcloud.beta.compute.instances.create)无法获取资源:-权限不足

这意味着我的默认服务帐户没有适当的作用域来创建VM实例


然后,我停止了我的VM实例并编辑了作用域,以使服务帐户具有完全访问权限,如前所述。一旦我更改了作用域,我就重新启动VM实例,然后再次停止它。此时,它成功地创建了名为“instance-6”的VM实例。我不建议授予默认服务完全访问权限。我建议指定它应该具有哪些作用域,但如果您希望关闭脚本正常工作,请确保它具有对计算引擎的完全访问权限。

我已经通过授予服务帐户完全访问权限为实例提供了适当的作用域(这是一种糟糕的做法)

但当我使用google cloud sdk重新安装时,实际问题已经解决了

sudo apt-get install google-cloud-sdk

当我在重新安装
gcloud
之前运行这些脚本时,通过将sshing安装到实例中,它使用了来自预安装目录
/snap/bin/gcloud
gcloud
命令。但当它从启动或关闭脚本运行时,由于某种原因,它无法访问预安装的
/snap/bin/
目录,当我使用apt get重新安装google cloud sdk时,正在从
/usr/bin/gcloud
访问
gcloud
命令,我认为启动或关闭脚本可以访问该命令。

我尝试了
$sudo shutdown-h now
。它会产生相同的行为,它只能使用touch命令创建空文件,但不会创建新实例。