AWS Lambda的conda环境

Roy*_*lTS 27 python amazon-web-services conda aws-lambda

我想建立一个我在AWS Lambda上编写的Python函数,这个函数依赖于我在conda环境中收集的一堆Python库.

要在Lambda上进行设置,我应该将此环境压缩,但Lambda文档仅提供有关如何使用pip/VirtualEnv执行此操作的说明.有任何人对此有经验吗?

DrE*_*elb 10

您应该将无服务器框架serverless-python-requirements插件结合使用.您只需要一个requirements.txt,插件会自动将您的代码和依赖项打包到一个zip文件中,将所有内容上传到s3并部署您的功能.额外:因为它可以做到这个dockerized,它也能够帮助你处理需要二进制依赖的包.

请查看(https://serverless.com/blog/serverless-python-packaging/)以获取操作方法.

根据经验,我强烈建议你研究一下.用于部署的每一点手工劳动都可以阻止您开发逻辑.

编辑2017-12-17:

你的意见是有道理的@ eelco-hoogendoorn.

但是,在我看来,conda环境只是一个封装的地方,其中包含一堆python包.那么,如果您将所有这些依赖项(来自您的conda env)放入requirements.txt(并使用无服务器+插件)来解决您的问题,不是吗?
恕我直言,它基本上与将您在env中安装的所有软件包压缩到部署包中相同.话虽这么说,这是一个片段,基本上这样做:

conda env export --name Name_of_your_Conda_env | yq -r '.dependencies[] | .. | select(type == "string")' | sed -E "s/(^[^=]*)(=+)([0-9.]+)(=.*|$)/\1==\3/" > requirements.txt
Run Code Online (Sandbox Code Playgroud)

不幸的是,conda env export只能以yaml格式导出环境.该--json标志现在不起作用,但应该在下一个版本中修复.这就是为什么我不得不使用yq 而不是 jq.你可以yq使用安装pip install yq.它只是一个包装器jq,允许它也可以使用yaml文件.

记住

Lambda部署代码的大小只能为50MB.你的环境不应该太大.

我没有尝试使用serverless+ serverless-python-packaging和一个requirements.txt像这样创建的lambda部署,我不知道它是否会起作用.

  • 我喜欢无服务器,但它不能解决我关于 conda 的问题 (2认同)

new*_*ver 5

为什么我使用的最主要的原因conda是没有编制不同的二进制包自己(就像一个选项numpymatplotlibpyqt等)或编译它们不那么频繁。当您确实需要为特定版本的python(如uwsgi)编译某些东西时,您应该使用与您的环境中编译的gcc版本相同的版本来编译二进制文件- 很可能它与您的操作系统正在使用的不同,因为是现在使用应安装的最新版本。pythoncondagcccondagccconda install gxx_linux-64

这导致我们出现两种情况:

  1. 您所有的依赖项都在纯 python 中,您实际上可以使用它们保存一个列表,pip freeze并按照virtualenv.

  2. 你有一些二进制扩展。在这种情况下,您的 conda 环境中的二进制文件将无法与 AWS lambda 使用的 Python 一起使用。不幸的是,您需要访问描述执行环境的页面(AMI:amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2),设置环境,为特定版本的内置python构建二进制文件单独的目录(以及纯 python 包),然后将它们捆绑到一个 zip 存档中。

这是您问题的一般答案,但主要思想是您不能重用二进制包,只能重用它们的列表。


Rob*_*xal 2

我想不出压缩 conda 环境不起作用的充分理由。

我认为您可以进入您的anaconda2/envs/anaconda3/envs/目录并复制/压缩您要上传的 env 目录。Conda 只是 virtualenv 的增强版本,加上一个不同的且有些可选的包管理器。我认为可以的主要原因是 conda 环境.../anaconda[2|3]/envs/$VIRTUAL_ENV_DIR/默认将所有依赖项封装在其特定目录中。

使用普通的 virtualenv 表达式可以给你更多的自由,就像穴居人比现代人有更多的自由一样。我个人更喜欢汽车。使用 virtualenv,你基本上会得到一个半空$PYTHON_PATH变量,你可以用你想要的任何东西填充它,而不是 Conda 吐出的更强大的、预先填充的环境。以下是一个很好的参考表:https ://conda.io/docs/commands.html#conda-vs-pip-vs-virtualenv-commands

Conda 将命令~$ /path/to/$VIRTUAL_ENV_ROOT_DIR/bin/activate变成~$ source activate $VIRTUAL_ENV_NAME

假设您想采用virtualenv老式方式。您可以选择一个目录(我们称之为$VIRTUAL_ENV_ROOT_DIR,)和名称(我们称之为$VIRTUAL_ENV_NAME)。此时您可以输入:

~$ cd $VIRTUAL_ENV_ROOT_DIR && virtualenv $VIRTUAL_ENV_NAME
Run Code Online (Sandbox Code Playgroud)

然后 python 创建它自己的解释器库的副本(我认为加上 pip 和 setuptools)并activate在此克隆的bin/目录中放置一个名为的可执行文件。该$VIRTUAL_ENV_ROOT_DIR/bin/activate脚本通过更改当前的$PYTHONPATH环境变量来工作,该变量决定了当您在 shell 中键入内容时调用的 python 解释器~$ python,以及包含解释器在被告知某些内容时将看到的所有模块的目录列表import。这是您#!/usr/bin/env python在人们的代码而不是/usr/bin/python.

  • 这里的信息内容丰富且相关,但没有涉及用户询问的 AWS 方面。 (3认同)
  • 压缩整个环境可能会起作用,但这不是一个好主意,因为它包含完整的 python 安装。 (3认同)
  • 我来到这里是因为我对 Lambda 有同样的问题,但这并没有完全解决问题。使用 Lambda 时需要的主要细节是,“conda”和“virtualenv”之间的文件结构有何不同?是否需要整个 `conda` env 目录?为什么?用于 Lambda 部署的打包“virtualenv”是源代码的 zip,其中“site-packages”和“dist-packages”内容位于源根目录中,以便在 python 路径上发现它们。 (2认同)