Python 为AWS Lambda部署压缩虚拟环境时,我可以省去什么? 介绍

Python 为AWS Lambda部署压缩虚拟环境时,我可以省去什么? 介绍,python,amazon-web-services,amazon-ec2,virtualenv,aws-lambda,Python,Amazon Web Services,Amazon Ec2,Virtualenv,Aws Lambda,我刚开始使用AWS Lambda,虽然我讨厌它,但我非常喜欢它。我已经创建了虚拟环境包并发送到S3。在我发现这需要一个#GRRR后,我开始思考如何进一步改进我的包装过程 上下文 这就是新的Amazon Linux AMI EC2实例上的新VirtualNV的样子 $ uname -srvm Linux 4.4.51-40.58.amzn1.x86_64 #1 SMP Tue Feb 28 21:57:17 UTC 2017 x86_64 $ cat /etc/system-release Am

我刚开始使用AWS Lambda,虽然我讨厌它,但我非常喜欢它。我已经创建了虚拟环境包并发送到S3。在我发现这需要一个#GRRR后,我开始思考如何进一步改进我的包装过程

上下文 这就是新的Amazon Linux AMI EC2实例上的新VirtualNV的样子

$ uname -srvm
Linux 4.4.51-40.58.amzn1.x86_64 #1 SMP Tue Feb 28 21:57:17 UTC 2017 x86_64

$ cat /etc/system-release
Amazon Linux AMI release 2016.09

$ virtualenv --version
15.1.0

$ pip --version
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)

$ virtualenv temp
New python executable in /home/ec2-user/temp/bin/python2.7
Also creating executable in /home/ec2-user/temp/bin/python
Installing setuptools, pip, wheel...done.
图1

图2

我发现为了进行我需要的python开发(使用paramiko),我必须做以下准备(在图1和图2之前):

图3

问题: 在图2中的那些站点包中,我可以从发送给AWS的zip中省略哪些

为了便于比较,这就是我的整个项目的virtualenv所包含的内容(我pip安装的唯一东西是paramiko):


这对我很有用,请尝试一下:

$ mkdir paramiko-lambda && cd paramiko-lambda
$ virtualenv env --python=python2.7 && source env/bin/activate
$ pip freeze > pre_paramiko.txt
$ pip install paramiko
$ pip freeze > post_paramiko.txt
然后,我将以下内容放入脚本中,以确保它在本地工作:

from __future__ import print_function
import paramiko


def handler(event, context):
    print(paramiko.__version__)
    ssh_client = paramiko.SSHClient()

if __name__ == '__main__':
    handler(event=None, context=None)
最后两行是可选的,只是本地测试脚本的一种简单方法。为了查看与paramiko一起安装的内容,我比较了两个文本文件:

$ diff -u pre_paramiko.txt post_paramiko.txt
--- pre_paramiko.txt
+++ post_paramiko.txt
@@ -1,4 +1,13 @@
 appdirs==1.4.3
+asn1crypto==0.22.0
+cffi==1.10.0
+cryptography==1.8.1
+enum34==1.1.6
+idna==2.5
+ipaddress==1.0.18
 packaging==16.8
+paramiko==2.1.2
+pyasn1==0.2.3
+pycparser==2.17
 pyparsing==2.2.0
 six==1.10.0
带有
+
的模块是与
paramiko
一起安装的,因此必须包含在上载到AWS Lambda的.zip存档中。编写一个
bash
脚本很容易,它接受
diff
命令的输出并自动创建.zip归档文件,但我将手动输入它们

$ cd env/lib/python2.7/site-packages
$ zip -x "*.pyc" -r ../../../../paramiko_lambda.zip packaging asn1crypto cffi cryptography enum idna ipaddress paramiko pyasn1 pycparser
$ cd ../../../../
$ zip -r paramiko_lambda.zip paramiko_lambda.py

我需要添加
packaging
文件夹,可能是因为
print(paramiko.\uuuu version.\uuuuuu)
的缘故,所以可能没有必要。
paramiko_lambda.zip
文件是2.5 MB,虽然不是很大,但有很多不必要的数据,特别是
*.pyc
文件。排除
*.pyc
文件将文件减少到1.5 MB。

这是一个好主意。一旦我有机会回到项目中,我会尝试一下。你知道包含
*.pyc
文件是否有任何性能优势吗?可能在冷启动时?如果lambda函数在一定时间内保持空闲,AWS将删除该容器。当AWS创建容器时,第一次执行它会有一个延迟。后续执行会更快,但这只是因为容器正在内存中运行。有关lambda函数性能的更多信息,以及.pyc不比.py快的原因,请参阅。这需要显式枚举要包含的文件,而不是应该排除的文件,因为每次添加新依赖项时,都需要修改shell脚本。是的,好问题,因为virtualenv是一个巨大的怪物——所有的膨胀(今天最低2200万)相当于AWS Lambda的成本。
from __future__ import print_function
import paramiko


def handler(event, context):
    print(paramiko.__version__)
    ssh_client = paramiko.SSHClient()

if __name__ == '__main__':
    handler(event=None, context=None)
$ diff -u pre_paramiko.txt post_paramiko.txt
--- pre_paramiko.txt
+++ post_paramiko.txt
@@ -1,4 +1,13 @@
 appdirs==1.4.3
+asn1crypto==0.22.0
+cffi==1.10.0
+cryptography==1.8.1
+enum34==1.1.6
+idna==2.5
+ipaddress==1.0.18
 packaging==16.8
+paramiko==2.1.2
+pyasn1==0.2.3
+pycparser==2.17
 pyparsing==2.2.0
 six==1.10.0
$ cd env/lib/python2.7/site-packages
$ zip -x "*.pyc" -r ../../../../paramiko_lambda.zip packaging asn1crypto cffi cryptography enum idna ipaddress paramiko pyasn1 pycparser
$ cd ../../../../
$ zip -r paramiko_lambda.zip paramiko_lambda.py