如何在AWS部署本地运行的Express后端?全栈项目整合部署遇阻
解决AWS Amplify前端与Node.js后端整合的部署方案
方案一:用AWS Amplify直接托管后端(和前端同环境,整合最顺畅)
既然前端已经在Amplify跑起来,直接用Amplify的构建流程把后端也部署进去,步骤如下:
修改
amplify.yml配置,让Amplify同时构建前端和后端,同时配置反向代理让前端请求转发到后端:version: 1 frontend: phases: preBuild: commands: - cd frontend/react-stuff - npm install build: commands: - npm run build artifacts: baseDirectory: build files: - '**/*' cache: paths: - frontend/react-stuff/node_modules/**/* rewrites: # 把前端/api开头的请求转发到后端 - source: /api/** target: /backend/server.js status: 200 backend: phases: preBuild: commands: - cd backend - npm install --production # 只安装生产依赖,减小体积 build: commands: - echo "Backend dependencies installed successfully" artifacts: baseDirectory: backend files: - '**/*' cache: paths: - backend/node_modules/**/*调整后端代码的端口配置:
在server.js里把监听端口改成动态读取环境变量,适配云端分配的端口:const PORT = process.env.PORT || 3001; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });提交修改并重新部署:把修改后的
amplify.yml和server.js推送到仓库,Amplify会自动重新构建并部署前后端。
方案二:解决Lambda部署包过大问题(坚持用Lambda的话)
Lambda部署包压缩后上限为50MB,你的后端超10MB可通过以下方式优化:
清理冗余文件和依赖:
- 进入backend目录,执行
npm prune --production删除开发依赖 - 不要把
mike_prompt.txt、本地.env文件打包,云端用Lambda环境变量配置这些内容 - 删除
node_modules里的文档、测试用例等非必要文件
- 进入backend目录,执行
用Lambda层分离大依赖:
- 把express、mongoose这类体积大的公共依赖单独打包成Lambda层,部署包只保留业务代码(
server.js等) - 创建Lambda层步骤:
- 新建
nodejs文件夹,执行npm init -y后安装所需依赖(如npm install express) - 把该文件夹压缩成zip,上传到Lambda层
- 在Lambda函数中关联这个层,即可直接使用依赖
- 新建
- 把express、mongoose这类体积大的公共依赖单独打包成Lambda层,部署包只保留业务代码(
打包部署代码:
- 把
server.js、package.json、package-lock.json打包成zip(不包含node_modules) - 上传到Lambda,配置运行时为Node.js,若对接API Gateway,需用Lambda Proxy集成适配请求格式
- 把
方案三:用Elastic Beanstalk部署后端(适合需要完整Node.js环境的场景)
如果后端需要持久化、自定义端口等灵活配置,可选择Elastic Beanstalk:
准备后端代码:
- 单独提取backend目录,确保
package.json的start命令为node server.js - 删除本地
node_modules,云端会自动安装依赖
- 单独提取backend目录,确保
创建Elastic Beanstalk应用:
- 登录AWS控制台进入Elastic Beanstalk,创建新应用并选择Node.js平台
- 上传后端代码的zip包,平台会自动配置服务器、安装依赖并启动服务
配置环境变量:
- 在Elastic Beanstalk环境配置中,添加原
.env文件的所有变量,保持键名一致
- 在Elastic Beanstalk环境配置中,添加原
前端对接:
- 把前端API请求地址改为Elastic Beanstalk分配的域名,或用Route 53将前后端绑定到同一域名下
关键注意事项(保证云端与本地一致)
- 环境变量统一:本地用
.env文件,云端用对应服务的环境变量配置,变量名完全匹配 - 依赖版本锁定:提交
package-lock.json到仓库,确保云端安装的依赖版本与本地一致 - 端口适配:后端代码不要硬写固定端口,用
process.env.PORT读取云端分配的端口
内容的提问来源于stack exchange,提问作者Michael Ani
相关产品推荐
相关产品推荐

