Google Cloud Function上传数据至Labelbox遇Forbidden错误排查
解决Google Cloud Function中Labelbox API返回Forbidden认证错误
我编写了一段用于从GCS存储桶读取文件并上传至Labelbox的Google Cloud Function代码,但触发时Labelbox返回Forbidden错误,提示请求认证失败。已确认:
- Labelbox API密钥正确
- 密钥具备项目数据上传权限
- 函数可正常读取GCS存储桶内的数据
代码如下:
import labelbox from labelbox import Client, Dataset import os import uuid import logging # Add your API key below LABELBOX_API_KEY = "my api key" client = Client(api_key=LABELBOX_API_KEY) def upload_asset(event, context): """Uploads an asset to Catalog when a new asset is uploaded to GCP bucket. If a dataset with bucket_name exists in Catalog, then an asset is added to that dataset. Otherwise, a new dataset is created. Args: event (dict): Event payload. context (google.cloud.functions.Context): Metadata for the event. """ file = event bucket_name = file['bucket'] object_name = file["name"] try: datasets = client.get_datasets(where=Dataset.name == bucket_name) dataset = next(datasets, None) if not dataset: dataset = client.create_dataset(name=bucket_name) url = f"gs://{bucket_name}/{object_name}" dataset.create_data_row(row_data=url, external_id=object_name ) logging.getLogger().setLevel(logging.DEBUG) return "success" except Exception as e: print(f"Error: {e}") return "failure"
可能的成因
- API密钥权限范围不匹配:密钥虽有效,但未被授予目标Labelbox项目的写入权限(如创建数据集、添加数据行),或密钥关联的项目并非你要上传的目标项目。
- 硬编码密钥的部署问题:GCP Function中硬编码密钥可能导致部署时密钥未正确注入,或在版本控制中被意外修改,导致运行时使用无效密钥。
- Labelbox SDK版本问题:旧版本SDK存在认证逻辑bug,导致请求无法通过Labelbox权限校验。
- 未指定目标Project ID:Client初始化时未明确指定
project_id,默认使用密钥关联的第一个项目,而该项目并非目标操作项目,触发权限校验失败。
解决办法
1. 验证API密钥的权限与关联项目
- 登录Labelbox控制台,进入Account Settings > API Keys页面。
- 确认目标API密钥关联的项目是你要上传数据的项目。
- 检查密钥权限列表,确保包含
Create Dataset和Create Data Row等写入权限(自定义权限组需包含对应操作)。
2. 使用环境变量存储API密钥
避免硬编码密钥,改用GCP Function环境变量传递:
- 在GCP Function配置页面添加环境变量
LABELBOX_API_KEY,值为你的Labelbox API密钥。 - 修改代码中的密钥获取逻辑:
# 替换硬编码的密钥 LABELBOX_API_KEY = os.environ.get("LABELBOX_API_KEY") if not LABELBOX_API_KEY: raise ValueError("LABELBOX_API_KEY environment variable not set") client = Client(api_key=LABELBOX_API_KEY)
3. 升级Labelbox SDK到最新版本
在Function的requirements.txt中指定最新版本的Labelbox SDK:
labelbox>=3.60.0 google-cloud-storage>=2.14.0
重新部署Function,确保使用最新版SDK。
4. 初始化Client时明确指定Project ID
若API密钥关联多个Labelbox项目,初始化Client时需明确指定目标项目ID:
client = Client(api_key=LABELBOX_API_KEY, project_id="your-target-project-id")
项目ID可在Labelbox项目页面的URL中获取(格式为app.labelbox.com/projects/{project-id})。
内容的提问来源于stack exchange,提问作者ishan weerakoon
相关产品推荐
相关产品推荐

