AWS SAM:跨 Lambda 函数共享文件

Hep*_*tus 6 amazon-web-services aws-cloudformation aws-sam-cli

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

project-home
 -lambda_a_dir
   -lambda_a.py
 -lambda_b_dir
   -lambda_b.py
 -shared_dir
   -shared.py
Run Code Online (Sandbox Code Playgroud)

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

  • 符号链接和 MacOS 别名。
  • 的各种组合CodeUri方案
  • 带有__init__和 的本地包setup.py。(我不能使用公共包,因为代码是私有的,不能放在公共存储库中。)

这是我的模板文件:

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
Run Code Online (Sandbox Code Playgroud)

Hep*_*tus 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
Run Code Online (Sandbox Code Playgroud)

请注意,代码在上传之前需要进行压缩,并且需要具有以下目录结构,其中代码位于具有语言名称的目录中。在本例中,由于我使用的是 Python,因此代码需要位于该python目录中,然后对该python目录进行压缩:

my_shared_zip.zip
 -python
   -shared.py
   -other_shared.py
   -more_shared.py
Run Code Online (Sandbox Code Playgroud)

最后一点。虽然理想情况下,这个共享 python 目录应该通过命令直接部署sam deploy到 Layer 对象中,但我发现LayersAWS SAM CLI 中的支持仍然很新且有很多错误,目前它还不起作用。希望在接下来的几个月里它能够得到修复。与此同时,我需要自己手动安装新版本的共享压缩文件。叹。