こんにちは。Supershipでクラウドの統制などをやっているsagaです。
この記事は Supershipグループ Advent Calendar 2025 の 6日目の記事です。
はじめに
Amazon ECRのライフサイクルポリシーはちゃんと設定しましょう。
もし設定していない場合、不要なコストを発生させているかもしれません。
基本的な設定ではありますが、実際にコスト削減に繋がった事例として残しておきます。
Amazon ECR とは
公式(Amazon Elastic Container Registry とは)より
Amazon Elastic Container Registry (Amazon ECR) は、安全性、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。Amazon ECR は、IAM AWS を使用したリソースベースのアクセス許可を持つプライベートリポジトリをサポートします。これは、指定されたユーザーまたは Amazon EC2 インスタンスがコンテナリポジトリとイメージにアクセスできるようにするためです。任意の CLI を使用して、Docker イメージ、Open Container Initiative (OCI) イメージ、および OCI 互換アーティファクトをプッシュ、プル、管理することが可能です。
AWSでコンテナベースのシステムを構築する場合、基本的に使用することになるサービスではないでしょうか。
以後、本記事内では ECR と表記します。
料金
ECR上のリポジトリに保存する際のストレージ料金と、ECRリポジトリから転送されるデータ料金(パブリック・プライベート問わず)で課金されます。
今回主題となるストレージ料金は USD 0.10 GB/月 となっています。
なお、無料枠として1年間プライベートリポジトリで 500 MB/月 の枠はあります。
個人利用としては収めることはできそうですが、業務利用するとあっという間に使い切ってしまいそうですね。
料金例
適切にライフサイクルポリシーを設定できていない場合、コストが線形に増加し続けます。
例えば以下の利用状況とします。
| 項目 | 値 |
|---|---|
| DockerイメージサイズA | 500MB |
| DockerイメージサイズB | 200MB |
| デプロイ頻度 | 週1 |
| リポジトリ数 | 2(AとBそれぞれ) |
週あたりの増加ストレージ: 0.5GB + 0.2GB = 0.7GB/週
1ヶ月あたりの増加ストレージ: 0.7GB × 4週 = 2.8GB/月
上記の利用期間が、3ヶ月、6ヶ月...と続いていくと以下のようになります。
| 期間 | 使用ストレージ容量 | 月額コスト |
|---|---|---|
| 3ヶ月後 | 8.4 GB | $0.84 |
| 6ヶ月後 | 16.8 GB | $1.68 |
| 1年後 | 33.6 GB | $3.36 |
| 3年後 | 100.8 GB | $10.08 |
このように、月額コストが増加し続けていることがわかります。
3年前のイメージを保持する理由があれば別ですが、もしそうでなければ完全に無駄なコストですし、発生することは望ましくありません。
また、週1回のデプロイを想定していますが開発用アカウントでデプロイが頻繁に行われる、例えば平日毎日デプロイが行われるような場合は5倍の料金となります。
ライフサイクルポリシーとは
ECRのライフサイクルを設定(ライフサイクルポリシー)することで、イメージの世代管理を行うことができます。
アカウント内のリポジトリごとにライフサイクルポリシールールを設定することが可能です。なおライフサイクルポリシーはプライベートリポジトリにのみ設定可能です。
ちなみに、このライフサイクルポリシーは2017年10月11日頃にリリースされたそうです。
(Amazon EC2 Container Registry のライフサイクルポリシーのご案内)
ECRのGAは2015年12月21日なので、約2年後に登場したようです。
(EC2 Container Registry – Now Generally Available)
機能について
ライフサイクルポリシー自体の記事はたくさん書かれているので、詳細は各記事や公式のAmazon ECR でのライフサイクルポリシーを使用したイメージのクリーンアップの自動化を参照してください。
- 世代管理のルールを1つ以上設定します
- ルールを適用することで、どのイメージが削除(期限切れ)扱いとなるかを確認できる(プレビュー機能)
- これはAWSのベストプラクティスとなっています
- 意図しないイメージを削除してしまわないようにしっかり実行して確認しましょう
ポリシーの種別
- イメージの経過日数
- イメージの数
- ルールの組み合わせ
事例
社内のコストダッシュボードを確認していたところ、一部のアカウントでECS(ECR)のコストが目立っていることに気づきました。
これらのアカウントはライフサイクルポリシーを設定していない状態であることに気づきました。
ポリシー設計の検討
アカウント管理者と相談し、ポリシーを適用する話を進めました。今回は単純にイメージの世代数を10世代管理とするルールを適用することとしました。
{
"rules": [
{
"rulePriority": 1,
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {
"type": "expire"
}
}
]
}
10世代としたのはロールバック時に十分な世代数を確保できるためです。
また、複雑なタグの運用などは行っていなかったためです。
実際に設定する際はポリシーを入念に検討し、プレビューで削除されるイメージを確認することをおすすめします。
効果
2つのアカウントでそれぞれコストの変動を確認してみます。
それぞれのアカウントですが、4個から5個のリポジトリを日常的に使用しています。検証環境と本番環境が同一のアカウントに存在しているため、リポジトリによってpushされる頻度は異なります。
アカウントA
1リポジトリずつ効果を確認してから実施したので階段状になっていますが、最終的には1日あたり $0.66 から $0.04 まで削減されました。

1ヶ月あたり $20 ほどかかっていたものが $1.2 程度となっています。約94%の削減となりました。

使用量(ストレージ使用量)で見ると1ヶ月あたり 324.10 GB から 11.12 GB となっています。

アカウントB
1日あたり $0.59 から $0.04 まで削減されました。

1ヶ月あたり $18.37 ほどかかっていたものが $1.2 程度となっています。こちらも約94%の削減となりました。

使用量(ストレージ使用量)で見ると1ヶ月あたり 300.14 GB から 12.74 GB となっています。

まとめ
1つポリシーを設定するだけで実運用に影響を出さず、ここまで大きくコスト削減することができる1つの例でした。
今回の2つのアカウントはそれぞれ社内でも歴史があるアカウントで、長期間使用され続けています。
1つは10年以上使用しています。ライフサイクルポリシーが登場した2017年より古いです。そのためサービスのアップデートをキャッチアップできず、放置...といった背景があるのかもしれません。
特定のアカウントを専任で見るポジションではないですが、こうした小さな改善を積み重ねて組織全体の健全化を進めていきたいと思います。
最後に宣伝です。
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
Supership 採用サイト
是非ともよろしくお願いします。