Aws LambdaでNode.jsの外部ライブラリを使う

aws-lambda

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にダウンロード

  1. 画面右上のアクションボタンから関数のエクスポートを選択します。

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

手順2 node_modulesフォルダを作成する

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

実行後、node_modulesフォルダが作成されます。

手順3 Zipファイルにまとめる

1.testフォルダをZipファイルにまとめます。

手順4 アップロード

  1. AWSLambdaの画面に戻り、アップロード元を選択
  2. .Zipファイルを選択
  3. 先ほど圧縮した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でインストールしてください。

再度実行してみます。

エラーは消えました。

これで、外部ライブラリを読み込むことができます。

コメント

タイトルとURLをコピーしました