Amazon ECRライフサイクルポリシーを試してみる

記事タイトルとURLをコピーする

こんにちは。最近ジムに通い始めた島村です。

これまでジムは通ったことはなかったのですが、
効率よく筋肉を刺激することができて楽しく過ごせています。
この調子で筋肉を大きくしていけたらと思います。

さて、今回はECRのライフサイクルポリシーの機能の解説と
実際に試して機能を試していきたいと思います。

ECRライフサイクルポリシーとは何か

まず、ECRのライフサイクルポリシーはプライベートリポジトリごとに設定が可能です。
※パブリックリポジトリでは設定することができません。

ライフサイクルを定義することで、条件に合致したイメージを削除することが可能です。
リポジトリ内のイメージを効率よく整理することができるようになります。

ライフサイクルポリシーの判定条件

ライフサイクルポリシーは2種類のどちらかの判定条件で設定できます。
1.イメージ数(imageCountMoreThan) 2.プッシュしてからの日数(sinceImagePushed)
いずれの条件もイメージのプッシュされた日付で判定されています。

イメージ数が1の条件であれば、プッシュされた日付の最新のものだけが残ります。

プッシュしてからの日数であれば、指定した日数よりも古い日付のイメージは全て期限切れになります。

ライフサイクルポリシーの評価順序

ライフサイクルポリシーにはルールの優先度があります。
ルールの評価自体は同時に行われますが、ポリシー適用は優先度を見ています。

わかりにくいので、公式ドキュメントの例を見たいと思います。
以下のような条件で考えていきます。

リポジトリのコンテンツ

Image A, Taglist: ["beta-1", "prod-1"], Pushed: 10 days ago
Image B, Taglist: ["beta-2", "prod-2"], Pushed: 9 days ago
Image C, Taglist: ["beta-3"], Pushed: 8 days ago

ライフサイクルポリシー

{
    "rules": [
        {
            "rulePriority": 1,
            "description": "Rule 1",
            "selection": {
                "tagStatus": "tagged",
                "tagPrefixList": ["prod"],
                "countType": "imageCountMoreThan",
                "countNumber": 1
            },
            "action": {
                "type": "expire"
            }
        },
        {
            "rulePriority": 2,
            "description": "Rule 2",
            "selection": {
                "tagStatus": "tagged",
                "tagPrefixList": ["beta"],
                "countType": "imageCountMoreThan",
                "countNumber": 1
            },
            "action": {
                "type": "expire"
            }
        }
    ]
}


優先度1のルールの条件に合致するイメージはどれになるのでしょうか。
答えはImage-Aのみになります。
prodのタグがついているもので、古いプッシュ日付なのでImage-Aだけになりますね。

優先度2のルールを見てみましょう。
betaタグのものが対象になります。今回の場合はImage-AとImage-Bが条件に当てはまります。
betaタグの場合、imageCountMoreThanでCountNumberが1のため、最新であるImage-Cだけが残るようになります。
ただし、ここで優先度が適用されます。

優先度1のルールではImage-Aだけが当てはまり、優先度2のルールではImage-A,Bが対象でした。
優先度1のルールはprodかつ古い日付のものとなるため、Image-Aだけが適用されImage-Aだけが削除対象となります。
優先度2のルールではImage-Bも削除対象として判定はされるものの、優先度1のルールには当てはまらないので削除対象にはならないというわけです。

ライフサイクルポリシーの適用時の注意点

ECRのライフサイクルポリシーは設定後、即座に反映されます。
テストをせずに実行してしまうと削除を想定していないイメージまで消えてしまう可能性があります

ECRライフサイクルポリシーにはポリシーのテストルール機能があります。
テストルールを定義することで条件に合致するイメージを事前に特定しておき、問題なければ
テストルールをライフサイクルポリシーとして定義しましょう。

試してみる

ライフサイクルポリシーを試してみます。
dockerイメージは手元で適当に作成して、アップロードしておきました。

上が一番新しいイメージで、下に行けば行くほど古いイメージです
この状態でライフサイクルルールを構成していきます。
対象となるリポジトリを選択し、[アクション]→[ライフサイクルポリシー]を選択します。

まずは、テストルールを作成していきます。

ルールの定義を設定していきます。
今回は簡単に定義を行います

タグ指定はせずに全てのイメージを対象とし、条件はイメージ数とします。

以下の通りとなるかと思います。

設定が完了したら、テストルールを実行します
[テストの保存と実行]を選択します。

結果には一番古いイメージが削除されると出力されていますね。
このルールを本番ルールにしたいと思います。
[ライフサイクルポリシーとして適用]を選択します。

本番ルールを追加して15分以内にイメージが削除されました。
※24時間以内の削除が仕様なので、15分以内で削除されるとは限りません。

最後に

いかがでしたでしょうか。
リポジトリは運用が続くにつれ、肥大化していきます。
ライフサイクルポリシーを使用して効率よく整理していきましょう。

参考

ライフサイクルポリシー https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/LifecyclePolicies.html#lifecycle-policy-howitworks

島村 輝 (Shimamura Hikaru) 記事一覧はコチラ

最近ECS周りをキャッチアップ中。趣味は車・バイク全般。
一応、AWS12冠です。