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用のバイナリのみのようです。