我有一个带有Windows .exe
依赖关系的Python脚本,而后者依赖于(闭源)Windows DLL。通过调用Wine,Python脚本在Ubuntu中运行得很好。
是否可以(并且实际)在AWS Lambda上运行它?
准备代码包会涉及什么?
答案 0 :(得分:1)
TL; DR;
有可能吗? 是
实用吗?我尝试的方法不是。更好的方法可能是尝试将酒放入不同的lambda层或自定义执行环境中。
对您有用吗? 这取决于,部署程序包的大小和磁盘空间是限制因素。
我为lambda编译了一个具有最小依赖性的自定义酒,将其压缩,然后将其放到S3上。
然后,我在运行时在lambda中下载了档案,将其提取到/tmp
中,并使用自定义的空酒名前缀运行。
我的测试Windows可执行文件为64位curl.exe。
我从https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html开始尝试amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2
,但是它具有较旧的编译环境,因此无法配置。
借助amzn2-ami-hvm-2.0.20190313-x86_64-gp2
ec2上的AMI t3.2xlarge
,我能够进行配置和编译。这些是我使用的命令,引用了aws-compile和building-wine:
> sudo yum groupinstall "Development Tools"
> mkdir -p ~/wine-dirs/wine-source
> git clone git://source.winehq.org/git/wine.git ~/wine-dirs/wine-source
> cd ~/wine-dirs/wine-source
> ./configure --enable-win64 --without-x --without-freetype --prefix /opt/wine
> make -j8
> sudo mkdir -p /opt/wine
> sudo chown ec2-user.ec2-user /opt/wine/
> make install
> cd /opt/
> tar zcvf ~/wine-64.tar.gz wine/
这只是一个64位版本。它还几乎没有其他可选的Wine依赖项。
在编译时,我从wine构建中删除了许多可选的依赖项,但是它仍然太大。 /tmp
是limited to 500MB。
我删除了包子目录中的文件,包括看起来像可选的lib,直到我将其压缩到300MB左右为止。
我验证了从构建中删除文件后wine仍然可以运行curl.exe
。
我使用默认的bz2选项创建了tar.bz2
的酒和冰壶,最终它的大小约为80MB。压缩和解压缩的文件总共需要大约390MB。
这样,就有足够的空间来下载存档并将其解压缩到lambda内的/tmp
。
> du -h .
290M ./wine/lib64/wine
292M ./wine/lib64
276K ./wine/share/wine
8.0K ./wine/share/applications
288K ./wine/share
5.0M ./wine/curl-7.66.0-win64-mingw/bin
5.0M ./wine/curl-7.66.0-win64-mingw
12M ./wine/bin
308M ./wine
390M .
> ls
wine wine.tar.bz2
wine.tar.bz2
上传到S3 创建一个S3存储桶,并将wine.tar.bz2
文件上传到其中。
使用python 3.7运行时创建一个AWS Lambda。尽管它使用了与上面构建的葡萄酒不同的底层AMI,但它仍然有效。
在lambda执行角色中,授予对S3存储桶的访问权限。
RAM:1024MB
。我之所以选择它,是因为lambda CPU power scales with the memory。
超时:1 min
我需要遵循此question and answer的建议,以更改lambda中的葡萄酒前缀。我还按照建议关闭了显示器。
例如:
handler():
... download from S3 to /tmp, cd to /tmp
subprocess.call(["tar", "-jxvf", "./wine.tar.bz2"])
os.environ['DISPLAY'] = ''
os.environ['WINEARCH'] = 'win64'
os.environ['WINEPREFIX'] = '/tmp/wineprefix'
subprocess.call(["./wine/bin/wine64", "./wine/curl-7.66.0-win64-mingw/bin/curl.exe", "http://www.stackoverflow.com"])
成功!