7/20 追記
原因は、ビルド時と実行時のnodeのバージョンが違うことで発生する問題のようでした。
ビルド済みバイナリでは、node14でビルドしており実行は16の場合に問題を再現することができました。
解決策は、ビルド済みバイナリは使用せずにソースから直接ビルドする必要があります。
TL;DR
* 現在も修正されていません(というか、開発者も原因がわかっていないようです。私もわからなかったです。)
バグを見つけた背景
https://github.com/team-ful/noratomo を最近、大学のプロジェクトで作っていてそこでパスワードのハッシュ化でargon2を使用しています。
で、Cloud RunにデプロイしていてDockerfileのpurductionコンテナにnode:16-alpine
を使っていました。
その状態で、アカウント作成やらログインやらを試したら500になってログを見るとコンテナが死んでいたので発見したという次第です。
このバグのやばいところ
- テストで見つからない。実装ミスとかじゃなくてOS依存でエラーが起きるため発見できなかった。
- 実行しないとエラーを見つけられない。Cのバイナリは事前インストールでも自前ビルドでも成功していた
- コンテナ自体が死ぬ。コンテナの再起動処理が走るので普通にやばい
解決策
今のところ2つしかありません。
- Alpine Linuxの使用をやめる
node:16
にすると動きます。
argon2
のバージョンを0.27.2にダウングレードする
issueに書いてあるやつです。
このようなバグを事前に見つけるために
- テストを本番環境と近い環境で実行する
- 大事そう。もし実行に時間がかかるならGH Actionsとかを使用して非同期でテストを実行してもらえるともっと良さそう。