aws LambdaでNodejsの外部ライブラリを使用する方法について紹介します。
以下のようなコードを書いてみます。
const bcrypt = require("bcrypt");
その後、DEPLOYを押下し、TESTボタンで実行

実行結果
エラーが出てしまいました。

Response
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'bcrypt'\nRequire stack:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
"trace": [
"Runtime.ImportModuleError: Error: Cannot find module 'bcrypt'",
"Require stack:",
"- /var/task/index.js",
"- /var/runtime/UserFunction.js",
"- /var/runtime/index.js",
" at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
" at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
" at Object.<anonymous> (/var/runtime/index.js:43:30)",
" at Module._compile (internal/modules/cjs/loader.js:1072:14)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)",
" at Module.load (internal/modules/cjs/loader.js:937:32)",
" at Function.Module._load (internal/modules/cjs/loader.js:778:12)",
" at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)",
" at internal/main/run_main_module.js:17:47"
]
}
エラー文をよくみるとError: Cannot find module 'bcrypt'"という文があります。
これは、AwsLambdaにそのモジュールがないです。という意味で、つまり用意されていないんです。
さて、どうしましょうか。
対策
node_moduleを直接読み込む!!
手順1 現在作業しているフォルダを自分のPCにダウンロード
- 画面右上のアクションボタンから関数のエクスポートを選択します。

2. デプロイパッケージのダウンロードを選択

手順2 node_modulesフォルダを作成する
- ダウンロードしたフォルダをエディタで開く
- ターミナルを使い、npm install bcrypt コマンドを実行する(* bcryptはそもそも対応していなく、bcryptjsに変更しました。そのエラーを見せるためにまずはbcryptでインストールしています。面倒な方は、初めからbcryptjsでインストールしてください*)
- node_modulesフォルダが作成されていることを確認する
npm install bcypt

実行後、node_modulesフォルダが作成されます。
手順3 Zipファイルにまとめる
1.testフォルダをZipファイルにまとめます。

手順4 アップロード
- AWSLambdaの画面に戻り、アップロード元を選択
- .Zipファイルを選択
- 先ほど圧縮したzipファイルを選択し、アップロードします。


手順5 確認
アップロード完了後、以下の画像のようにnode_modulesが追加されていることを確認できます。

最後に実行してみます。
Response
{
"errorType": "Error",
"errorMessage": "/var/task/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header",
"trace": [
"Error: /var/task/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header",
" at Object.Module._extensions..node (internal/modules/cjs/loader.js:1131:18)",
" at Module.load (internal/modules/cjs/loader.js:937:32)",
" at Function.Module._load (internal/modules/cjs/loader.js:778:12)",
" at Module.require (internal/modules/cjs/loader.js:961:19)",
" at require (internal/modules/cjs/helpers.js:92:18)",
" at Object.<anonymous> (/var/task/node_modules/bcrypt/bcrypt.js:6:16)",
" at Module._compile (internal/modules/cjs/loader.js:1072:14)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)",
" at Module.load (internal/modules/cjs/loader.js:937:32)",
" at Function.Module._load (internal/modules/cjs/loader.js:778:12)"
]
}
エラーが出ました。
"Error: /var/task/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header",
なんでしょうか。
調べてみると、macOSでコンパイルされたbcryptはLinux上では機能しないということでした。
手順2の方でnpm install bcryptjsでインストールしてください。
再度実行してみます。


エラーは消えました。
これで、外部ライブラリを読み込むことができます。
コメント