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
相关产品推荐
相关产品推荐

