包括部署到lambda的本地依赖项

时间:2015-11-04 00:24:29

标签: node.js npm gulp aws-lambda

我有一个回购,其中包括几个"微服务"我上传到AWS的Lambda。此外,我还有一些共享库,我希望在发送给AWS时进行打包。

因此我的目录结构如下:

/micro-service-1
    /dist
        package.json
        index.js
/micro-service-2
    /dist
        package.json
        index.js
/shared-component-1
    /dist
        package.json
        component-name-1.js
/shared-component-2
    /dist
        package.json
        component-name-2.js

基本部署利用方便的node-lambda npm模块,但是当我使用如下语句引用本地共享组件时:

var sharedService = require('../../shared-component-1/dist/index');

使用node-lambda run命令可以正常工作,但node-lambda deploy会删除此本地依赖项。可能有道理,因为我要低于" root"我依赖的目录,所以我想也许我会利用 gulp 来完成这项工作,但我对它很新,所以我可能会做一些愚蠢的事情。我的策略是:

  • gulp deploy依赖于 local-deps 任务
  • local-deps 任务将:
    • npm build --production到目录
    • 然后将此目录传递到/local目录
    • 下的微服务
    • 清除共享
    • 中的安装
  • 然后我会引用所有共享组件,如:

    var sharedService = require('local/component-name-1');
    

希望这能成为我努力实现的目标。这种策略有意义吗?我应该考虑更简单的方法吗?有没有人在" gulp speak"?

中有任何类似的例子

2 个答案:

答案 0 :(得分:5)

我有一个答案! :d

TL; DR - 使用npm link链接在公共组件和相关组件之间创建符号链接。

所以,我有一个只有两个模块的项目:

- main-module
- referenced-module

这些都是节点模块。如果我cd进入referenced-module并运行npm link,然后cd进入main-modulenpm link referenced-module,则npm将'安装'我的referenced-module进入我的main-module并将其存储在我的node_modules文件夹中。注意:运行第二个npm link时,项目名称是您在package.json中找到的名称,而不是目录名称(请参阅先前链接的npm link文档)。< / p>

现在,在我的main-module我需要做的只是var test = require('referenced-module'),我可以将它用于我的内心。请务必module.exports referenced-module main-module您的代码。{/ 1>

现在,当您压缩node-lambda以将其部署到AWS Lambda时,链接将得到解决,并且真正的模块将放在其位置!我已经测试了这个并且它可以工作,但不是referenced-module,但是我不明白为什么这应该是一个问题(除非它与包恢复有所不同)。

这种方法的优点还在于,我对main-module所做的任何更改都会在开发过程中由我的gcc -pedantic自动获取,因此我无需执行任何gulp任务或任何操作同步它们。

我发现这是一个非常好的,干净的解决方案,我能够在几分钟内完成它。如果我上面描述的任何内容都没有任何意义(因为我自己刚刚发现了这个解决方案!),请发表评论,我会尽力为你澄清。

2016年2月更新

根据您的要求和应用程序的大小,可能有一个有趣的替代方案,比使用符号链接更优雅地解决了这个问题。看看Serverless。这是构建无服务器应用程序的一种非常简洁的方式,并包含有用的功能,例如能够分配触发您正在编写的Lambda函数的API网关端点。它甚至允许您编写CloudFormation配置脚本,因此如果您有其他资源要部署,那么您可以在此处执行此操作。需要'beta'或'prod'阶段?这也可以帮到你。我已经使用它一个多星期了,虽然有一些设置要做,事情并不总是如你所愿,它非常灵活,支持社区很好!

答案 1 :(得分:-1)

在使用无服务器时,我们遇到了类似的问题,因为需要在AWS Lambdas之间共享代码。最初我们曾经在每个微服务中复制代码,但是后来一直很难管理。

由于在Windows环境中进行了开发,因此使用符号链接不是我们的选择。

然后我们提出了一个解决方案,使用共享文件夹来保持本地依赖关系,并使用自定义写入的gulp任务在每个微服务端点上复制这些依赖关系,以便可以像npm包那样需要依赖关系。 / p>

我们做出的决定之一是不要保留两个位置来定义微服务的依赖关系,因此我们使用相同的package.json来定义本地共享依赖关系,其中gulp任务传递此文件并相应地复制共享依赖关系使用单个命令安装npm依赖项。

稍后我们将代码开源为npm模块serverless-dependency-installgulp-dependency-install