将目录追加到Amazon Lambda环境变量$ NODE_PATH

时间:2019-02-11 05:03:11

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

根据docs的默认环境变量:

NODE_PATH:/opt/nodejs/node8/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules

我想在其中添加我的自定义目录(不要覆盖所有内容)

NODE_PATH:$NODE_PATH:/opt/nodejs/mycustom-directory

我从lambda控制台尝试了上述操作,它覆盖了所有操作。 $NODE_PATH作为字符串添加。它没有解析$NODE_PATH

打印环境时得到的输出:

NODE_PATH=$NODE_PATH:/opt/nodejs/mycustom-directory

类似的问题,但仍然没有解决方案:AWS lambda add PATH variable?

2 个答案:

答案 0 :(得分:0)

我想到了同样的问题。 我编写了一个代码,以检查lambda函数是否应用了shell变量扩展,并弄清楚了它们不适用。

我将环境变量 [error] a.a.ActorSystemImpl - Internal server error, sending 500 response akka.http.impl.util.One2OneBidiFlow$OutputTruncationException: Inner flow was completed without producing result elements for 1 outstanding elements at akka.http.impl.util.One2OneBidiFlow$OutputTruncationException$.apply(One2OneBidiFlow.scala:22) at akka.http.impl.util.One2OneBidiFlow$OutputTruncationException$.apply(One2OneBidiFlow.scala:22) at akka.http.impl.util.One2OneBidiFlow$One2OneBidi$$anon$1$$anon$4.onUpstreamFinish(One2OneBidiFlow.scala:97) at akka.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:504) at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:378) at akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:588) at akka.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:472) at akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:563) at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:745) at akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:760) [error] (Compile / playEbeanModels) java.lang.NoClassDefFoundError: play/Configuration 设置为FOO

然后,运行检查代码(在lambda函数中):

$NODE_PATH

输出为:

const { FOO } = process.env;
exports.lambdaHandler = async (event, context, callback) => {
  console.log(FOO);
};

我只是将整个2019-02-22T08:29:05.714Z cde21239-628f-4a79-b046-6a14f177f59e $NODE_PATH 改写为NODE_PATH

(my custom library path):/opt/nodejs/lib:/opt/nodejs/node8/node_modules/:/opt/nodejs/node_modules:/var/runtime/node_modules的默认值在此处说明:

https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html

答案 1 :(得分:0)

我也需要这样做,因为我使用的是AWS Lambda图层,这些图层位于默认的NODE_PATH上,并且还希望能够使用本地根来避免较长的相对路径(例如{{1} }而不是import bar from foo/bar,但我没有找到追加import bar from ../../../../foo/bar的任何方法而不会丢失默认值-设置好后,{{1 }}-包括NODE_PATH模块在​​内。

我能想到的唯一解决方案是:

  1. node_modules显式设置为默认值加上您的自定义值(这对lambda内部环境配置增加了丑陋的依赖,您不必在意)

  2. 将您的自定义库放在一个图层中。在很多情况下,如果可以将子模块提取为单独的层,则这是一个很好的解决方案(但对于像我上面所述的消除应用程序内部较长的相对路径的情况,这种方法无济于事。)

  3. 通过程序的附加操作,使应用程序的第一行执行

aws-sdk

这可能不是最漂亮的黑客工具,但应该可以解决问题(免责声明:尚未在AWS Lambda环境中实际尝试过此操作,但至少在本地使用Node 12可以工作。)