AWS SAM:Lambda函数之间的共享文件

时间:2019-04-08 04:30:05

标签: amazon-web-services amazon-cloudformation aws-sam-cli

我正在使用AWS SAM(无服务器应用程序模型)在API Gateway设置中构建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

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

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

这是我的模板文件:

setup.py

3 个答案:

答案 0 :(得分:1)

按照@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目录直接部署到Layer对象中,但我发现AWS SAM CLI中对Layers的支持仍然是一个新事物,而且有很多缺陷,在这一点上,它不起作用。希望在未来几个月内将解决此问题。同时,我需要自己手动安装shared-zip文件的新版本。叹气。

答案 1 :(得分:0)

分层解决方案看起来很像黑客。 我尝试创建指向“共享”文件夹的符号链接,但它可以正常工作-共享文件夹已与我的lambda函数一起成功打包。

cd lambda_a_dir
ln -s ../shared

答案 2 :(得分:0)

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