依存管理
プロジェクトが使用する外部パッケージのバージョン管理と更新を行う仕組み
開発ツールセキュリティ
依存管理とは
依存管理 (Dependency Management) は、プロジェクトが使用する外部パッケージ (npm, pip) のバージョン管理、更新、脆弱性対応を行う仕組みである。
package.json と lockfile
// package.json: バージョン範囲を指定
{ "dependencies": { "express": "^4.18.0" } }
// package-lock.json: 正確なバージョンを固定
{ "express": { "version": "4.18.2", "resolved": "https://..." } }
| ファイル | 役割 |
|---|---|
| package.json | バージョン範囲の宣言 |
| package-lock.json | 正確なバージョンの固定 |
| node_modules/ | 実際のパッケージ (Git に含めない) |
セマンティックバージョニング
MAJOR.MINOR.PATCH
2. 1. 3
^2.1.3 → 2.x.x (MINOR, PATCH の更新を許可)
~2.1.3 → 2.1.x (PATCH の更新のみ許可)
2.1.3 → 2.1.3 (完全固定)
npm ci vs npm install
| コマンド | 用途 |
|---|---|
npm install |
開発時 (lockfile を更新する場合がある) |
npm ci |
CI/CD (lockfile と完全一致、高速) |
脆弱性の管理
# 脆弱性のチェック
npm audit
# 自動修正
npm audit fix
# Dependabot で自動 PR
# .github/dependabot.yml
依存の更新戦略
Dependabot や Renovate で自動的に更新 PR を作成するのが効率的だ。手動で npm update を定期的に実行する方法もあるが、自動化が推奨される。ロックファイルの更新は npm update --save で行う。
依存の最小化
❌ 1 行の関数のためにパッケージを追加
npm install left-pad (有名な事件)
✅ 標準ライブラリで代替できないか確認
"hello".padStart(10) // left-pad 不要
Lambda での依存管理
# SAM: esbuild でバンドル (node_modules を含めない)
Metadata:
BuildMethod: esbuild
BuildProperties:
Minify: true
External: ['@aws-sdk/*'] # Lambda に含まれる SDK は除外
Lambda Layer で共通の依存パッケージを共有し、デプロイサイズを削減する。
現場での応用を知るには関連書籍も役立つ。