📝
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