Amazon Linux 2にNode 18をインストールする
Amazon Linux 2(AL2)にはNodeSourceやnodenv等のよく知られた方法でのNode 18のインストールができません。
諦めてとっととAmazon Linux 2023に移行してしまいましょう。
・・・と言いたいところですが、やはりOSとミドルウェアの同時移行は辛いものです。
なのでどうにかしてNode 18をインストールする方法の紹介です。
そもそもなんでNode 18がインストールできないのか
実はインストール だけ はできます。しかし実行時エラーが発生してしまいます。
$ 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)
上記の通りAL2で提供されているglibcのバージョンが古いことに起因しています。
じゃあどうしたら良いのか
AWS re:Postの Node.js 18 on Amazon Linux 2 に答えがありました。
While not officially supported by AWS, and only a specific version of NodeJS that has been compiled, you could borrow the NodeJS binary from the Cloud9 team and installon your Amazon Linux 2 based host.
AWSが公式にサポートしているわけではありませんが、コンパイルされたNodeJSの特定のバージョンに限り、Cloud9用のNodeJSのバイナリを借りてAmazon Linux 2ベースのホストにインストールすることができます。
AWS Cloud9 の Node.js チュートリアル 内の注記にも
最新の Amazon Linux 2 (AL2) AWS Cloud9 イメージには Node.js 18 がインストールされています。Node.js 18 を AL2 AWS Cloud9 に手動でインストールする場合は、AWS Cloud9 IDE ターミナルで次のコマンドを実行します。
とあります。
実際にインストールしてみる
AL2のDockerイメージで試してみます。
Dockerfile
FROM --platform=amd64 amazonlinux:2
ARG NODE_VER=v18.18.2
ARG NODE_DIR=/usr/local/share/node
# Nodeのインストールに必要なパッケージをインストール
RUN yum install -y wget tar gzip
# Nodeのダウンロード&インストール
RUN wget -nv https://d3rnber7ry90et.cloudfront.net/linux-x86_64/node-${NODE_VER}.tar.gz && \
tar -xf node-${NODE_VER}.tar.gz && \
mv node-${NODE_VER} ${NODE_DIR}
# パスの通っている場所にバイナリへのリンクを貼る。もちろん${NODE_DIR}/binをパスに追加してもOK
RUN ln -s ${NODE_DIR}/bin/corepack /usr/local/bin/corepack && \
ln -s ${NODE_DIR}/bin/node /usr/local/bin/node && \
ln -s ${NODE_DIR}/bin/npm /usr/local/bin/npm && \
ln -s ${NODE_DIR}/bin/npx /usr/local/bin/npx
上記のDockerファイルをビルドし各種バージョンを確認してみます。
$ docker build -t al2-node18 .
[+] Building 0.6s (8/8) FINISHED
$ docker run --rm -it al2-node18 bash
bash-4.2# node -v
v18.18.2
bash-4.2# npm -v
9.8.1
bash-4.2# npx -v
9.8.1
# 試しにnpmのバージョンを上げてみる
bash-4.2# npm i -g npm
removed 34 packages, and changed 80 packages in 5s
bash-4.2# npm -v
10.2.5
注意
Cloud9用のNodeバイナリはx86用のバイナリのみのようです。