📝

Lambda での Node.js モジュールの読み込みを動的に設定してみた

に公開

How do I use shared code in lambdas in an AWS SAM template using layers in Node.js? - Stack Overflow

let math = require(process.env.AWS ? '/opt/nodejs/common' : '../../layers/layer1/nodejs/common');
let tuc = require(process.env.AWS ? 'temp-units-conv' : '../../layers/layer1/nodejs/node_modules/temp-units-conv');

上記サイトの方法で Lambda とローカル環境で読み込むパスを動的に設定してみました。

コード

index.js
const test = require(process.env.AWS ? 'test' : './CustomModules/test');

exports.handler = async function (event) {
  return test.test(1);
}
test.js
exports.test = function (num) {
    return num * 2;
};

index.js から test.js の test メソッドに数字を渡して 2 倍して返しています。

環境変数

const test = require(process.env.AWS ? 'test' : './CustomModules/test');

上記の定義で test.js を読み込むパスを動的に設定するために Lambda の環境変数に AWS: true を設定しています。

上記環境変数によって、Lambda で実行した際には同ディレクトリの test.js が読み込まれ、Lambda 以外で実行した際には CustomModules ディレクトリに存在する test.js が読み込まれます。

Lambda レイヤーでの実装

レイヤーコンテンツのパッケージング - AWS Lambda
Node.js の Lambda レイヤーでは opt/nodejs というパスが読み込まれます。
そのため、上記の test.js をレイヤーから読み込むためには以下のコードになります。

index.js
const test = require(process.env.AWS ? '/opt/nodejs/test' : './CustomModules/test');

まとめ

今回は Lambda での Node.js モジュールの読み込みを動的に設定してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion