AWS SAM:跨 Lambda 函数共享文件

AWS SAM: Shared files across Lambda functions

我正在使用 AWS SAM(无服务器应用程序模型)在 API 网关设置中构建 Python 3.6 lambda 代码。 因此,我有一个创建多个 Lambda 函数的 template.yaml 文件。它们由项目中各自的子目录中的 lambda 函数组织而成。 lambda 还共享几个我保存在共享文件夹中的常用文件。

project-home
 -lambda_a_dir
   -lambda_a.py
 -lambda_b_dir
   -lambda_b.py
 -shared_dir
   -shared.py

问题是虽然 Pycharm 可以清楚地看到 shared.py,但 SAM 不能并拒绝识别共享文件,并出现以下错误:Unable to import module 'lambdaA': No module named 'shared' 如果我移动副本shared.py 文件到每个 lambda 目录中,Pycharm 和 SAM 都很高兴,我可以 build/deploy 到 AWS。
我的问题:如何使用共享目录中的共享文件构建 SAM 模板?
到目前为止,我已经尝试过:

这是我的模板文件:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaA:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_a_dir/
      Handler: lambda_a.lambda_handler
      Runtime: python3.6
  lambdaB:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_b_dir/
      Handler: lambda_b.lambda_handler
      Runtime: python3.6

根据@Dunedan 的建议,我使用共享代码为每个 lambda 函数创建了一个 Layers 对象,这有效地将这些例程添加到这些函数的 PythonPath 中。我还使用新的 Layers 属性将以下内容添加到 API 模板定义中:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaA:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_a_dir/
      Handler: lambda_a.lambda_handler
      Runtime: python3.6
      Layers: 
        - arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
  lambdaB:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_b_dir/
      Handler: lambda_b.lambda_handler
      Runtime: python3.6
      Layers: 
        - arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1

请注意,代码在上传之前需要压缩,并且需要具有以下目录结构,代码位于具有语言名称的目录中。在这种情况下,因为我使用的是 Python,代码需要在 python 目录中,然后 python 目录被压缩:

my_shared_zip.zip
 -python
   -shared.py
   -other_shared.py
   -more_shared.py

最后一个音符。虽然理想情况下,应该通过 sam deploy 命令将此共享 python 目录直接部署到层对象中,但我发现 AWS SAM CLI 中对 Layers 的支持仍然很新如此错误,以至于此时它无法正常工作。希望在接下来的几个月里它会得到修复。同时,我需要自己手动安装新版本的 shared-zip 文件。唉。

图层解决方案看起来像一个 hack。 我尝试创建指向 "shared" 文件夹的符号链接并且成功了 - 共享文件夹与我的 lambda 函数一起成功打包。

cd lambda_a_dir
ln -s ../shared

您尝试过使用 Rocketsam CLI 吗?它恰好解决了这个问题(使用在构建时自动创建的符号链接在 lambda 之间共享代码)。 它还允许拆分 YAML 文件,以便每个 lambda 可以有一个单独的 YAML 文件。