DevOpsエンジニアはCodeBuildを使用してNode.jsアプリケーションをビルドしています。npm installステップが毎回8分かかり、ビルド時間の大半を占めています。package.jsonはほとんど変更されません。最もコスト効率よくビルド時間を短縮する方法はどれですか?
npmはダウンロードしたパッケージを/root/.npmにキャッシュします。CodeBuildのLOCAL_CUSTOM_CACHEで/root/.npmをキャッシュパスに指定すると、次回以降のnpm installはネットワークダウンロードなしにキャッシュからパッケージを展開でき大幅な高速化が可能です。追加のAWSサービスコストが発生せず、npm installやnpm ciもそのまま実行されるため依存関係の整合性も維持されます。 S3キャッシュでnode_modulesをキャッシュしnpm ciをスキップする方法はビルドホストをまたいだキャッシュ永続化が可能ですが、大量ファイルのS3アップロード・ダウンロードオーバーヘッドが発生し、npm ciをスキップすると依存関係の再現性と整合性が失われるためDevOpsのベストプラクティスに反します。 CodeArtifactはnpmjsのプロキシキャッシュとして機能しますが毎回ネットワークアクセスが必要であり、ローカルキャッシュより速度向上が限定的で追加のサービスコストも発生します。 カスタムDockerイメージにnode_modulesをプリインストールする方法はビルド時間を短縮できますが、package.jsonが変更されるたびにイメージの再ビルドとECRへのプッシュが必要となり運用コストが増大します。