GitHub Actions部署Python Lambda时Serverless的pythonBin正确配置
你之前所有配置尝试都失效的本质原因是:serverless/github-action@master 步骤运行在独立的Docker容器内,和之前通过actions/setup-python配置的Python环境完全隔离。
你在依赖安装步骤里查到的/opt/hostedtoolcache/Python/3.6.13/x64/bin/python3.6是GitHub runner主机的文件系统路径,容器内部无法直接访问这个路径,哪怕你在serverless.yml里写死这个地址,容器里也找不到对应的二进制文件,自然会抛出“python3.6 not found”的报错。
1. 调整serverless.yml的配置层级
你之前把pythonRequirements的配置嵌到了wsgi节点下方,属于配置层级错误。serverless-python-requirements插件的pythonBin参数归属在custom.pythonRequirements层级下,需要和wsgi节点平级。
修正后的核心配置参考:
plugins: - serverless-wsgi - serverless-python-requirements custom: wsgi: app: app.app packRequirements: false # 与wsgi平级,不要嵌在wsgi内部 pythonRequirements: pythonBin: python3 dockerizePip: non-linux
注意保留
wsgi.packRequirements: false的配置,避免wsgi插件和python-requirements插件重复打包依赖,产生冲突。
2. 适配GitHub Actions的执行环境
两种可落地的部署方案,任选其一即可:
方案一:直接在runner主机执行Serverless(推荐)
移除serverless/github-action这个独立容器步骤,在已经配置好Python3.6的runner环境中直接全局安装Serverless CLI执行部署:
# 替换原来的Serverless action步骤 - name: 安装Serverless CLI run: npm install -g serverless - name: 执行Lambda部署 run: serverless deploy
这种方式下整个部署流程和之前的Python环境处于同一个文件系统,不存在路径隔离问题,之前setup-python配置的Python路径可以被Serverless直接识别。
方案二:保留Serverless的Docker Action,打通容器路径映射
如果需要继续使用serverless/github-action,需要把主机的Python路径注入容器的PATH环境变量,让容器可以访问到主机上的Python二进制:
- name: Serverless uses: serverless/github-action@master with: args: deploy env: # 把主机上已配置好的Python路径加入容器的全局PATH PATH: /opt/hostedtoolcache/Python/3.6.13/x64/bin:$PATH
这种方式下不需要在serverless.yml里写死复杂的Python绝对路径,直接用python3作为pythonBin的配置值即可正常识别。
3. 优化配置的稳定性
- AWS Lambda目前已停止对python3.6运行时的支持,建议将
provider.runtime调整为python3.9或更高的受支持版本,同步修改工作流中actions/setup-python的对应版本,避免部署后遇到运行时下线的问题。 - 不要硬编码Python的小版本缓存路径(比如写死3.6.13的具体路径),GitHub托管的runner的工具缓存路径可能会随版本迭代发生变化,通过PATH映射的方式配置会更稳定。
内容的提问来源于stack exchange,提问作者user2045508

