在AWS Lambda中共享代码

时间:2018-05-06 19:27:41

标签: node.js amazon-web-services aws-lambda

在AWS Lambda函数之间共享代码的首选方法是什么?

我有这样的结构:

  • 功能
    • 一个
      • node_modules
      • index.js
      • 的package.json
    • b
      • node_modules
      • index.js
      • 的package.json
    • Ç
      • node_modules
      • index.js
      • 的package.json

这让每个函数都保留了自己的node_modules,我可以用CLI打包整个东西。

但是需要共享的自定义代码呢?

我可以require("../mylibrary")但是包命令仍然不包含它。

4 个答案:

答案 0 :(得分:3)

如dmigo所述,Lambda层是可能的。这是一些使用Lambda图层代码的SAM模板代码:

Globals:
  Function:
    Runtime: nodejs8.10

MyFunction:
    Type: AWS::Serverless::Function
    Properties:
        CodeUri: a/
        Handler: index.handler
        Layers:
        - !Ref MySharedLayer
MySharedLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
        LayerName: SharedLayer
        Description: Some code to share with the other lambda functions
        ContentUri: layer/
        CompatibleRuntimes:
            - nodejs8.10
        RetentionPolicy: Retain

答案 1 :(得分:2)

现在,您可以使用Layers在函数之间共享库和代码。您可以从zip文件中创建“图层”,方法与“功能”相同。

该图层包看起来或多或少是这样的:

my-layer.zip
└ nodejs/node_modules/mylibrary

如果在此层之上创建函数,则在代码中可以这样引用它:

const shared = require('mylibrary');

值得注意的是,图层支持版本控制,并且与多对多功能有关。这使他们成为第二npm。

答案 2 :(得分:1)

尝试无服务器框架,您可以使用包含/排除工件,而无需编写自己的脚本。

checkout serverless.com

我也使用专用节点程序包,但是需要在sls部署之前安装它们。

答案 3 :(得分:0)

Lambda的问题在于,您必须部署一个ZIP文件,因此所有代码都必须从一个根目录访问。

我用一个脚本解决了这个问题,该脚本将我的共享代码复制到所有Lambda函数目录中,然后再存档每个函数并上传它们。

符号链接也是可能的。