我目前有一堆AWS Lambda函数,并希望将它们分别旋转到容器(最好是Docker)中,以与当前的CICD管道集成。在Fargate等Amazon服务中启动这些容器是完全可以的--重要的是它必须在容器中启动。我找到的最接近的东西是亚马逊的this repo,它可以将图像转换为Lambdas,尽管这与我正在寻找的相反。这个任务可能吗?如果可能,最好的方法是什么?
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,并简单地将完整格式的事件消息传递到队列中,这可能是有意义的(取决于您这样做的原因)。
PutObject
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:
requests
$ 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
2条答案
按热度按时间r55awzrz1#
在幕后,Lambda“函数”是一个Python脚本,它侦听调用事件并调用实际的处理程序函数。这意味着你可以很容易地使用标准的Python“脚本”代码调用函数:
这两个参数只是命令,所以如果你可以用看起来正确的东西来填充它们,那么你可以将整个东西 Package 在一个容器中,并将其部署到ECS或Batch,或者你自己的Docker守护进程。
问题是你如何填充它们,这取决于你的lambda函数做了什么--你没有说--以及它们是如何被调用的--你也没有说。
您可以使用命令行参数。例如,如果你的lambda是为了响应一个S3
PutObject
操作,那么你真正需要的就是bucket和key的名字。在此基础上,您可以轻松地创建一个虚拟S3 invocation event,对所有其他字段使用假值。如果您调用Lambda来响应SQS消息,则会更容易:您的“主”处理程序进入一个循环,该循环轮询SQS,并重新格式化它从队列中取出的消息。
其他事件源将更加困难。对所有调用使用SQS,并简单地将完整格式的事件消息传递到队列中,这可能是有意义的(取决于您这样做的原因)。
hts6caw32#
我创建了这个项目,它生成了一个Dockerfile,并从lambda函数中关联了artefact:https://github.com/paololazzari/lambda2docker
目前它只支持Python,但也将致力于添加对其他运行时的支持。
下面是一个例子。
假设我们已经部署了这个Python函数:
在包含
requests
的层旁边。生成Dockerfile:
让我们看看生成了什么:
这个Dockerfile是可构建的: