AWS CodeArtifact で構築するパッケージ管理基盤 - npm ・ Maven ・ PyPI のプライベートリポジトリ
npm・Maven・PyPI のプライベートリポジトリを構築し、アップストリームキャッシュでビルドの安定性を確保する。パッケージオリジンコントロールで依存関係混乱攻撃を防止します。
CodeArtifact の基本概念
CodeArtifact は npm、Maven、PyPI、NuGet、Swift、Cargo の 6 パッケージ形式に対応するマネージドリポジトリサービスです。ドメイン (組織単位の論理グループ)、リポジトリ (パッケージの格納先)、アップストリームリポジトリ (パッケージの取得元チェーン) の 3 つの概念で構成されます。ドメインは AWS Organizations の複数アカウントにまたがるパッケージ共有を可能にし、同一ドメイン内のリポジトリ間はパッケージのコピーなしに参照できるためストレージの重複が発生しません。社内で開発したプライベートパッケージと、npmjs.com や Maven Central からのパブリックパッケージを同一のリポジトリで管理できます。開発者はパッケージマネージャー (npm、pip、mvn) のレジストリ URL を CodeArtifact に向けるだけで、プライベートとパブリックの両方のパッケージを透過的に取得できます。認証トークンは `aws codeartifact get-authorization-token` で取得し、有効期限は最大 12 時間です。
アップストリーム連携とキャッシュ
アップストリームリポジトリを設定すると、リクエストされたパッケージがローカルに存在しない場合、アップストリームから自動的に取得してキャッシュします。npmjs.com が一時的にダウンしても、キャッシュ済みのパッケージでビルドを継続できます。アップストリームはチェーン構成が可能で、社内共通リポジトリ → チーム用リポジトリ → パブリックリポジトリの順に検索する階層構造を構築できます。アップストリームチェーンの深さは最大 10 段まで設定可能です。パッケージのバージョン固定とキャッシュにより、ビルドの再現性が向上し、外部リポジトリの変更による予期しないビルド失敗を防止できます。キャッシュされたパッケージバージョンは immutable (変更不可) となり、上流でバージョンが削除・改ざんされても影響を受けません。この特性は left-pad 事件 (2016 年に npm パッケージが突然削除され、大規模なビルド障害を引き起こした) のようなインシデントへの完全な防御となります。
サプライチェーンセキュリティ
パッケージオリジンコントロールは、パッケージの公開元を制限する機能です。社内パッケージ名と同名のパッケージがパブリックリポジトリに公開された場合、意図せずパブリック版が取得される依存関係混乱攻撃を防止します。内部パッケージに対して「内部公開のみ許可」を設定すると、アップストリームからの同名パッケージの取得がブロックされます。 EventBridge との統合で、新しいパッケージバージョンの公開をイベントとして検知し、自動テストやセキュリティスキャンをトリガーするワークフローを構築できます。 CodeArtifact の実践的な活用法を深めるには、専門書籍 (Amazon)が役立ちます。
設計のベストプラクティスと落とし穴
ドメイン設計では、Organizations 全体で 1 つのドメインを共有し、チームやプロジェクト単位でリポジトリを分割する構成が推奨されます。ドメインを分割しすぎると、パッケージの重複キャッシュでストレージが膨張し、クロスドメイン参照もできないため管理が煩雑になります。リポジトリのアクセス制御はリソースベースポリシーで制御し、IAM ポリシーと併用して最小権限を設定します。CI/CD パイプラインでは、CodeBuild の buildspec で `aws codeartifact login` を実行してトークンを自動取得する構成にすると、手動のトークン管理が不要になります。よくある落とし穴として、npm の `.npmrc` に認証トークンをハードコードしてしまうケースがあります。トークンは最大 12 時間で失効するため、ビルドのたびに動的に取得する仕組みが必須です。また、アップストリームの外部接続 (External Connection) はリポジトリあたり 1 つしか設定できない制約があるため、npm と PyPI を同じリポジトリで混在させることはできず、パッケージ形式ごとにリポジトリを分けてアップストリームチェーンで結合する設計が必要です。
JFrog Artifactory・GitHub Packages との比較
JFrog Artifactory はセルフホスト型の成熟したリポジトリマネージャーで、Docker イメージ、Helm チャート、RPM など CodeArtifact が非対応の形式も扱えます。一方で、EC2 や EKS 上でのインフラ管理、ライセンスコスト (Pro 版で年間数千ドル〜)、バックアップ設計が必要です。GitHub Packages は GitHub リポジトリとの統合が密で、npm・Maven・Docker・NuGet に対応しますが、アップストリームキャッシュ機構がなく、パッケージオリジンコントロールに相当するサプライチェーン防御機能も提供しません。CodeArtifact の強みは、インフラ管理不要のフルマネージドでありながら、Organizations レベルのアクセス制御とアップストリームキャッシュを組み合わせられる点です。Docker イメージは ECR、Helm チャートは ECR Public が担うため、AWS エコシステム全体で見れば対応形式の差は補完されます。小規模チームで GitHub にコードが集約されている場合は GitHub Packages の手軽さが勝りますが、マルチアカウント・マルチ言語環境で統制を効かせるなら CodeArtifact のドメイン・リポジトリ構造が適しています。
CodeArtifact の料金
CodeArtifact の料金はストレージ (1 GB あたり月額約 0.05 ドル)、リクエスト数 (10,000 リクエストあたり約 0.05 ドル)、データ転送で構成されます。アップストリームからキャッシュされたパブリックパッケージもストレージ料金の対象です。ライフサイクルポリシーで古いバージョンを自動削除し、ストレージコストを管理します。npm や Maven のパブリックリポジトリを直接参照する場合と比較すると、CodeArtifact のコストは月額数ドルから数十ドル程度で、ビルドの安定性とセキュリティの向上を考慮すれば十分に見合う投資です。注意点として、頻繁に依存解決を行う CI パイプライン (1 日数百ビルド規模) ではリクエスト課金が蓄積するため、`npm ci` の `--prefer-offline` やローカルキャッシュ層の併用でリクエスト数を抑制する工夫が有効です。
まとめ
CodeArtifact は複数言語のパッケージを統一管理するマネージドリポジトリです。アップストリームキャッシュでビルドの安定性を確保し、パッケージオリジンコントロールで不正パッケージの混入を防止します。npm、pip、Maven、NuGet に対応し、Organizations 全体でパッケージの共有とアクセス制御を一元管理します。