AWS Lambda 层是否可以在函数/处理程序不调用该层的情况下拦截 Lambda 函数处理程序?

Can an AWS Lambda Layer intercept a Lambda Function Handler, without the Function / Handler invoking the layer?

我正在研究 AWS Lambda 层的能力,并试图确认层是否可以在 Lambda 函数不了解层/与层交互的情况下添加行为。

我对文档的理解是,层实际上是一个解压缩到 Lambda 实例的 .zip 文件,主要用于交付资源,而不需要将这些资源直接与 Lambda 函数/处理程序一起打包。例如,使用 Layers 部署运行时(可执行文件)或共享资源(例如二进制依赖项)有详细记录——在这两种情况下,Function 本身调用或引用 Layer 内容。

我的问题是,一个完全独立的层是否可以添加行为 to/around Lambda 函数。例如,假设我想要一个简单地回应“Hello World”的新层——是否可以将一个层部署到一个现有的函数中,而该函数没有对该层的任何引用?

查看 Lambda API Extensions. These give a way to do something like what you describe, and they are deployed as layers, but it is the extension aspect that allows to interact differently than dependency code in a typical layer. Also see https://aws.amazon.com/blogs/compute/introducing-aws-lambda-extensions-in-preview/

不是扩展的层本质上不是这样工作的。这是一个常见的编码概念,尤其是在 Web 环境中,拥有一个模块管道,这些模块可以与传入的请求进行交互,并且可以修改请求甚至在它到达核心代码之前终止它,但这不是层通常的工作方式.

相反,层用于核心代码中的运行时依赖项。它们只是因为核心代码 imports/references 中的某些内容才发挥作用。没有这样的引用,代码就放在那里未被使用。

名称“层”可能会给人一种错误的印象,即这些是包装核心代码的代码模块,或者流在到达代码 lambda 函数代码之前经过这些层,但实际上是扩展方面会给他们你所要求的能力。

AWS Lambda execution environment 提供了有用的视觉效果:

另见

经过进一步研究,我发现 Lambda 层确实可以修改 Lambda 函数的行为,而函数与层的资源没有任何交互。

Layer能够拦截runtime的调用,AWS提供的runtime也提供了一些环境变量,可以设置为提供一些“hooks”。这些能力在 AWS 的文档 Modifying the runtime environment.

中进行了描述

虽然这是可能的,但 提供了更强大的功能。截至目前,扩展程序处于预览状态,但值得考虑探索。