AWS Amplify构建失败:pipenv --venv命令执行出错
使用AWS Amplify搭建的网站包含多个Python Lambda函数,此前构建成功,近期仅修改前端代码后再次构建时出现错误:
🛑 Received error [Error: Command failed with exit code 1: pipenv --venv No virtualenv has been created for this project(PATH_TO_ONE_OF_THE_FUNCTIONS) yet! Aborted!] running command [pipenv --venv]
注:每次重新部署构建时,报错的函数路径都不同,文中已替换为PATH_TO_ONE_OF_THE_FUNCTIONS
未修改后端代码,但不清楚pipenv --venv执行失败的原因。当前使用的amplify.yml配置如下:
version: 1 frontend: phases: preBuild: commands: - npm ci --force build: commands: - npm run build artifacts: baseDirectory: build files: - '**/*' cache: paths: backend: phases: build: commands: - update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.9 - /usr/local/bin/python3.9 -m pip install --upgrade pip - /usr/local/bin/pip3.9 install --user pipenv==2022.4.8 - amplifyPush --simple
本地环境:Mac系统,Amplify CLI最新版(12.1.0),本地执行amplify push无任何错误。
1. 清理Amplify构建缓存
Amplify的构建缓存可能残留旧的后端依赖状态,导致pipenv找不到虚拟环境。直接在Amplify控制台的构建页面,手动触发清理缓存并重新构建,强制重新生成所有后端依赖环境。
2. 修改amplify.yml后端构建命令
当前配置中安装pipenv后直接执行amplifyPush --simple,但Amplify构建环境需要显式为每个Lambda函数创建虚拟环境。更新后端构建命令如下:
backend: phases: build: commands: - update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.9 - /usr/local/bin/python3.9 -m pip install --upgrade pip - /usr/local/bin/pip3.9 install --user pipenv==2022.4.8 # 将pipenv加入系统PATH - export PATH=$PATH:~/.local/bin # 遍历所有Lambda函数目录,初始化pipenv环境 - for func in amplify/backend/function/*; do if [ -f "$func/Pipfile" ]; then cd "$func" && pipenv install --deploy && cd -; fi; done - amplifyPush --simple
这段命令会遍历所有Lambda函数目录,找到存在Pipfile的目录,进入后执行pipenv install --deploy生成虚拟环境,确保pipenv --venv能找到对应环境。
3. 同步本地Pipfile与Pipfile.lock
本地执行amplify push无问题,但可能存在Pipfile和Pipfile.lock不一致的情况,导致Amplify构建环境无法正确生成虚拟环境。在本地每个Lambda函数目录下执行:
pipenv lock --keep-outdated git add Pipfile.lock git commit -m "Fix Pipfile.lock consistency"
之后重新推送代码到仓库,触发Amplify构建。
4. 确认Lambda运行时版本匹配
确保Lambda函数的运行时版本与构建环境指定的Python3.9一致,避免版本不兼容导致pipenv创建虚拟环境失败。可在Amplify控制台的后端函数设置中检查每个Lambda的运行时版本。
内容的提问来源于stack exchange,提问作者pevhv

