AWS Lambda函数之间是否可以共享代码?

6
我正在使用AWS Lambda设计一个无服务器应用程序。其中一个函数上有一段代码,以某种方式处理请求。我将创建另一个函数,以相同的方式对请求数据进行相同的处理。
问题在于,如果我更改其中一个Lambda函数中的处理函数,我将不得不复制该函数并将其粘贴到另一个Lambda函数中。每次更改时都需要这样做。如果我想在超过两个Lambda函数中执行相同的处理函数,则会更加麻烦。
是否有一种方法可以在Lambda函数之间共享代码片段,以便我遵守DRY原则?谢谢。
2个回答

7
现在你可以使用Layers在你的函数之间共享库和代码。
一个Layer上可以基于多个Function。
你可以为Layer创建一个zip文件,方法与为Function创建zip文件大致相同。唯一的区别是所有通用包都会放置在zip文件中的python/lib/python3.7/site-packages目录下,而你的所有代码都会放置在python目录下。
因此,如果你有这样的文件结构:
bundle.zip/
  python/
    common/
      __init__.py
      lib.py

然后从您的Lambda函数代码中,您可以像这样引用它:
from common.lib import ...

2
一种解决方法是使用Terraform来同步您的基础设施和Lambda函数。使用Terraform,您可以按以下方式定义每个Lambda函数:
resource "aws_lambda_function" "func1_lambda" {
    function_name = "func1_lambda"
    handler = "func1"
    runtime = "python2.7"
    filename = "lambda.zip"
    source_code_hash = "${base64sha256(file("lambda.zip"))}"
    role = "${aws_iam_role.lambda_exec_role.arn}"
}

resource "aws_lambda_function" "func2_lambda" {
    function_name = "func2_lambda"
    handler = "func2"
    runtime = "python2.7"
    filename = "lambda.zip"
    source_code_hash = "${base64sha256(file("lambda.zip"))}"
    role = "${aws_iam_role.lambda_exec_role.arn}"
}

在包含lambda.py的zip文件lambda.zip中,您将定义每个lambda函数以及所有lambdas所需的任何公共函数:
def aCommonFunc(input):
    # return something here

def func1(event, context):
    return { "message": aCommonFunc("hello, world") }

def func2(event, context):
    return { "message": aCommonFunc("another string") }

部署新的Lambda函数集合需要编写一个脚本,将Python文件压缩并运行terraform apply

虽然这会增加一些初始工作,但随着项目的发展,它将使您更有效地跟踪和重新创建Lambda函数。

您可以在此处查看完整示例。


1
嗯,与Apex相比,它似乎在设置环境方面增加了很多复杂性,但是由于它还处理其他基础架构组件,如API网关,因此可能是值得的。我会试一试!谢谢! - Mateus Felipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接