[アップデート] Amazon ECR のストレージコストを削減できる「アーカイブストレージクラス」がサポートされました

[アップデート] Amazon ECR のストレージコストを削減できる「アーカイブストレージクラス」がサポートされました

2025.11.20

いわさです。

Amazon Elastic Container Registry(Amazon ECR)は AWS マネージドなコンテナレジストリです。
その料金体系は保存されたコンテナイメージが使用しているストレージ容量と、リポジトリから転送されたデータ量によって決まります。

先日の Amazon ECR のアップデートで新たにストレージクラスの概念が追加されました。

https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-ecr-archive-storage-class-container-images/

これまで東京リージョンであればストレージコストは 1 ヶ月あたり 0.1 USD/GB だったのですが、このアーカイブ機能を使うと一定以上の総容量を超えたものからストレージ単価が安くなります。

https://aws.amazon.com/ecr/pricing/

東京リージョンの場合だと以下のようになっています。

  • 最初の 150 TB までは、月あたり 0.1 USD/GB
  • それ以上は、月あたり 0.07 USD/GB

あってるのかな。150 TB までは標準ストレージと同じ単価みたいです。
本日は Amazon ECR のアーカイブストレージ周りを少し触ってみたので紹介します。

アーカイブする

アーカイブですが、明示的に設定が必要です。
手動でアーカイブも出来ますし、ライフサイクルポリシーを使って自動でのアーカイブも出来ます。

まずは手動アーカイブを試してみます。
プライベートレジストリの適当なリポジトリでイメージ詳細画面を開きましょう。

7DD4C51F-1C3F-4084-B995-3EF3B1D099C9.png

イメージ詳細画面の右上に「アーカイブ」のボタンがありますね。こちらをポチっと押します。

7EF2408B-E5CE-43C6-8AE4-FDAF685A01F3.png

ストレージクラスを ARCHIVE に変更するか聞かれますので、確認ボタンを押します。

7D4B3948-CD54-45E2-9B1D-EFF38B3933FF_4_5005_c.jpeg

そうすると先程選択した latest タグのイメージがイメージ一覧から消えましたね。どこか行っちゃった。

EA268082-8F14-41B7-A97E-1DBC5D8BD2D8.png

よく見てみると、先ほどは存在していなかった「アーカイブされたイメージ」というタブが表示されています。
どうやらアーカイブされたイメージが存在するリポジトリではこのタブが表示されるみたいです。

このタブを開くと、アーカイブされたイメージを確認することが出来ました。

568BFDE4-9622-451B-8B09-1FD2A8F99738.png

ちなみに CloudTrail のログを見てみるとアーカイブ操作を行ったときにUpdateImageStorageClassアクションが実行されていました。
新しく API が追加されているみたいですね。

{
    "eventVersion": "1.11",
 :
    "eventTime": "2025-11-19T20:37:45Z",
    "eventSource": "ecr.amazonaws.com",
    "eventName": "UpdateImageStorageClass",
    "awsRegion": "ap-northeast-1",
    "requestParameters": {
        "repositoryName": "hoge0619img",
        "imageId": {
            "imageDigest": "sha256:38ae575e06c02d4c7177bf08ebb2a646bf29b3904f9da5f1f6cda9a9165813f3"
        },
        "targetStorageClass": "ARCHIVE"
    },
    "responseElements": {
        "registryId": "123456789012",
        "repositoryName": "hoge0619img",
        "imageId": {
            "imageDigest": "sha256:38ae575e06c02d4c7177bf08ebb2a646bf29b3904f9da5f1f6cda9a9165813f3"
        },
        "imageStatus": "ARCHIVED"
    },
:
}

ライフサイクルポリシー

Amazon ECR にはライフサイクルポリシーという機能がこれまでもありました。
以前まではライフサイクルポリシーを使うと条件に一致するイメージを自動で削除することが出来ました。

https://dev.classmethod.jp/articles/ecr-lifecycle/

今回のアップデートで削除だけでなくアーカイブも出来るようになっています。見てみましょう。

38BBB798-A8DA-4A5D-B02A-54C0BA1B100C.png

こちらですね。
アクションに「アーカイブ」が追加されています。
また、一致条件に「イメージがアーカイブされてから経過した日数」というものも追加されています。

F5AD04A2-AEF9-4624-8892-6D628DB4A173.png

数日経過後にアーカイブし、アーカイブされてから数年経ったら削除するとか、そういう組み合わせもできるみたいです。

アーカイブされたイメージを使うには

このアーカイブされたイメージですが、そのまま標準ストレージのようにプルしてくることは出来ません。
事前に標準ストレージへの復元が必要です。S3 Glacier Deep Archive のような感じです。そして復元には数分時間がかかります。やってみましょう。

アーカイブされたイメージを選択して「リストア」ボタンがありますので、そちらを押します。

384A5F74-FCF3-4222-A411-BBF9E0908EEE.png

CDB79936-2804-4098-871C-669EDDC78476_4_5005_c.jpeg

そうするとイメージのステータスが「アクティベーション」に変化しました。
復元操作が行われているようです。ここで数分待機します。
なお、料金ページに小さく記載されているのですがアーカイブストレージから標準ストレージへのリストアには GB あたりの料金が発生します。

FE644D85-6A91-470C-AAE6-9F221DE933B7.png

ちなみにこのタイミングのアクションもUpdateImageStorageClassが実行されていました。

{
    "eventVersion": "1.11",
:
    "eventTime": "2025-11-19T20:47:12Z",
    "eventSource": "ecr.amazonaws.com",
    "eventName": "UpdateImageStorageClass",
    "requestParameters": {
        "repositoryName": "dotnet-generic-28d92cb8",
        "imageId": {
            "imageDigest": "sha256:f42aaf61a6eb7f1d2d036acbf877b4a24a964211d5f899a8a1b269d82bc0e037"
        },
        "targetStorageClass": "STANDARD"
    },
    "responseElements": {
        "registryId": "123456789012",
        "repositoryName": "dotnet-generic-28d92cb8",
        "imageId": {
            "imageDigest": "sha256:f42aaf61a6eb7f1d2d036acbf877b4a24a964211d5f899a8a1b269d82bc0e037"
        },
        "imageStatus": "ACTIVATING"
    },
:
}

私が試した際には 7~8分程度で復元が完了しました。
復元後はイメージタブに表示されるようになりました。

image.png

ドキュメントによると通常で最大 20 分程度かかるがそれよりも早く完了する場合があるとのことです。[1]

また、リポジトリのスキャンやレプリケーションが有効になっている場合は、復元時にそれらの操作も実行されます。

AWS CLI でアーカイブされたイメージを取得する

AWS CLI でイメージ一覧を確認してみたところ、普通の方法だとアーカイブされたイメージが取得出来ませんでした。追加のオプション指定が必要なようです。
本日時点の最新版 v2.32.0 で試してみます。

ここでは次のようにイメージタブに2つのイメージがあり、アーカイブされたイメージが1つあるリポジトリで確認をしてみます。

663A54E7-9A21-4460-9F54-286EA828B8B9.png

CBF1F8FE-58C4-4DB0-B39B-E821EC91FBAB.png

まず、通常のlist-imagesdescribe-imagesを使ってみた結果はこんな感じです。アクティブなイメージだけ取得されていることがわかりますね。
ただし、describe-imagesでは以前までは存在していなかったimageStatusが追加されていることが確認できます。

% aws ecr list-images --repository-name hoge0619img
{
    "imageIds": [
        {
            "imageDigest": "sha256:d78f489f08108d86cf9dd48621a7258bcdaf231fe4d1f6492dc3829bdd4af834"
        },
        {
            "imageDigest": "sha256:eda3d693920e4a06832a88e9c8dc9dcd796f14bc748d93d719713f64b352888a",
            "imageTag": "latest"
        }
    ]
}
% aws ecr describe-images --repository-name hoge0619img
{
    "imageDetails": [
        {
            "registryId": "123456789012",
            "repositoryName": "hoge0619img",
            "imageDigest": "sha256:d78f489f08108d86cf9dd48621a7258bcdaf231fe4d1f6492dc3829bdd4af834",
            "imageSizeInBytes": 51001235,
            "imagePushedAt": "2025-06-19T05:31:50.882000+09:00",
            "imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "artifactMediaType": "application/vnd.docker.container.image.v1+json",
            "lastRecordedPullTime": "2025-06-19T05:31:58.136000+09:00",
            "imageStatus": "ACTIVE"
        },
        {
            "registryId": "123456789012",
            "repositoryName": "hoge0619img",
            "imageDigest": "sha256:eda3d693920e4a06832a88e9c8dc9dcd796f14bc748d93d719713f64b352888a",
            "imageTags": [
                "latest"
            ],
            "imageSizeInBytes": 51032807,
            "imagePushedAt": "2025-06-19T05:49:38.619000+09:00",
            "imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "artifactMediaType": "application/vnd.docker.container.image.v1+json",
            "lastRecordedPullTime": "2025-06-19T05:49:45.099000+09:00",
            "imageStatus": "ACTIVE"
        }
    ]
}

これらの API はオプションで以前からfilterを指定して条件を指定することが出来たのですが、今回のアップデートでフィルターパラメータにもimageStatusが追加されています。
ここでARCHIVEDを指定することでアーカイブされたイメージを取得することが出来ました。

% aws ecr describe-images --repository-name hoge0619img --filter imageStatus=ARCHIVED
{
    "imageDetails": [
        {
            "registryId": "123456789012",
            "repositoryName": "hoge0619img",
            "imageDigest": "sha256:38ae575e06c02d4c7177bf08ebb2a646bf29b3904f9da5f1f6cda9a9165813f3",
            "imageSizeInBytes": 50787328,
            "imagePushedAt": "2025-06-19T05:07:42.128000+09:00",
            "imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "artifactMediaType": "application/vnd.docker.container.image.v1+json",
            "lastRecordedPullTime": "2025-06-19T05:07:49.543000+09:00",
            "imageStatus": "ARCHIVED",
            "lastArchivedAt": "2025-11-20T05:37:45.116000+09:00"
        }
    ]
}
% aws ecr list-images --repository-name hoge0619img --filter imageStatus=ARCHIVED
{
    "imageIds": [
        {
            "imageDigest": "sha256:38ae575e06c02d4c7177bf08ebb2a646bf29b3904f9da5f1f6cda9a9165813f3"
        }
    ]
}

さいごに

本日は Amazon ECR のストレージコストを削減できる「アーカイブストレージクラス」がサポートされたので使ってみました。

150 TB までは標準ストレージと単価が同じみたいなので、ECR のストレージコストで月額 15,000 ドル使っているようであれば採用の余地がある感じでしょうか。
正直その規模で使っているのを私は見たことがないので、どれだけの人が恩恵を受けれるのだろうか。
アーカイブストレージクラスにそれなりに制約があるので、150TB以上と言わずに最初から単価が安めだと採用シーンが多そうです。

脚注
  1. Restoring an image - Amazon ECR ↩︎

この記事をシェアする

FacebookHatena blogX

関連記事