AWS python lambda - 在 lambda 中导入模块与从本地项目导入模块的区别

AWS python lambda - difference in importing module in lambda than from local project

我在 AWS lambda 中导入通用函数实用程序文件时遇到问题。这是一个 python 文件,文件夹结构如下所示

(functions folder)
   common_util.py
   (lambda 1 folder)
      lambda1
   (lambda 2 folder)
      lambda2

我需要从这两个 lambda 访问 common_util。当我在本地 运行 我的 CDK 项目时,这很容易,我在导入语句中使用类似 .. 的东西来告诉文件它是一个目录

from ..common_util import (...)

当我作为 lambda 部署到 AWS(我打包了以上所有内容)时,我需要指定没有 .. 的导入,因为这是 lambda

的根文件夹
from common_util import(...)

我需要一个适用于我的 CDK 项目和 lambda 的导入语句或解决方案。

这里是创建 lambda 的 CDK

const noteIntegrationLambda = new Function(this as any,"my-lambda",
      {
        functionName:
          "my-lambda",
        runtime: StackConfiguration.PYTHON_VERSION,
        handler:
          "my_lambda.execute",
        timeout: Duration.seconds(15),
        code: Code.fromAsset("functions/"),
        role,
        layers: [dependencyLayer],
        environment: env,

        },
      }
    );

Lambda layers provide an ideal mechanism to include in solving this problem. As mentioned in https://medium.com/@manojf/sharing-code-among-lambdas-using-lambda-layers-ca097c8cd500,

Lambda layers allow us to share code among lambda functions. We just have to upload the layer once and reference it in any lambda function.

因此请考虑通过层部署您的通用代码。也就是说,为了构建您的代码,我建议您使用 pip install 创建一个在本地安装的通用包,如 中所述。然后将该包放入两个 lambda 引用的层中。这完全解决了当您的本地文件结构与 lambda 文件结构不同时如何构建代码的问题。

还要考虑这些资源:

  • Import a python module in multiple AWS Lambdas
  • What is the proper way to work with shared modules in Python development?
  • https://realpython.com/absolute-vs-relative-python-imports/
  • Python: sharing common code among a family of scripts
  • Installing Python packages from local file system folder to virtualenv with pip

作为图层示例,假设您想要包含一个“common_utils”库供您的 lambda 引用。要创建一个层,您需要创建一个包含该代码的目录结构,然后压缩整个目录。可能如下:

/python
    /common_utils
        __init__.py
        common_util.py
        ...

压缩后,zip 文件必须有“python”文件夹,您可以在其中放置代码。如果您这样做并将您的公共代码安装为一个包,您可以使用相同的导入将它导入您的本地代码和您的 lambdas。

我所做的是使用 pip install 安装到某个文件位置——然后我将这个位置压缩到一个层中。例如,如果我想为 pymysql 库创建一个层,我可能会这样做

pip install --target=c:\myLayers\python pymysql

这会将库文件安装到我指定的位置,这样就很容易知道要压缩什么(只需创建一个包含“python”目录的 zip)。

我知道这个问题很老了,但我 运行 遇到了类似的问题。我的解决方案是使用 os 包检测当前环境是本地环境还是 lambda,然后根据环境(本地或云)导入不同的环境。留在这里作为参考。

if os.environ.get("AWS_EXECUTION_ENV") is not None:
    # For use in lambda function
    from package_a import class_a
else:
    # For local use
    from ...package_a import class_a

感谢: