使用Makefile向AWS Lambda上传Python库报错,求解决方案及替代方法
问题分析与解决
先看你遇到的直接错误:cp: cannot stat './AWS/.': No such file or directory,这说明Makefile里的$(PROJECT)变量要么没定义,要么你的项目目录根本不叫AWS。另外你的Makefile还有几个语法和依赖顺序的问题,导致整个build流程出错,下面一步步帮你修正。
1. 修正Makefile的核心问题
问题点拆解
- 变量未定义/错误引用:你没看到
PROJECT变量的定义,而且copy_python里的$(VIRTUAL)是笔误,应该是$(VIRTUAL_ENV);$(VIRTUAL_ENV)lib少了斜杠,变成了envlib(从错误日志里的if test -d envlib能看出来)。 - 语法错误:
copy_python的第二个if语句没写完,缺少分号和闭合的fi前的分号。 - 依赖顺序错误:
build目标的依赖顺序是clean_package copy_python build_package_tmp ...,导致copy_python先执行,但此时package/tmp目录还没创建(build_package_tmp才负责创建),而且复制项目文件的步骤放在了创建tmp目录之后,但项目目录不存在的话依然报错。
修正后的Makefile
# 先定义必要变量,替换成你的项目名 PROJECT := your-project-name VIRTUAL_ENV := env install: virtual build: virtual clean_package build_package_tmp copy_python remove_unused zip virtual: @echo "--> Setup and activate virtualenv" if test ! -d "$(VIRTUAL_ENV)"; then \ pip install virtualenv; \ virtualenv $(VIRTUAL_ENV); \ fi @echo "" clean_package: rm -rf ./package/* mkdir -p ./package # 确保package目录存在 build_package_tmp: mkdir -p ./package/tmp/lib # 先检查项目目录是否存在再复制 if test -d ./$(PROJECT)/; then \ cp -R ./$(PROJECT)/. ./package/tmp/; \ else \ echo "Error: Project directory ./$(PROJECT)/ does not exist!"; \ exit 1; \ fi copy_python: if test -d $(VIRTUAL_ENV)/lib/python2.7/site-packages/; then \ cp -a $(VIRTUAL_ENV)/lib/python2.7/site-packages/. ./package/tmp/; \ fi if test -d $(VIRTUAL_ENV)/lib64/python2.7/site-packages/; then \ cp -a $(VIRTUAL_ENV)/lib64/python2.7/site-packages/. ./package/tmp/; \ fi remove_unused: rm -rf ./package/tmp/wheel* rm -rf ./package/tmp/easy-install* rm -rf ./package/tmp/setup-tools* zip: cd ./package/tmp && zip -r ../$(PROJECT).zip .
修改说明
- 顶部添加了
PROJECT和VIRTUAL_ENV的变量定义,你需要把your-project-name改成实际的项目目录名。 - 调整了
build的依赖顺序:先创建虚拟环境,清理package,然后创建tmp目录并复制项目文件,再复制虚拟环境的依赖,最后清理无用文件并打包。 - 给
build_package_tmp添加了项目目录存在性检查,避免直接报错。 - 修复了
copy_python里的变量引用和语法错误,每个if语句都正确闭合。 - 添加了
mkdir -p ./package到clean_package,确保package目录存在。
2. 执行修正后的Makefile
- 把上面的Makefile保存为
Maketest.mk,替换PROJECT为你的实际项目目录名。 - 先执行虚拟环境安装:
make -f Maketest.mk install - 激活虚拟环境:
source env/bin/activate - 安装你的项目依赖:
pip install -r requirements.txt(如果有requirements的话) - 执行build:
make -f Maketest.mk build
3. Linux控制台端更优的上传方法
如果你觉得Makefile太麻烦,推荐几个更简单的方式:
方法一:用AWS CLI直接打包上传
- 先把项目文件和依赖打包到一个目录:
# 创建临时目录 mkdir -p lambda_package # 复制项目文件 cp -R your-project/* lambda_package/ # 复制虚拟环境的依赖(假设虚拟环境是env) cp -a env/lib/python2.7/site-packages/* lambda_package/ # 清理无用文件 rm -rf lambda_package/wheel* lambda_package/easy-install* lambda_package/setup-tools* # 打包 cd lambda_package && zip -r ../lambda-deploy.zip . - 用AWS CLI上传到Lambda:
aws lambda update-function-code --function-name your-lambda-function --zip-file fileb://lambda-deploy.zip
方法二:用pip直接打包依赖到目录
如果你的项目用Python 3(强烈推荐,Python 2已经停止官方支持),可以用pip的--target参数直接把依赖安装到目标目录:
# 创建打包目录 mkdir lambda_package # 安装依赖到目录 pip install -r requirements.txt --target lambda_package/ # 复制项目文件 cp your-project/*.py lambda_package/ # 打包 cd lambda_package && zip -r ../lambda-deploy.zip . # 上传 aws lambda update-function-code --function-name your-lambda-function --zip-file fileb://lambda-deploy.zip
方法三:用Serverless Framework(更适合复杂项目)
Serverless Framework可以自动化Lambda的部署流程,包括打包、上传、配置管理,只需要一个serverless.yml配置文件,执行serverless deploy就能完成全流程部署,对于多函数、多环境的项目非常友好。
内容的提问来源于stack exchange,提问作者Avichal Bettoli
相关产品推荐
相关产品推荐

