如何确保 GCP 启动脚本使用正确的服务帐户?

How do I ensure GCP start-script uses the correct service account?

我正在 GCP 的计算引擎中创建一个 VM,其服务帐户有权从特定的 Cloud Storage 存储桶中读取,该存储桶包含一些可能包含敏感信息(例如 TLS 证书)的常见配置。但是,当我的启动脚本被执行时,它被拒绝访问存储桶,因为它使用的是 Google Compute Engine 默认服务帐户,而不是我配置我的 VM 使用的服务帐户。有人可以帮我弄清楚如何确保启动脚本使用正确的服务帐户吗?

============= 编辑 =============

不确定这会有多大帮助,但这里是失败的木偶代码,我不能't/won提供所有木偶代码。实例启动时实际调用的启动脚本是sudo puppet apply --verbose /opt/puppet/manifests/opensearch.pp >/var/log/puppetlabs/puppet/startup.log 2>&1。请注意,我已经确认 puppet 没有对服务帐户执行任何特殊操作。但是 puppet 始终使用默认服务帐户,并且无法下载证书。如果我通过 SSH 进入实例并手动 运行 相同的命令,它每次都有效。

      exec { 'download_ssl_certs':
        command => "/snap/bin/gsutil cp -r gs://${opensearch::secrets_bucket}/${opensearch::cluster}/* ${opensearch::opensearch_path}/config/",
        notify  => Exec['ssl_certs_chown']
      }

      exec { 'ssl_certs_chown':
        command     => "/bin/chown -R ${opensearch::service_user}:${opensearch::service_group} ${opensearch::opensearch_path}/config",
        onlyif      => "/bin/ls -lhR ${opensearch::opensearch_path}/config | /bin/grep -i root | grep -v ${opensearch::service_user}",
        refreshonly => true,
        notify => Service['opensearch'],
      }

示例:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes https://www.googleapis.com/auth/cloud-platform 

Creating and enabling service accounts for instances

由于服务帐户是元数据的一部分,您可以使用启动脚本访问元数据。

Accessing metadata from a Linux startup script