FastAPI结合Alembic、Docker、Lambda部署时运行数据库迁移问题咨询
迁移执行方案
直接设置alembic upgrade head为CMD不生效的原因
Lambda容器镜像必须符合Lambda运行时接口规范,直接将迁移命令设为CMD的话,命令执行完成进程就直接退出,无法满足Lambda的运行要求,因此会启动失败。
方案1:专用迁移Lambda函数(数据库无公网访问时适用)
- 编写极简Lambda处理函数,触发时执行迁移命令,示例
handler.py内容如下:
import subprocess import sys import os def handler(event, context): # 从Lambda环境变量获取数据库连接配置 os.environ["SQLALCHEMY_DATABASE_URI"] = os.getenv("AURORA_DB_CONN_STR") try: # 执行alembic迁移 result = subprocess.run( [sys.executable, "-m", "alembic", "upgrade", "head"], check=True, capture_output=True, text=True ) print("Migration output:", result.stdout) return {"status": "success", "output": result.stdout} except subprocess.CalledProcessError as e: print("Migration failed, error:", e.stderr) raise RuntimeError(f"Migration failed: {e.stderr}")
- 调整迁移用镜像的Dockerfile,将入口改为上述处理函数:
# 基于你原应用的镜像构建即可,确保包含alembic、迁移脚本和所有依赖 FROM your-existing-fastapi-app-image:latest COPY handler.py . CMD ["handler.handler"]
- 为迁移Lambda配置和原业务Lambda相同的VPC、安全组权限,确保可以访问Aurora数据库,同时配置加密环境变量存储数据库连接串,不要明文写入代码或镜像。
- 在GitHub Actions部署流程中,新增Lambda调用步骤,待镜像推送ECR、Lambda配置更新完成后执行迁移:
# 调用迁移Lambda aws lambda invoke \ --function-name your-project-db-migration-lambda \ --payload '{}' \ migration_result.json # 校验迁移结果 if grep -q "errorMessage" migration_result.json; then echo "Migration failed, check Lambda logs for details" exit 1 fi echo "Migration completed successfully"
方案2:GitHub Actions直接执行迁移(更简化方案)
如果你的Aurora数据库允许公网访问,或者GitHub Actions runner已经和AWS VPC打通,可以不需要额外维护迁移Lambda,直接在Actions流程中执行迁移:
- 在GitHub Secrets中配置AWS凭证和数据库连接信息
- 部署流程中新增步骤:安装Python依赖、拉取数据库配置、直接执行
alembic upgrade head
注意事项
- 执行生产环境迁移前务必提前备份Aurora数据库,避免迁移错误导致数据损坏
- 迁移Lambda的超时时间需要根据迁移脚本的执行时长调整,建议至少设置为5分钟,避免执行中途被Lambda强制终止
- 所有涉及数据库连接的敏感信息必须使用加密存储,不要明文暴露在配置、代码或日志中
内容的提问来源于stack exchange,提问作者Devon Ray
相关产品推荐
相关产品推荐

