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

问题描述

在将通用函数util文件导入AWS lambda时遇到问题。这是一个python文件文件夹结构看起来像这样

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

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

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提供了一种理想的机制来解决此问题。如https://medium.com/@manojf/sharing-code-among-lambdas-using-lambda-layers-ca097c8cd500中所述,

Lambda层允许我们在lambda函数之间共享代码。我们刚刚 必须上传一次该图层并在任何lambda函数中引用它。

因此,请考虑通过一层部署通用代码。也就是说,要构建代码,建议您创建一个通用软件包,该软件包使用pip install在本地安装,如Python how to share package between multiple projects所述。然后,将该包放入两个lambda引用的层。完全解决了本地文件结构与lambda文件结构不同时如何构造代码的问题。

还要考虑以下资源:

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

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

压缩后,该zip文件必须具有“ python”文件夹,并且在其中放置了代码。如果这样做并且还以软件包的形式安装了通用代码,则可以使用相同的导入方式将其导入本地代码和lambda中。

我要做的是使用pip install安装到某个文件位置-然后将其压缩到一个位置。例如,如果我想为pymysql库制作一层,我可能会做

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

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