我是如何 黑掉”AWS Lambda 来运行 Docker 容器的
我是如何“黑掉”AWS Lambda 来运行 Docker 容器的
原文:https://medium.com/hackernoon/how-did-i-hack-aws-lambda-to-run-docker-containers-7184dc47c09b

2012 年 12 月更新: Lambda 现在原生支持 Docker 容器! https://AWS . Amazon . com/blogs/AWS/new-for-AWS-lambda-container-image-support/
Lambda 为什么不开箱出货 Docker?是因为安全考虑吗?何必呢,我们自己来!
Lambda 是无服务器市场的先锋。看下面的图表:
🤔 What happened on Jan 8th?
我知道,这只是搜索活动。但是你可以看到 2015 年提前了多少。
垄断对最终用户没有好处。没有竞争=发展停滞。一年后,Azure 推出了功能绑定和逻辑应用。Google 展示了更简单的依赖管理和漂亮的仪表板。
最近我发现了 Apache OpenWhisk 。这是运行您自己的无服务器平台的开源替代方案。不像其他任何东西,它可以运行你提供的 Docker 图像的功能。
Docker for Serverless?有什么意义?
你可能会问,“为什么要复杂化?为什么是 Docker?无服务器是简单的功能。”。当然,但事实是事情并不总是那么简单。
不再有 **zip**
整个世界都转向了容器,现在 AWS 告诉你把所有代码和依赖项打包到一个 zip 文件中。后退一步。_(ツ)_/
使用 Docker,您可以像多年来使用微服务一样构建功能。
任意二进制
曾经想在你的函数中使用 bcrypt 、 phantom.js 、 ffmpeg 或任何其他二进制文件吗?使用特定版本的 Amazon Linux 启动 EC2 实例,编译二进制文件,将所有内容压缩到 50MB 以下,就可以开始了!
小提示:如果二进制太大,可以在运行时下载到/tmp。网络速度是惊人的,但要小心冷启动开销。
有了 Docker,你可以把它扔进 Dockerfile,让奇迹发生。
用任何语言写作
至于 2017 年 6 月官方支持的有:Node.js,Python,Java (Groovy,Scala),C#。
非正式的: Go , Closure , PHP , Ruby , Haskell , Swift , F# 等等一些。
使用非官方语言很麻烦,类似于编译二进制文件。
有了 Docker,就像FROM brainfuck:latest一样简单。
没有供应商锁定
这是一个普通的 docker 图像,里面有您的代码。当然,有一些自定义逻辑依赖于 FaaS API,但我已经感觉好多了。
有了 Docker,无论你在哪里都没关系。
有多难?
好了,理论到此为止。我希望你能分享我的兴奋。
首先,我需要知道 Lambda 运行在什么样的环境中。我想四处看看,试试看有没有可能在那里运行 docker 守护进程。
在我的实验中,我使用了埃里克·哈蒙德的一个叫做 lambdash 的便利工具。
Did you know Eric is officially AWS Community Hero?
您可以在那里运行任何命令。说真的,看看这个。
于是我开始玩荒谬的命令 a-la sudo apt-get install docker之类的。不出所料。
然后我试着从静态二进制安装 Docker。下载和解包都很顺利,除非我试着启动它。Docker 需要 root 权限来启动一个守护进程😓。当然,在 Lambda 这样有限的环境中,它是不可用的。
那么限制多少呢?
- 128 到 1536 MB 内存(以及相应数量的 CPU)
- 0.1 秒至 300 秒的执行时间
/tmp下 512 MB 可写磁盘空间- 250 MB 的已部署代码和依赖项(但 50 MB 已压缩)
- 没有 ROOT 访问权限
没有须藤。还有可能运行 Docker 吗?
我的大脑回答说“不”,但我的心告诉我“去研究吧,VLAD”。
所以我做了调查。有哪些选择?
- 使用坞站。这个库包装 Docker Remote API,在 Lambda 之外生成任意 Docker 容器
- 忘记这个愚蠢的想法
第一个选项不是真正的“无服务器”。它需要一些真正的服务器运行。所以我打算选择第二档,除非有一天我发现了乌多克。
Only 117 stars on GitHub. This gem deserves more!
没有 root 权限执行 docker 容器。
这太疯狂了。
针说,这个项目结束了我的成功。这些聪明的家伙发现你可以打开 docker 镜像并在一个仿真环境中执行它。干得好。
直奔主题
你可以在 GitHub 上找到所有代码。但在一些免责声明之前:
- udocker 默认使用 PRoot 作为执行引擎。它在 Lambda 中不起作用。
- 幸运的是,有一个开发分支,允许你从 3 个可用的执行引擎中选择一个。
- Lambda 有 512 MB 的磁盘空间。没有巨大的码头图片。
- 每次 Lambda 冷启动都需要下载 udocker 和 docker 镜像(大概每 4 个小时, proof )。这可能需要几秒钟。
装置
在 Lambda 中,唯一允许你写的地方是/tmp。但是默认情况下,udocker 会尝试写入 homedir。我需要改变它的想法。
*export* HOME=/tmp
*export* UDOCKER_DIR=/tmp
*export* UDOCKER_BIN=/tmp
*export* UDOCKER_LIB=/tmp
*export* UDOCKER_CONTAINERS=/tmp
瞧。你家现在在/tmp。想做什么就做什么。
接下来,我们来下载 udocker python 脚本。
$ *cd* /tmp
$ *curl* https://raw.githubusercontent.com/indigo-dc/udocker/udocker-fr/udocker.py > udocker
$ *python* udocker version
如果一切顺利,您将看到如下内容:
Info: creating repo: /tmp
Info: installing from tarball 1.1.0-RC2
Info: downloading: https://owncloud.indigo-datacl...
**udocker 1.1.0-RC2**
我只显示我运行了什么代码。你选择如何运行它。为了简单起见,我使用了lambdash。您可能希望从您为函数编写的 Node.js/Java/Python 代码中生成一个脚本。
设置和运行 Ubuntu
这会将图像从 Docker Hub 下载到您的/tmp。
$ *python* udocker pull ubuntu:17.04
下一步很重要。您需要创建一个容器并设置执行引擎模式。由于 PRoot 在 Lambda 中不工作( bug ,我尝试了第二个选项。

Plenty of options to choose, not sure what all they mean. Help me, linux experts.
$ *python* udocker create --name=ubuntu ubuntu:17.04
$ *python* udocker setup --execmode=F1 ubuntu
最后,屏住呼吸跑起来。
$ *python* udocker run --nosysdirs ubuntu cat /etc/lsb-releaseDISTRIB_ID=Ubuntu
DISTRIB_RELEASE=17.04
DISTRIB_CODENAME=zesty
**DISTRIB_DESCRIPTION="Ubuntu 17.04"**
仅此而已。这是一个小的概念证明。但是你明白了。去尝试一下图片,然后在下面的评论中告诉我你的想法。
这不是个好主意。但是建造它很有趣
真是让人头疼。每 4 小时下载一次带有 docker 镜像的 udocker。牺牲启动时间。堵塞你的/tmp 高达 100%等等。(不再是了,阅读下面的 UPD)。
但是如果你有一个特定的用例,这是可能的。谁知道呢,也许这篇文章会促进 AWS 对本地 Docker 的支持(#awswishlist 我在看着你)。
我相信这将激励社区建立下一个疯狂的想法。就像这些人激励我一样:
无服务器有服务器的最终证明?
medium.com](/clog/ssh-ing-into-your-aws-lambda-functions-c940cebf7646) [## 如何让无头 Chrome 在 AWS Lambda 上运行
让 Chrome(阅读:Chrome)从编译到在 AWS Lambda 上部署“无服务器”运行的冒险。
medium.com](/@marco.luethy/running-headless-chrome-on-aws-lambda-fa82ad33a9eb)
附言,感谢您的阅读。点击💚如果您想要更多,请订阅;)
P.P.S. UPD:在这篇文章发表前一个月,german moltó已经开发了一个框架来实现在 Lambda 运行 Docker 的类似想法!
满足SCAR——无服务器容器感知架构!
scar -无服务器容器感知架构(例如 AWS Lambda 中的 Docker 容器)
github.com](https://github.com/grycap/scar) 





