我有一个带有 Windows
.exe
依赖项的 Python 脚本,而该脚本又依赖于(闭源)Windows DLL。 Python 脚本通过调用 Wine 在 Ubuntu 中运行得很好。
在 AWS Lambda 上运行它是否可能(并且实用)?
准备代码包需要做什么?
更新:lambda 容器镜像功能支持最大 10GB 的镜像。我还没有尝试过,但我认为这将是一种可行的方法,并且不需要我在下面所做的修改来减少 wine 构建的大小。
有可能吗?是的。
实用吗?我尝试过的方法
不是。更好的方法可能是尝试将 wine 放入不同的 lambda 层或自定义执行环境中。
它对你有用吗?这取决于部署包大小和磁盘空间是限制因素。
我编译了一个对 lambda 具有最小依赖性的自定义 wine,对其进行压缩,然后将其放入 S3 上。
然后,在运行时的 lambda 中,我下载了存档,将其解压到
/tmp
并使用自定义的空 wine 前缀运行它。我的测试 Windows 可执行文件是 64 位
curl.exe。
1.为 Lambda 编译 Winehttps://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 依赖项。2.进一步减小 Wine 构建的大小
/tmp
限制为 500MB。 我删除了包子目录中的文件,包括看起来像可选库的文件,直到我将其压缩到大约 300MB 左右。
我验证了从构建中删除文件后,wine 仍然可以运行
curl.exe
。3.压缩一下
tar.bz2
的 wine 和curl,它最终大约有 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
4.上传wine.tar.bz2
到S3
wine.tar.bz2
文件上传到其中。5.创建 Lambda
在 lambda 执行角色中,授予对 S3 存储桶的访问权限。
内存:
1024MB
。我选择这个是因为 lambda CPU功率随内存扩展。 超时:
1 min
问题和答案的建议来更改 lambda 内的 wine 前缀。我还按照建议关闭了显示器。
例如:
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"])
成功!