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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:18:02