ちょっと話題の記事

ECRのライフサイクルポリシー設定によるリポジトリ容量の節約

知らず知らずのうちに溜まりまくってしまうECRのイメージを自動的にお掃除してくれるライフサイクルポリシーの紹介です。
2018.08.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「この溜まりまくるDockerイメージをなんとかしたい。そんな人生だった」

ECR(Amazon Elastic Container Registry)、みなさんお使いでしょうか?AWSフルマネージドのDockerコンテナレジストリで、可用性も高く自社運用も不要で各種AWSサービスとの連携も容易で、AWSでコンテナホストするなら必須のサービスですね。

先日のアップデートで、ECRのライフサイクルポリシーにタグ値の設定が不要となり、より簡単にイメージのフィルタができるようになったので、その内容をお届け致します。

Amazon ECR ライフサイクルポリシーにタグ付きイメージのフィルタオプションが追加されました。

今一度、ECRのライフサイクルポリシー設定を見直してみるのも良いかと思います。

ECRきたか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

ECRのライフサイクルポリシーとは?

ECRの中のライフサイクルポリシーを設定しておくことで、不要になったイメージを自動的に有効期限切れ(=削除)することができます。

ECRのストレージ料金は、料金 - Amazon EC2 Container Registryにあるとおり、0.10USD/GB/月で、特別高価ではないですが、開発環境でチーム規模が多く機能ブランチもECRに自動プッシュするような運用では、知らず知らずのうちにストレージを食いつぶして思わぬ料金となってしまうこともあるかと。

イメージのサイズもだいたい100MB〜200MBぐらいする場合(圧縮済み)が多く、案外無視できない容量なんですよね。

また、デフォルトではECR1リポジトリあたり、イメージ数は1000に制限されている(制限値の増加リクエストは可能)ので、定期的なECRリポジトリのお掃除は設定しておいたほうが良いです。そんな便利なECRのライフサイクルポリシーに、先日素敵なアップデートがありました。

直近のアップデートで何が便利になったのか?

アップデート前(タグ条件が必須)

以前は、ライフサイクルポリシーで不要なイメージをフィルタする条件としてイメージタグの指定が必須でした。

しかし、ECSにどのバージョンがデプロイされているかを判定するため、イメージタグにリポジトリのタグやコミットハッシュをつけることが良くあると思います。つまりこの場合、イメージにつけるタグの値は不定です。なので、タグ条件が必須なライフサイクルポリシーとは相性がよくありませんでした。

アップデート後(タグ条件の非必須化)

今回のアップデートで、タグの条件が非必須化されたため、以下の条件で簡単にライフサイクルポリシーを設定できるようになりました。

  • 指定数を超えるイメージ
  • イメージプッシュ後の経過日数

「イメージが100個以上になったら古いやつから削除する」「プッシュされて90日経過したイメージは自動的に削除する」なんて設定が、簡単にできます。

ライフサイクルポリシーの設定方法

ほな、実際にECRにライフサイクルポリシーを設定してみましょう。一例としてイメージプッシュ後の経過日数が30日を超えたものを有効期限切れとしてみます。

ECRのリポジトリを選択すると、こんな感じでリポジトリに格納されているイメージの一覧が表示されます。

ここで、いきなりライフサイクルポリシー適用してしまって意図しないイメージが消えると非常に怖い(特に本番運用しているECRの場合)ので、そんなあなたのため「ライフサイクルルールのリハーサル」機能をつかいましょう。リハーサルのルール追加のためボタンをクリック。

ルールの追加画面が表示されます。

イメージのステータスで「すべて」を選択すると一致条件が表示されるので、下記のように「イメージをプッシュしてから」「30日後」に設定。

ルール保存後、「保存してリハーサルを実行」ボタンをクリックすると、ルール適用され有効期限切れになるイメージの一覧が表示されます。これで事前に対象になるイメージをきちんと確認してみて、意図通りの設定なっているのであれば、本番ライフサイクルポリシーとして適用しましょう。自動的にイメージが削除されるようになります。

ライフサイクルポリシーの実際の設定例

複数のライフサイクルポリシーを優先順位をつけて適用することができます。イメージタグに環境名をつけている場合の設定例。本番環境イメージは念の為多めに残しておいて、環境名がついていないものやそもそもタグが設定されていないものは5イメージだけ残す設定となります。

ルールの優先度 ルール名 ポリシー内容
5 本番用イメージ有効期限 タグ「prd-」のものを30イメージ残す
10 ステージング用イメージ有効期限 タグ「stg-」のものを20イメージ残す
20 開発用イメージ有効期限 タグ「dev-」のものを10イメージ残す
90 全イメージ有効期限 5イメージ残す(タグ条件なし)

イメージタグに固定のプレフィックスをつけずコミットハッシュ値のみを利用している場合は、単純に以下のルールで良いかと思います。

ルールの優先度 ルール名 ポリシー内容
10 イメージ有効期限 30イメージ残す(タグ条件なし)

適切なECRライフサイクルポリシー設定で、コンテナ運用を自動化しましょう

以上、ECRのライフサイクルポリシーの設定例を見てきました。CI/CDをガンガンに回しているイケてる現場であれば有るほど、ECRのリポジトリサイズもあっという間に大きくなっていくと思います。

今回紹介したECRのライフサイクルポリシー機能を活用して、よりムダの少ないイケてるコンテナ運用を目指してみてはいかがでしょうか。

それでは、今日はこのへんで。濱田(@hamako9999)でした。

追加の参考記事

CloudFormationおよび、AWS CLIでの設定についての記事もありますので、合わせてご参照ください。

ECRのライフサイクルポリシーをCloudFormationで定義する方法とその設定指針