Amazon ECR のコンテナイメージ管理 - ライフサイクルポリシーとイメージスキャン

プライベートリポジトリのライフサイクルポリシーで古いイメージを自動削除し、イメージスキャンで脆弱性を検出する運用パターンを紹介します。

ECR の基本とリポジトリ管理

ECR は Docker コンテナイメージと OCI アーティファクトのマネージドレジストリで、レイヤーの最大サイズは 52,000 MiB です。プライベートリポジトリとパブリックリポジトリ (ECR Public) を提供しており、プライベートリポジトリは IAM ポリシーでアクセスを制御します。特定の IAM ロールのみがイメージのプッシュ / プルを許可する設定が可能で、リポジトリポリシーを使えば別の AWS アカウントからのプルも制御できます。イメージは AES-256 で保存時に暗号化され、KMS のカスタマーマネージドキー (CMK) も選択できます。CMK を使うとキーの自動ローテーションや監査ログとの統合ができ、プル時の KMS API 呼び出しが増えます。イメージタグのイミュータビリティを有効にすると、同じタグで異なるイメージを上書きプッシュできなくなります。リポジトリ名はプレフィックスで階層化が可能で (例: team-a/app-frontend)、IAM ポリシーでプレフィックス単位のアクセス制御を実装できます。

ライフサイクルポリシーとコスト管理

ライフサイクルポリシーはリポジトリ内のイメージを自動的にクリーンアップするルールです。タグ付きイメージの保持数 (例: 最新 10 個を保持)、タグなしイメージの保持期間 (例: 7 日以上経過したものを削除)、特定のタグプレフィックスに基づくルールを定義できます。ルールには優先度を設定でき、複数ルールが競合した場合は優先度の高いルールが適用されます。CI/CD パイプラインで頻繁にイメージをプッシュする環境では、ライフサイクルポリシーが無いと、イメージが増えるほどストレージのコストが増えます。本番用イメージ (prod-*) は 30 世代、開発用イメージ (dev-*) は 5 世代と、タグごとに保持数を分ける構成をとれます。ポリシーのプレビュー機能を使えば、実際に削除される前にどのイメージが対象になるかを確認できます。ECR のストレージ料金はリージョンごとに 1 GB あたり月額で課金されるため、不要なイメージの蓄積は直接コストに影響します。

イメージスキャンとレプリケーション

基本スキャンは、AWS のネイティブの技術と CVE (Common Vulnerabilities and Exposures) のデータベースで OS の脆弱性をスキャンし、プッシュ時か手動で実行します。拡張スキャンは Inspector と統合し、OS パッケージに加えてプログラミング言語パッケージ (npm、pip、Maven) の脆弱性も検出します。拡張スキャンは継続的に実行され、新しい CVE が公開されると既存イメージが再スキャンされます。スキャン結果は EventBridge に発行されるため、Critical/High の脆弱性検出時に SNS 通知や自動修復パイプラインをトリガーする構成が可能です。クロスリージョンレプリケーションはイメージを指定したリージョンに自動複製し、マルチリージョンの ECS/EKS デプロイでイメージのプル時間を短縮します。クロスアカウントレプリケーションも可能で、中央のイメージリポジトリからワークロードアカウントにイメージを配信する構成に活用できます。レプリケーションはフィルタルールで対象リポジトリを限定でき、全リポジトリを複製する必要はありません。

CI/CD パイプラインとの統合パターン

ECR は CI/CD パイプラインでビルドしたイメージの保存先と取得元になります。CodeBuild や GitHub Actions からイメージをビルドしてプッシュする構成をとれます。認証トークンは GetAuthorizationToken API で取得し、有効期間は 12 時間です。ビルド時にマルチステージビルドで最終イメージを小さく保つと、プル時間とストレージのコストを抑えられます。キャッシュ戦略として、ECR はリモートキャッシュに対応しており、BuildKit の --cache-to と --cache-from オプションで中間レイヤーを ECR に保存してビルドを高速化できます。プルスルーキャッシュを設定すると Docker Hub や GitHub Container Registry などのパブリックレジストリからのプルを ECR 経由でキャッシュし、外部レジストリのレート制限を回避できます。イメージのタグには Git のコミットハッシュや CI のビルド番号を使い、latest タグへの依存を減らします。

設計上の注意点とトラブルシューティング

ECR を運用する際に注意すべき点がいくつかあります。リポジトリあたりのイメージ数の上限は、デフォルトで 100,000 です。上限に近づいた場合は、ライフサイクルポリシーを見直すか、上限の引き上げを申請します。VPC 内からのアクセスには VPC エンドポイント (PrivateLink) を設定することで、インターネットゲートウェイを経由せずにイメージをプル / プッシュできます。ECR 用のエンドポイントは ecr.api と ecr.dkr の 2 つが必要で、S3 ゲートウェイエンドポイントも合わせて設定します (イメージレイヤーは S3 に保存されるため)。プルのスロットリングが発生した場合は、リトライロジックを実装し、共通のベースイメージでレイヤーを共有してプルのサイズを減らします。マルチアーキテクチャイメージ (AMD64 と ARM64 の同居) はマニフェストリストで管理し、Graviton インスタンスと x86 インスタンスの混在環境で同じイメージ URI を使用できます。

まとめ

ECR はコンテナイメージの保存、スキャン、レプリケーションを扱うマネージドレジストリです。ライフサイクルポリシーで不要なイメージを自動的に削除し、イメージスキャンで脆弱性を検出します (継続的なスキャンは拡張スキャン)。CI/CD パイプラインのビルドからデプロイまでのイメージの配信に使え、プルスルーキャッシュや VPC エンドポイントの機能もあります。クロスリージョン / クロスアカウントレプリケーションで、マルチリージョン / マルチアカウント環境のコンテナイメージ配布を一元管理できます。

参考資料 (AWS 公式)

本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。

本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。

共有する