依存管理
プロジェクトが使用する外部パッケージのバージョン管理と更新を行う仕組み
開発ツールセキュリティ
依存管理とは
依存管理 (Dependency Management) は、プロジェクトが使用する外部パッケージ (npm, pip) のバージョン管理、更新、脆弱性対応を行う仕組みである。
package.json と lockfile
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 ci と 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 での依存管理
Lambda での依存管理の例を示す。
# SAM: esbuild でバンドル (node_modules を含めない)
Metadata:
BuildMethod: esbuild
BuildProperties:
Minify: true
External: ['@aws-sdk/*'] # Lambda に含まれる SDK は除外
Lambda Layer で共通の依存パッケージを共有し、デプロイサイズを削減する。
現場での応用を知るには関連書籍も役立つ。
この記事は役に立ちましたか?
関連用語
npm
Node.js のデフォルトパッケージマネージャーで、200 万以上の JavaScript パッケージの公開・インストール・管理を行う
サプライチェーンセキュリティ
ソフトウェアの依存関係やビルドパイプラインを通じた攻撃を防ぐセキュリティ対策
セマンティックバージョニング
MAJOR.MINOR.PATCH の 3 桁でソフトウェアの互換性を表現するバージョニング規約
Lambda Layer
Lambda 関数間で共有ライブラリやカスタムランタイムを再利用する仕組み
シフトレフトセキュリティ
セキュリティ対策を開発ライフサイクルの早い段階 (左側) に組み込むアプローチ
SAST/DAST
ソースコードの静的解析と実行中のアプリケーションの動的解析によるセキュリティテスト