从Lambda容器中的python中访问S3事件通知



作为一名云开发人员,我目前正在开发包括AWS S3和Lambda服务的AWS架构。

我的目标是能够从Lambda容器中的python函数捕获S3通知事件

工作流程如下:

  1. 文件被丢弃在bucket-A
  2. 它触发使用存储在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中定义它

如果您需要有关我如何解决此的更多信息,请随时发表评论

最新更新