AWS Lambda 是否可以通过 Wine 运行 Windows 二进制文件?

问题描述 投票:0回答:1

我有一个带有 Windows

.exe
依赖项的 Python 脚本,而该脚本又依赖于(闭源)Windows DLL。 Python 脚本通过调用 Wine 在 Ubuntu 中运行得很好。

在 AWS Lambda 上运行它是否可能(并且实用)?

准备代码包需要做什么?

aws-lambda wine
1个回答
7
投票

更新:lambda 容器镜像功能支持最大 10GB 的镜像。我还没有尝试过,但我认为这将是一种可行的方法,并且不需要我在下面所做的修改来减少 wine 构建的大小。

TL;博士;

有可能吗?是的。

实用吗?我尝试过的方法

不是。更好的方法可能是尝试将 wine 放入不同的 lambda 层或自定义执行环境中。

它对你有用吗?这取决于部署包大小和磁盘空间是限制因素。


将 wine 融入常规 lambda 环境的旧的、有点 hacky 的方法:

我编译了一个对 lambda 具有最小依赖性的自定义 wine,对其进行压缩,然后将其放入 S3 上。

然后,在运行时的 lambda 中,我下载了存档,将其解压到

/tmp

 并使用自定义的空 wine 前缀运行它。

我的测试 Windows 可执行文件是 64 位

curl.exe

1.为 Lambda 编译 Wine

来自

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-compilebuilding-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 构建的大小

我在编译时从 wine 构建中删除了很多可选依赖项,但它仍然太大。

/tmp

 
限制为 500MB

我删除了包子目录中的文件,包括看起来像可选库的文件,直到我将其压缩到大约 300MB 左右。

我验证了从构建中删除文件后,wine 仍然可以运行

curl.exe

3.压缩一下

我用默认的 bz2 选项创建了一个

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

创建 S3 存储桶并将

wine.tar.bz2

 文件上传到其中。

5.创建 Lambda

使用 python 3.7 运行时创建 AWS Lambda。虽然这使用了与上面构建 wine 不同的底层 AMI,但它仍然有效。

在 lambda 执行角色中,授予对 S3 存储桶的访问权限。

内存:

1024MB

。我选择这个是因为 lambda CPU 
功率随内存扩展

超时:

1 min


6.拉姆达代码:

我需要遵循此

问题和答案的建议来更改 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"])

成功!

© www.soinside.com 2019 - 2024. All rights reserved.