AWS Amplify Lamda

这里就写下使用 amplify 生成 lamda 的配置及其他问题。

python lamda 如何共享 python 环境

使用 amplify 生成 lamda,会自动生成一个 python 环境,导致传到云端的代码有很多其他文件夹和代码,如何共享 python 环境?

当你通过 Amplify CLI 创建或更新一个 Python Lambda 函数时,Amplify 会默认在本地为该函数创建(或使用)一个虚拟环境并安装(或打包)其中的依赖包,从而产生一系列与 Python 环境相关的文件和目录。这就与“手动部署”时仅上传一两个 .py 文件形成了差异。

以下是更详细的原因和常见现象:

  1. Amplify CLI 会自动安装依赖

    • 当你在 amplify/backend/function/<yourFunction> 目录里放置了 requirements.txt,或者使用 pip install --target=./src 之类的方式安装依赖,Amplify 在打包部署时会将这些依赖一起打包进去(位于 site-packages 或者与 pip 相关的目录,比如 certifi, distlib, filelock, pip 等)。
    • 这些依赖不仅包括你自己在代码中显式使用的库,也可能包含一些递归安装的依赖(例如 pipsetuptoolsdistlibwheelcertifi 等都可能被顺带打包)。
  2. Amplify 为了确保可用性,可能一并打包了更多“环境”文件

    • 某些情况下,如果 Amplify 检测到了一个 Python 虚拟环境(如 .venvvenv 目录)或者你的函数根目录中已经存在了 __pycache__dist-info 等文件夹,它会把这些文件一起复制打包,以确保 Lambda 在运行时不会缺失依赖。
    • 这就导致看上去“有很多不需要的文件”,但实际上 Amplify 并不太知道哪些包是“多余的”,所以可能打包得比较“粗放”。
  3. 手动部署时只需要上传真正的代码和依赖

    • 当你手动把 Python Lambda 函数打包成一个 .zip(或在 Lambda 控制台上传 .py 文件)时,你可以非常精简地只包含必要的 Python 脚本和依赖,把包大小降到最低。
    • 但 Amplify 出于“一站式”自动化的考虑,默认会保留你本地的依赖安装结构。

如何更精简?

如果你想避免这些多余文件,可以考虑以下做法:

  1. 不要在函数项目目录里直接安装依赖

    • 考虑使用 Lambda Layers 来管理依赖,把通用依赖放到一个 Layer 中,函数本身就只保留纯代码逻辑。
    • 或者在本地先创建一个专门的目录来装依赖,然后在 amplify/backend/function/<yourFunction>/package.json(或对应 Python 的 requirements.txt)中只声明关键依赖,最后把 node_modulessite-packages 整理到 build 流程中精简打包(对于 Python 可以参照 pip install --target 的做法)。
  2. 排除不必要文件

    • 可以在函数目录下添加 .gitignore 或类似 .npmignore / .amplifyignore(Amplify 并没有官方 .amplifyignore,但有一些社区方法)文件,以便在推送时忽略掉诸如 __pycache__.venv.dist-info 等文件夹。
  3. 在 Amplify 的 build 步骤中自定义

    • 如果你有自定义的 build 流程(例如使用 amplify function update -> “Advanced Settings” -> “Override files”生成 build.gradle / package.json / 自定义脚本等),可以在 build 脚本里专门写删除或排除逻辑,避免把系统包一起打包。
  4. 使用外部 CI/CD

    • 如果对包体积和结构非常敏感,也可以绕过 Amplify 的自动打包,使用自己的 CI/CD 管道先将精简的依赖和代码打好包,然后再让 Amplify 只负责更新 Lambda 资源配置(相对复杂,通常针对对包大小要求极高的场景)。

小结

  • 你之所以看到许多 .dist-info__pycache__certifi 等目录,是因为 Amplify 自动把本地 Python 依赖或虚拟环境打包进了 Lambda 函数中。
  • 手动部署只要放必要文件即可,但 Amplify 默认偏向“保守打包”,以确保函数所需依赖都存在。
  • 若想减小打包体积或去除无关依赖,可通过 Lambda Layers排除文件自定义 build 流程 等手段来实现更精细的控制。