如何在 GCE 启动脚本中获取当前区域和项目 ID?

How to get the current Zone & Project ID in a GCE startup script?

长话短说;博士。我想要一个实例来描述自己,而 运行 一个启动脚本。


我有一个 startup.sh shell script (which I can reference with --metadata startup-script-url=gs://bucketname/startup.sh), which depends on a steam.exp expect 脚本。因此,我想知道使用过的桶的名称;例如。来自元数据 startup-script-url。假定这两个文件都位于同一个存储桶中,但只能引用其中一个。

我正在尝试获取元数据 startup-script-url,然后在 shell 脚本中提取存储桶名称(将添加到 startup.sh,以便获取 gs://bucketname/steam.exp 在 运行 之前)。

到目前为止我尝试过的:

gcloud compute instances describe $HOSTNAME \
  --zone=europe-west3-c \
  --project=some-project \
  --flatten="metadata[startup-script-url]"

但这不可移植,因为它需要是当前项目 ID 和当前区域。

如何在启动脚本中获取这些值?我还没试过printenv

可以像这样得到 project:

PROJECT_ID=`gcloud config get-value project`

然后通过以下方式获得 zone

gcloud compute instances list \
  --project=$PROJECT_ID \
  --filter=name:$HOSTNAME \
  --format="table[csv,no-heading](zone)"

这需要权限 gcloud.compute.instances.list,角色 roles/compute.viewer 拥有。

同时我还发现了 Google Cloud 游戏服务器(测试版)。

您可以使用 curl 获取 VM 元数据:

STARTUP_SCRIPT_URL=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/my-startup-script-url" -H "Metadata-Flavor: Google"`

您还可以从元数据服务器获取其他值,例如 GCP 项目 ID 和 VM 的区域。 Curl 似乎比 gcloud 更快:

GCP_PROJECT_ID=`curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google"`

GCP_ZONE=$(basename `curl -s "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google"`)

GCP_REGION="${GCP_ZONE::-2}"

https://cloud.google.com/compute/docs/metadata/default-metadata-values