概要
- ランタイムNode.js18のlambda関数にてbcryptモジュールを使って文字列をハッシュ化しようと試み、めっちゃハマったので経緯をまとめておく。
ご注意
- 本記事を呼んでも解決方法は記載していません。
結論
- 下記の方法でbcryptjsモジュールを使うことで解決した。
反省
- bcryptアルゴリズムを使ったハッシュ化の方法が途中までbcryptモジュールを使うものだけだと思っていた。
- bcryptjsモジュールも使用可能なことを知らなかった。
- ちょっと詰まったら複数の方法があるかもしれないと疑うことをしよう。
経緯
-
jsでbcryptアルゴリズムを使ってハッシュ化する場合にbcryptモジュールを使うことを知る。
-
モジュール追加する必要があったため、ローカルのMacでNode.jsバージョンを18に設定、
$ npm init
→$ npm install bcrypt
を実行、インストール後、package.jsonが入っているディレクトリをzip化し、レイヤーに登録した。 -
lambda関数を作成し、下記のようなimport文を記載した。
index.mjsimport bcrypt from "bcrypt";
-
先に作成したレイヤーを当該の関数に登録した。
-
当該の関数を実行してみた。
-
下記のようなエラーがでた。
"errorType": "Error", "errorMessage": "/opt/nodejs/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header", "code": "ERR_DLOPEN_FAILED",
-
エラーを調べてみると、「bcryptモジュールのバイナリファイルがlambda(AmazonLinux2)と互換のない」ことが原因らしい事がわかった。
-
どうやらAmazonLinux2にて
npm install bcrypt
を実行する必要があるらしい。 -
ぱっと思い浮かんだのがEC2だったのでとりあえずAmazonLinux2のインスタンスを立ち上げてVoltaを入れてNode.js18を入れようとした。
-
Voltaの導入には成功したがVoltaのコマンドが存在しない。(おそらくパスを通してなかったから。)
-
仕方ないので下記の公式の方法に則ってnvmでNode.js18をインストールする。
-
$ node -v
を実行すると下記のようなエラーが出る。node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node) node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
-
衝撃の事実発覚、「AmazonLinux2でNode.js18がサポートされていない」
-
ここで気がつけばよかったが、なぜかDockerでAmazonLinux2のコンテナを立ててNode.js18を入れてしまう。
docker pull amazonlinux:2.0.20230504.1 docker run -itd amazonlinux:2.0.20230504.1 /bin/bash docker container exec -it コンテナ名 /bin/bash
-
案の定
$ node -v
を実行すると下記のようなエラーが出た。AmazonLinux2のDockerイメージ使ってるんだから当たり前、、、。node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node) node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
-
bcryptjsモジュールの存在に気が付きそちらを使うことに、、、。という流れだった。