💰
【忘備録】ECRのライフサイクルポリシーを設定する
はじめに
私は競馬予想AIアプリケーションを個人開発しています。
バックエンドのPythonの部分でAWS ECRを使用していますが
AWSの費用の多くがECRに起因していることに気づきました。

ライフサイクルポリシーを設定して不要なコストを削減することにしました。
ECRの課金の仕組み
ライフサイクルポリシーを設定する前に、ECRの課金の仕組みを把握していないので整理します。
ECRの課金は主に以下の2つの要素で構成されています:
- ストレージ使用量:リポジトリに保存されているDockerイメージのサイズ合計(GB/月)
- データ転送量:別リージョンのECRにアクセスする際などに発生
詳細(2025年7月現在)
ストレージ料金:$0.10 USD/GB/月
※プライベートリポジトリとパブリックリポジトリ共通
プライベートリポジトリからのデータ転送料金(東京リージョンの場合):
- データ受信:無料
- データ送信:
- 最初の9.999TB/月:$0.114/GB
- 次の40TB/月:$0.089/GB
- 次の100TB/月:$0.086/GB
- 150TB超/月:$0.0084/GB
データ受信/送信はECRへの転送/ECRからの転送を意味します。
同一リージョン内のECRと他のサービス間で転送されるデータは無料です。
ライフサイクルポリシー設定
Github Actionsでタグを付ける
ライフサイクルポリシーの条件はPushされたイメージのタグを条件に設定することができます。
(タグ関係なく設定することも可能)
開発しているアプリケーションではECRへのプッシュはGithub Actionsで行っているので、
タグを付ける設定を行います。関係する部分のみ抜粋します。
build-and-deploy:
env:
AWS_REGION: ap-northeast-1
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
IMAGE_TAG: ${{ github.ref == 'refs/heads/main' && 'prod' || 'dev' }}
IMAGE_HASH: ${{ github.sha }}
steps:
- name: Build & Push base image (ARM64)
with:
tags: ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/base-image:${{ env.IMAGE_TAG }}-${{ env.IMAGE_HASH }}
prod-かdev-のタグを付けてECRにプッシュするように設定しました。
バージョンを一意に識別するために、GitHubのコミットハッシュもタグに含めています。
設定手順
- ECRコンソールでリポジトリを選択
- 左メニューの「Lifecycle Policy」をクリック
- 「テストルールの編集」→「ルールを追加」と遷移
- 「ライフサイクルテストルールを作成」で内容を入力
- 保存をクリックしてから「テストを実行」をクリックすると現時点での削除対象イメージが表示される
- 問題なければ「ライフサイクルポリシーとして適用」をクリックするとjsonが表示されるので確認して「保存」をクリック
注意点
当たり前ですが、ライフサイクルポリシー設定時は
他のサービスでのイメージの使用状況を確認しましょう。
やむを得ずECSでECRのイメージのタグ番号を直書きで設定した際に意図せずにポリシーが適用されてしまい、
後日ECSのタスクが突然起動できなくなったことがあります。
参考資料:
Discussion