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

