1

我正在尝试sample在具有关联启动脚本的 Google Cloud 中创建一个 Compute Engine VM 实例startup_script.sh。在启动时,我希望能够访问存储在 Cloud Source Repository 中的文件。因此,在这个脚本中,我使用克隆一个存储库

gcloud source repos clone <repo name> --project=<project name>

此外,startup_script.sh还运行命令,例如

gcloud iam service-accounts keys create key.json --iam-account <account>

创建.json凭据,以及

EXTERNAL_IP = $(gcloud compute instances describe sample --format='get(networkInterfaces[0].accessConfigs[0].natIP)' --zone=us-central1-a)

获取VM内VM的外部IP。为了不出错地运行这些命令,我​​发现我需要对多个 Cloud API 访问范围进行部分或完全访问。

如果我在创建虚拟机后手动编辑它以允许这样做并重新启动它,startup_script.sh运行良好,即我可以看到每个命令成功完成的结果。但是,我想在创建 VM 时分配这些范围,而不必事后手动编辑范围。我在文档中发现为了做到这一点,我可以运行

gcloud compute instances create sample --image-family=ubuntu-1804-lts --image-project=ubuntu-os-cloud --metadata-from-file=startup-script=startup_script.sh --zone=us-central1-a --scopes=[cloud-platform, cloud-source-repos, default]

但是,当我在 Cloud Shell 中运行此命令时,我一次只能添加一个范围,即--scopes=cloud_platform,或者如果我尝试输入多个范围,如上面的命令所示,我得到

ERROR: (gcloud.compute.instances.create) unrecognized arguments:
  cloud-source-repos,
  default]

按照文档建议添加多个范围似乎不起作用。使用范围的 URI 而不是它的别名时,我得到了类似的错误。

关于为什么会发生这种情况的任何明显原因?我觉得这可能与与sampleVM 关联的服务帐户(或缺少服务帐户)有关,但我对此并不完全熟悉。

奖励:理想情况下,我想在一个cloudbuild.yaml文件中运行 VM 创建云 shell 命令,我有

steps:
   - name: 'gcr.io/cloud-builders/gcloud'
   entrypoint: gcloud
   args: ['compute', 'instances', 'create', 'sample', '--image-family=ubuntu-1804-lts', '--image-project=ubuntu-os-cloud', '--metadata-from-file=startup-script=startup_sample.sh', '--zone=us-central1-a', '--scopes=[cloud-platform, cloud-source-repos, default]']

我可以使用提交构建

gcloud builds submit --config cloudbuild.yaml .

我的设置方式有什么问题cloudbuild.yaml吗?

4

1 回答 1

1

按照文档建议添加多个范围似乎不起作用

请将此命令与--scopes=cloud-platform,cloud-source-reposCreated而不是--scopes=[cloud-platform, cloud-source-repos, default]

gcloud compute instances create sample --image-family=ubuntu-1804-lts --image-project=ubuntu-os-cloud  --zone=us-central1-a --scopes=cloud-platform,cloud-source-reposCreated 

[https://www.googleapis.com/compute/v1/projects/wave25-vladoi/zones/us-central1-a/instances/sample].
NAME    ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
sample  us-central1-a  n1-standard-1               10.128.0.17  35.238.166.75  RUNNING

还要考虑@John Hanley 的评论。

于 2020-11-20T09:31:36.060 回答