AWS AmplifyでNode.js v18を使うと「GLIBC not found」が発生する

最近新たに開始したプロジェクトで、開発環境をNode.js v18 + Next.js v13に更新した。検証のためにAWS Amplifyにデプロイしたがエラーが発生。

ちょっと調べるとあるあるらしいので、何番煎じかわからないが対応方法をメモ。

環境

Node.js v18.16.1, Next.js v13.4.19。

問題

AWS Amplifyに前述のバージョンのNext.jsアプリケーションをホストした。ビルドの設定は以下。

  • 構築イメージ: Amazon Linux:2 (デフォルト)
  • ライブパッケージの更新
    1. Next.js version: 13.4.19
    2. Node.js version: 18.16.1

この状態でデプロイすると、以下のエラーが「構築」>「フロントエンド」で発生し、アプリケーションのビルドに失敗する。

[WARNING]: 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)  
[ERROR]: !!! Build failed

なお、AmplifyはNext.js v13に対応済み。

aws.amazon.com

原因

「node GLIBC not found」で検索すると、同様の事例が出てくる。OSにインストールされているGLIBC(GNU C Library)が古いのが原因らしい。

コンテナイメージとしてはデフォルトのAmazon Linux 2を指定していた。Amazon Linux 2のベースと思われるCentOS7でも同様の問題が発生する模様。

it.ama2pro.net

対応

コンテナイメージを変更してやればいい。ECR Public GalleryでNode.jsの公式イメージが使用できる。

今回はv18.16.1を使うので、構築イメージのURLとして public.ecr.aws/docker/library/node:18.16.1 を指定。

これでビルドが通るだろうと思ったが、今度は [ERROR]: !!! Node version not available: 18.16.1 というエラーが発生。

「ライブパッケージの更新」でNode.jsのバージョンを指定しているのが悪いのかと思い、 Node.js version を削除したところ、エラーが発生しなくなった。

振り返り

今回の問題が起こるまで、Amplifyのアプリケーション実行環境を気にしていなかった。適切なコンテナイメージがあれば、それを指定したほうがいいかもしれない。

Amazon Linux 2、サポート期限が2023年6月末じゃなかったっけと思ったら、2年延長してたのね。正式リリースが2018年6月、それだけ古ければ、そろそろ動かないものが出てくることもあるよなぁ。