【问题标题】:Append a directory to Amazon Lambda Environment Variables $NODE_PATH将目录附加到 Amazon Lambda 环境变量 $NODE_PATH
【发布时间】:2020-06-10 20:23:36
【问题描述】:

根据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?

【问题讨论】:

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


    【解决方案1】:

    我也需要这个,因为我使用的是 AWS Lambda 层,它们位于默认的 NODE_PATH 上,并且还希望能够使用本地根来避免长的相对路径(例如 import bar from foo/bar 而不是 @ 987654323@,但我没有找到任何方法追加NODE_PATH而不丢失默认的-一旦设置,node_modules的路径-包括aws-sdk模块,丢失了。

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

    1. NODE_PATH 显式设置为默认值加上您的自定义值(这会为您不必关心的 lambda 内部环境配置添加丑陋的依赖关系)

    2. 将您的自定义库放在一个层中。很多时候,如果您可以将子模块提取为单独的层,这是一个很好的解决方案(但它对消除应用程序本身中的长相对路径等情况没有帮助,就像我上面描述的那样)。

    3. 以编程方式追加,通过让应用程序的第一行执行

    process.env.NODE_PATH = process.env.NODE_PATH + ":my-custom-path";
    require("module").Module._initPaths(); // This re-initalizes the module loader to use the new NODE_PATH.
    
    require('some-custom-module-in-my-custom-path'); // should work
    require('aws-sdk') // should also work
    

    这可能不是最漂亮的 hack,但它应该可以解决问题(免责声明:实际上并没有在 AWS Lambda 环境中尝试过,但它至少在本地使用 Node 12 可以工作)。

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题。 我写了一个代码来检查 lambda 函数是否应用了 shell 变量扩展,并找出它们没有。

      我将环境变量FOO设置为$NODE_PATH

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

      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

      NODE_PATH 的默认值在此解释:

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

      【讨论】:

      • 我也试过这个,从 nodejs 代码执行 shell 命令,echo env 显示它是一个字符串$NODE_PATH。有没有什么办法不覆盖现有的并附加到它上面?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2017-06-22
      • 2014-10-23
      • 2016-04-14
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多