AWS

npm install -g で permission denied が出た原因と解決方法

AWS CDKをTypeScriptで始めようと思い、まずはCLIをインストールしようとしました。

npm install -g aws-cdk

すると、以下のエラーが発生しました。

npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /usr/local/lib/node_modules/aws-cdk
npm ERR! Error: EACCES: permission denied

エラーの意味

EACCES は

Error Access(アクセス権限エラー)

つまり、

「そのフォルダに書き込む権限がありません」

という意味です。

今回の場合、npmは以下の場所にインストールしようとしていました。

/usr/local/lib/node_modules

ここはMacのシステム寄りのディレクトリで、通常ユーザーには書き込み権限がありません。


なぜ -g をつけると起きるのか?

-g は「グローバルインストール」を意味します。

npm install -g aws-cdk

これは

「このPC全体で cdk コマンドを使えるようにする」

という意味です。

そのため、システムディレクトリに書き込もうとしてエラーになりました。


やってはいけない解決方法

検索するとよく出てくるのがこれです。

sudo npm install -g aws-cdk

一見解決しますが、これはおすすめできません。

理由:

  • root権限でnpmを動かすことになる
  • ファイル所有者が混ざって後で壊れる可能性がある
  • チーム開発ではNG

正しい解決方法:nvmを使う

今回の解決策は「Node Version Manager(nvm)」を使うことでした。

nvmを使うと:

  • Nodeをユーザーディレクトリにインストールできる
  • 権限エラーが起きない
  • Nodeのバージョン管理ができる

エンジニア的にはこちらが推奨です。


Node Version Manager(nvm)とは?

nvmはその名の通り、

Node.jsのバージョンを管理するためのツール

です。


なぜnvmが必要なのか?

Node.jsはプロジェクトによって必要なバージョンが異なります。

例えば:

  • プロジェクトA → Node 18
  • プロジェクトB → Node 20
  • 古い検証環境 → Node 16

通常インストールでは1つのバージョンしか使えません。

しかしnvmを使うと:

nvm install 20
nvm install 18
nvm use 20

のように、簡単に切り替えができます。


今回のEACCESエラーとの関係

今回のエラーは、

「グローバルインストール先がシステム領域だったこと」

が原因でした。

nvmを使うと、Node自体が

~/.nvm

(自分のホームディレクトリ)

にインストールされます。

つまり:

  • 管理者権限が不要
  • permissionエラーが起きない
  • sudoを使わなくて済む

というメリットがあります。


エンジニア的にnvmが推奨される理由

実務ではnvmを使うことが多いらしいです。

理由:

  • プロジェクトごとのNode管理が可能
  • CI/CDとの整合性が取りやすい
  • チーム開発でトラブルが減る
  • 環境再現性が高い

実際に打ったコマンド

①nvmをインストール

brew install nvm

② nvm用ディレクトリ作成

mkdir ~/.nvm

③zshに設定を追加

echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
echo 'source $(brew --prefix nvm)/nvm.sh' >> ~/.zshrc

④ターミナルを再起動


⑤nvmでNodeを入れ直し

nvm install 20
nvm use 20

確認:

node -v

⑥CDKを再インストール

npm install -g aws-cdk

結果:

added 1 package in 1s

⑦最終確認

cdk --version

表示:

2.1106.1 (build 4e0d9f7)

-AWS