You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP中能否使用VM默认Service Account调用API及配置方法

问题解答

1. 是否可以使用VM绑定的默认Service Account列出组织下的Storage Buckets

完全可以,但必须满足两个前置条件:

  • VM实例已正确配置绑定目标Service Account(可以是Compute Engine默认Service Account,也可以是你自定义的用户托管Service Account),且实例的Cloud API访问权限未被设置为完全禁用。
  • 绑定到VM的Service Account被授予了覆盖整个Organization范围的storage.buckets.list权限。注意默认的Compute Engine Service Account仅具备所属项目的基础权限,没有组织级别的存储资源枚举权限,你需要在IAM控制台的组织层级为该SA绑定对应角色(可选择包含存储桶列举权限的预设角色如roles/storage.admin,也可配置自定义最小权限角色),仅在项目层级授权无法枚举整个组织下的所有存储桶。

2. 代码鉴权配置方法

不需要手动传入Service Account密钥文件,GCP的Application Default Credentials(ADC)机制会自动从VM内置的元数据服务拉取绑定SA的临时轮换凭证,全程无需手动管理密钥。具体配置分两步:

前置VM配置检查

  • 进入VM实例详情页,确认「服务账号」配置项为你要使用的目标SA。
  • 检查VM的「Cloud API 访问范围」配置,最稳妥的设置为「允许对所有 Cloud API 拥有完整访问权限」,修改该配置后需要重启VM生效。

代码侧实现

分两种常见场景:

  • 使用GCP官方客户端库调用:不需要编写任何显式鉴权代码,客户端初始化时会自动通过ADC链路获取VM绑定SA的凭证,无需传入密钥路径。以Python语言列举存储桶的代码为例:
from google.cloud import storage
# 无显式传参,自动加载VM绑定SA的凭证
storage_client = storage.Client()
# 发起组织范围的存储桶列举请求,替换为你自己的纯数字组织ID
all_buckets = storage_client.list_buckets(
    parent="organizations/替换为你的组织ID"
)
for bucket in all_buckets:
    print(bucket.name)
  • 直接调用REST API:不需要手动生成签名或者加载密钥文件,直接从VM本地的元数据服务端点获取临时访问令牌即可。该端点仅在VM内部可访问,不需要额外鉴权,请求示例:
# 从元数据服务获取有效期1小时的临时访问令牌
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
-H "Metadata-Flavor: Google"

解析返回结果中的access_token字段,在调用Storage REST API的请求头中携带Authorization: Bearer <access_token>即可完成鉴权。临时令牌会自动轮换,你不需要手动维护刷新逻辑,每次请求前从元数据端点拉取最新令牌即可,也可以引入官方Auth客户端库自动处理令牌刷新。

注意事项

  • 遵循最小权限原则,为VM绑定的SA仅分配实际业务需要的权限,不要过度授权。
  • 代码中不要硬编码任何SA密钥内容或密钥文件路径,只要不主动传入显式密钥参数,ADC在VM环境下会自动优先使用绑定SA的元数据服务凭证。

内容的提问来源于stack exchange,提问作者gcp_user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:57:20