作为一名云开发人员,我目前正在开发包括AWS S3和Lambda服务的AWS架构。
我的目标是能够从Lambda容器中的python函数捕获S3通知事件
工作流程如下:
- 文件被丢弃在
bucket-A
中 - 它触发使用存储在ECR(AWS容器注册表(中的容器映像构建的Lambda
通常,对于经典lambda函数,您定义为处理程序的内容必须原型化为def lambda_handler(event, context);
,才能正确接收S3事件通知。
在这里的例子中,我们可以看到使用
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]
其中app
是文件名(app.py(,handler
这个文件中的函数可以让我们访问代码。注意:app.py位于Dockerfile中WORKDIR
定义的工作目录中
目录结构(EDIT(
route_serializer.py
是需要从Dockerfile访问的python文件。它包含一个名为lambda_handler的函数,该函数将处理S3通知并处理新到达的文件。这是运行Lambda时容器中存在的确切结构。
project/
├── aws/
│ ├── __init__.py
│ ├── lambdas/
│ │ ├── batchDisaggregator/
│ │ │ ├── __init__.py
│ │ │ └── route_serializer.py <-- contains lambda_handler(evt,ctx);
│ │ └── __init__.py
我尝试了什么
- 将嵌套文件夹中的
__init__.py
设置为route_serializer,使其可用于python可执行文件 - 在PATH环境变量中添加
path/to/pythonfile
所以我想知道是否有一种方法可以从Lambda中可用的CMD
覆盖中调用处理程序函数(def lambda_handler(event, context);
(,并在事件函数参数中捕获S3通知。
好吧,我自己想好了。对于每个有相同问题的人,这里有一些线索可能会帮助你以及
就我而言,我错过了两件事:
-
我用于运行容器的基于自定义的映像具有awslambdaric包,使其符合lambda。但我需要使用以下
CMD
:/path/to/python -m awslambdaric batchDisaggregator.route_serializer
来运行我的函数,以允许运行时接口调用我的函数。 -
函数代码和所有依赖项应存储在
LAMBDA_TASK_ROOT
环境变量中指定的路径下。您可以使用ENV LAMBDA_TASK_ROOT=/var/task
在Dockerfile中定义它
如果您需要有关我如何解决此的更多信息,请随时发表评论