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

时间:2017-02-02 22:37:28

标签: aws-lambda wine

我有一个带有Windows .exe依赖关系的Python脚本,而后者依赖于(闭源)Windows DLL。通过调用Wine,Python脚本在Ubuntu中运行得很好。

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

准备代码包会涉及什么?

1 个答案:

答案 0 :(得分:1)

TL; DR;

有可能吗?

实用吗?我尝试的方法不是。更好的方法可能是尝试将酒放入不同的lambda层或自定义执行环境中。

对您有用吗? 这取决于,部署程序包的大小和磁盘空间是限制因素。


我为lambda编译了一个具有最小依赖性的自定义酒,将其压缩,然后将其放到S3上。

然后,我在运行时在lambda中下载了档案,将其提取到/tmp中,并使用自定义的空酒名前缀运行。

我的测试Windows可执行文件为64位curl.exe

1。为Lambda编译葡萄酒

我从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构建中删除了许多可选的依赖项,但是它仍然太大。 /tmplimited to 500MB

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

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

3。压缩

我使用默认的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

4。将wine.tar.bz2上传到S3

创建一个S3存储桶,并将wine.tar.bz2文件上传到其中。

5。创建Lambda

使用python 3.7运行时创建一个AWS Lambda。尽管它使用了与上面构建的葡萄酒不同的底层AMI,但它仍然有效。

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

RAM:1024MB。我之所以选择它,是因为lambda CPU power scales with the memory

超时:1 min

6。 Lambda代码:

我需要遵循此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"])

successful execution of wine in lambda

成功!