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

Cloud Run作业脚本访问GCS存储桶:解决依赖缺失及认证问题

解决Cloud Run作业中Python脚本访问GCS的问题

1. 修复ModuleNotFoundError依赖缺失问题

你遇到的模块找不到错误,是因为构建的镜像里没有安装google-cloud-storage依赖。按以下步骤补充依赖配置:

  • 在Python脚本同目录下创建requirements.txt文件,内容如下:
google-cloud-storage>=2.10.0
  • 重新构建镜像,Cloud Build的Buildpack会自动识别requirements.txt并安装依赖:
gcloud builds submit --pack image=gcr.io/<my-project-id>/logger-job

2. 优化GCS访问方式(替代本地服务账号密钥)

Cloud Run作业环境会自动提供默认服务账号身份,无需手动加载本地密钥文件,可简化脚本逻辑:

import sys
from google.cloud import storage

def get_bucket(bucket_name):
    # 环境自动加载身份,无需指定密钥文件
    storage_client = storage.Client()

    try:
        # 直接获取指定桶,比遍历所有桶更高效
        bucket = storage_client.get_bucket(bucket_name)
        print(bucket)
        return bucket
    except Exception as e:
        print(f"Error: bucket not found - {str(e)}")
        sys.exit(1)

def upload_file(bucket, fname):
    destination_blob_name = fname
    source_file_name = fname

    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(source_file_name)

    print(f"File {source_file_name} uploaded to {destination_blob_name}.")

if __name__ == "__main__":
    bucket = get_bucket('MyBucket')
    upload_file(bucket, 'testfile')

3. 解决作业访问GCS的认证权限问题

Cloud Run作业默认使用[项目编号]-compute@developer.gserviceaccount.com服务账号,需为其赋予GCS桶的访问权限:

  • 给默认服务账号添加GCS角色(比如仅允许上传的Storage Object Creator):
gcloud projects add-iam-policy-binding <my-project-id> \
    --member="serviceAccount:<my-project-number>-compute@developer.gserviceaccount.com" \
    --role="roles/storage.objectCreator"
  • 若使用自定义服务账号,创建作业时可指定:
gcloud beta run jobs create helloworld \
    --image gcr.io/<my-project-id>/logger-job \
    --region europe-west9 \
    --service-account=your-custom-sa@<my-project-id>.iam.gserviceaccount.com

需提前给自定义服务账号配置对应的GCS权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:45:35