こんにちは。最近ジムに通い始めた島村です。
これまでジムは通ったことはなかったのですが、
効率よく筋肉を刺激することができて楽しく過ごせています。
この調子で筋肉を大きくしていけたらと思います。
さて、今回は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分以内で削除されるとは限りません。

最後に
いかがでしたでしょうか。
リポジトリは運用が続くにつれ、肥大化していきます。
ライフサイクルポリシーを使用して効率よく整理していきましょう。
参考
島村 輝 (Shimamura Hikaru) 記事一覧はコチラ