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

如何为Compute Engine默认服务账号添加Cloud Vision API权限范围?

解决GCE实例服务账号Cloud Vision权限范围问题

我来帮你搞定这个权限问题,分两部分给你讲清楚:一是如何单独添加Cloud Vision的权限范围,二是全API访问范围搭配IAM角色限制的可行性及操作方法。

一、单独添加Cloud Vision权限范围的三种方式

1. GCP控制台操作

注意:运行中的实例无法修改权限范围,必须先停止实例,这是很多人踩坑的点!

  • 先在GCE控制台找到你的实例,点击右上角的「停止」按钮,等待实例状态变为已停止
  • 点击实例名称进入详情页,顶部选择「编辑」
  • 滚动到「云API访问范围」区域,选择「设置访问范围以启用对每个API的访问」
  • 在搜索框输入Cloud Vision API,找到后勾选对应的选项(对应的权限范围就是你要的https://www.googleapis.com/auth/cloud-vision)
  • 拉到页面底部点击「保存」,再启动实例就生效了

2. gcloud命令行操作

同样需要先停实例,再更新权限范围:

# 第一步:停止目标实例
gcloud compute instances stop YOUR_INSTANCE_NAME --zone=YOUR_INSTANCE_ZONE

# 第二步:更新服务账号的权限范围(如果要保留原有其他scopes,一定要把它们也列出来,否则会被覆盖)
gcloud compute instances set-service-account YOUR_INSTANCE_NAME \
  --zone=YOUR_INSTANCE_ZONE \
  --service-account=YOUR_DEFAULT_SERVICE_ACCOUNT_EMAIL \
  --scopes=https://www.googleapis.com/auth/cloud-vision,EXISTING_SCOPE_1,EXISTING_SCOPE_2

# 第三步:重新启动实例
gcloud compute instances start YOUR_INSTANCE_NAME --zone=YOUR_INSTANCE_ZONE

如果你不确定原有scopes是什么,可以先运行gcloud compute instances describe YOUR_INSTANCE_NAME --zone=YOUR_INSTANCE_ZONE | grep scopes查看。

3. Python代码实现(用googleapiclient)

需要你的执行环境有操作GCE实例的权限,代码逻辑是先停实例、更新scopes、再启动实例:

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
import time

# 初始化Compute Engine API客户端
credentials = GoogleCredentials.get_application_default()
compute_service = discovery.build('compute', 'v1', credentials=credentials)

# 替换成你的项目、区域、实例名和默认服务账号邮箱
PROJECT_ID = "your-project-id"
ZONE = "your-instance-zone"
INSTANCE_NAME = "your-instance-name"
SERVICE_ACCOUNT_EMAIL = "your-default-service-account@developer.gserviceaccount.com"

# 要设置的权限范围,包含Cloud Vision
TARGET_SCOPES = [
    "https://www.googleapis.com/auth/cloud-vision",
    # 这里添加需要保留的其他权限范围
]

# 停止实例
print("正在停止实例...")
stop_request = compute_service.instances().stop(
    project=PROJECT_ID, zone=ZONE, instance=INSTANCE_NAME
)
stop_request.execute()

# 等待实例完全停止(简单的轮询检查)
while True:
    instance_status = compute_service.instances().get(
        project=PROJECT_ID, zone=ZONE, instance=INSTANCE_NAME
    ).execute()["status"]
    if instance_status == "TERMINATED":
        break
    time.sleep(5)

# 更新服务账号的权限范围
print("正在更新权限范围...")
update_body = {
    "serviceAccounts": [{
        "email": SERVICE_ACCOUNT_EMAIL,
        "scopes": TARGET_SCOPES
    }]
}
update_request = compute_service.instances().setServiceAccount(
    project=PROJECT_ID, zone=ZONE, instance=INSTANCE_NAME, body=update_body
)
update_request.execute()

# 启动实例
print("正在启动实例...")
start_request = compute_service.instances().start(
    project=PROJECT_ID, zone=ZONE, instance=INSTANCE_NAME
)
start_request.execute()

print("权限范围更新完成!")

运行前记得安装依赖包:pip install google-api-python-client oauth2client

二、全API访问范围+IAM角色限制是否可行?

完全可行!甚至这是一种更灵活的权限管理方案——权限范围(scopes)是粗粒度的API访问开关,而IAM角色是细粒度的权限控制,两者结合可以做到“允许访问所有API,但只给服务账号调用Cloud Vision的权限”,而且不用频繁停实例改scopes。

具体操作步骤:

1. 设置实例为全API访问范围

  • 停止实例,编辑详情页,在「云API访问范围」选择「允许访问所有云API」,保存后启动实例

2. 给默认服务账号添加最小权限IAM角色

  • 进入GCP控制台的「IAM与管理员」→「IAM」页面
  • 搜索你的GCE默认服务账号(格式一般是[项目编号]-compute@developer.gserviceaccount.com)
  • 点击账号右侧的编辑图标,点击「添加角色」,搜索Cloud Vision API User(这个角色是调用Cloud Vision API的最小权限角色)
  • 如果服务账号之前有过宽的角色(比如Editor),记得移除,只保留必要的角色
  • 点击「保存」生效

设置完成后,你可以测试一下:调用Cloud Vision API正常,但调用其他API(比如Cloud Storage)会收到403错误,说明权限限制生效了,安全性和单独设置scope完全一致,后续要加其他API权限直接在IAM里加对应角色就行,不用停实例。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:06:36