如何使用Python在AWS Lambda中访问Firebase并将文件转存至AWS S3
Firebase Storage 文件转存 AWS S3 Python 实现方案
前置准备
- 获取 Firebase 项目服务账号密钥 JSON 文件,可在 Firebase 控制台「项目设置」-「服务账号」页面生成
- 获取 AWS 访问密钥(Access Key ID、Secret Access Key),需为密钥授予目标 S3 桶的写入权限
- 安装依赖包:
pip install firebase-admin boto3
核心实现代码
import firebase_admin from firebase_admin import credentials, storage import boto3 import os # 初始化 Firebase 客户端 cred = credentials.Certificate("你的firebase服务账号密钥文件路径.json") firebase_admin.initialize_app(cred, { 'storageBucket': '你的firebase存储桶名称.appspot.com' }) firebase_bucket = storage.bucket() # 初始化 S3 客户端 s3 = boto3.client( 's3', aws_access_key_id='你的AWS_ACCESS_KEY_ID', aws_secret_access_key='你的AWS_SECRET_ACCESS_KEY', region_name='你的S3桶所在区域,例如ap-northeast-1' ) S3_TARGET_BUCKET = '你的目标S3桶名称' # 遍历 Firebase Storage 所有文件 for blob in firebase_bucket.list_blobs(): # 跳过路径占位的文件夹类blob if blob.name.endswith('/'): continue print(f"正在处理文件:{blob.name}") # 方案1:内存直接转存,适合单文件体积小于100M的场景 file_content = blob.download_as_bytes() s3.put_object( Bucket=S3_TARGET_BUCKET, Key=blob.name, # 可自定义S3端存储路径,默认复用Firebase路径 Body=file_content, ContentType=blob.content_type # 保留原文件类型,避免访问异常 ) # 方案2:大文件本地中转,避免内存溢出 # local_temp_path = f"/tmp/{os.path.basename(blob.name)}" # blob.download_to_filename(local_temp_path) # s3.upload_file(local_temp_path, S3_TARGET_BUCKET, blob.name) # os.remove(local_temp_path) print("所有文件转存完成")
优化建议
- 大文件量场景可引入多线程并发上传,大幅提升转存效率
- 增加转存校验逻辑,上传后对比文件MD5值,确保文件完整性
- 生产环境禁止硬编码密钥,Firebase密钥可从环境变量读取,AWS侧优先使用IAM角色授权,避免密钥泄露
- 单次转存文件量过万时建议拆成分批任务,搭配标记已处理文件的逻辑,支持中断后断点续传
注意:如果在AWS Lambda中运行该逻辑,临时文件仅可存储在
/tmp目录,且受运行时长、内存上限限制,超大存储桶转存建议拆分任务处理。
内容的提问来源于stack exchange,提问作者Risa
相关产品推荐
相关产品推荐

