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)