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