docker 将AWS Lambda函数转换为容器

ezykj2lf  于 2023-05-22  发布在  Docker
关注(0)|答案(2)|浏览(129)

我目前有一堆AWS Lambda函数,并希望将它们分别旋转到容器(最好是Docker)中,以与当前的CICD管道集成。在Fargate等Amazon服务中启动这些容器是完全可以的--重要的是它必须在容器中启动。我找到的最接近的东西是亚马逊的this repo,它可以将图像转换为Lambdas,尽管这与我正在寻找的相反。
这个任务可能吗?如果可能,最好的方法是什么?

r55awzrz

r55awzrz1#

在幕后,Lambda“函数”是一个Python脚本,它侦听调用事件并调用实际的处理程序函数。这意味着你可以很容易地使用标准的Python“脚本”代码调用函数:

if __name__ == "__main__":
    args = # this is the tricky part
    ctx  = # some dict that looks like what Lambda expects
    handler(args, ctx)

这两个参数只是命令,所以如果你可以用看起来正确的东西来填充它们,那么你可以将整个东西 Package 在一个容器中,并将其部署到ECS或Batch,或者你自己的Docker守护进程。
问题是你如何填充它们,这取决于你的lambda函数做了什么--你没有说--以及它们是如何被调用的--你也没有说。
您可以使用命令行参数。例如,如果你的lambda是为了响应一个S3 PutObject操作,那么你真正需要的就是bucket和key的名字。在此基础上,您可以轻松地创建一个虚拟S3 invocation event,对所有其他字段使用假值。
如果您调用Lambda来响应SQS消息,则会更容易:您的“主”处理程序进入一个循环,该循环轮询SQS,并重新格式化它从队列中取出的消息。
其他事件源将更加困难。对所有调用使用SQS,并简单地将完整格式的事件消息传递到队列中,这可能是有意义的(取决于您这样做的原因)。

hts6caw3

hts6caw32#

我创建了这个项目,它生成了一个Dockerfile,并从lambda函数中关联了artefact:https://github.com/paololazzari/lambda2docker
目前它只支持Python,但也将致力于添加对其他运行时的支持。
下面是一个例子。
假设我们已经部署了这个Python函数:

# lambda_function.py
import requests
def lambda_handler(event, context):
    print("Hello from lambda")

在包含requests的层旁边。
生成Dockerfile:

$ lambda2docker --lambda-name my-lambda-function --region us-east-1 --flavor alpine
Dockerfile generated in output directory /tmp/tmpnl30z9us

让我们看看生成了什么:

$ tree /tmp/tmpnl30z9us
/tmp/tmpnl30z9us
├── Dockerfile
├── src
│   ├── lambda_function.py
│   └── requirements.txt
└── wrapper_entrypoint.py

1 directory, 4 files

$ cat /tmp/tmpnl30z9us/Dockerfile
FROM python:3.8-alpine
WORKDIR /data
ADD src src
ADD wrapper_entrypoint.py wrapper_entrypoint.py
RUN pip install -r src/requirements.txt
ENTRYPOINT ["python3"]

$ cat /tmp/tmpnl30z9us/src/requirements.txt
requests==2.30.0

这个Dockerfile是可构建的:

$ pushd /tmp/tmpnl30z9us
$ docker build -t my-lambda-container .
$ popd

相关问题