ECRライフサイクルポリシーで古くなったイメージを自動的に削除する

ECRライフサイクルポリシーで古くなったイメージを自動的に削除する

ECRライフサイクルポリシーで古くなったイメージを自動的に削除する

ECRにプッシュされるイメージに対して、ライフサイクルポリシーを設定することができます。

本ページでは、ライフサイクルポリシーを設定し、自動的に古いイメージを削除することを目指します。

構築する環境

Diagram of ECR Lifecycle Policy to automatically delete outdated images.

ECRを作成します。
ライフサイクルポリシーを設定し、タグのないイメージが2つ以上ある場合、1つになるようにイメージを削除します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/077

テンプレートファイルのポイント解説

ECR

Resources:
  ECRRepository:
    Type: AWS::ECR::Repository
    Properties:
      LifecyclePolicy:
        LifecyclePolicyText: |
          {
            "rules": [
              {
                "rulePriority": 1,
                "description": "Keep only one untagged image, expire all others",
                "selection": {
                  "tagStatus": "untagged",
                  "countType": "imageCountMoreThan",
                  "countNumber": 1
                },
                "action": {
                  "type": "expire"
                }
              }
            ]
          }
        RegistryId: !Ref AWS::AccountId
      RepositoryName: !Ref Prefix
Code language: YAML (yaml)

LifecyclePolicyプロパティがポイントです。
このプロパティ内のLifecyclePolicyTextプロパティでライフサイクルポリシーを定義します。

ライフサイクルポリシーの記法は、AWS公式ページに詳しいです。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/lifecycle_policy_examples.html

今回はイメージ数によってイメージを期限切れ・削除します。
具体的には、タグのついていないイメージ数が1より大きい場合、古いイメージを期限切れにして削除するライフサイクルポリシーです。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • ECR:fa-077

作成されたリソースをAWS Management Consoleから確認します。
ECRを確認します。

Detail of ECR Repository 1.

正常にECRが作成されています。

続いてECRのライフサイクルポリシーを確認します。

Detail of ECR Lifecycle Policy 1.

タグがついていないイメージの数が1よりも大きい場合は、古いイメージを期限切れにするポリシーです。

現時点では、ECRにイメージがプッシュされていないため、ライフサイクルポリシーが実行されてはいません。

動作確認

イメージプッシュ1回目

準備が整いましたので、ECRにイメージをプッシュします。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [account-id].dkr.ecr.ap-northeast-1.amazonaws.com
...
Login Succeeded


$ docker build -t fa-077 .
...
Successfully built ef0e8aec8ddc
Successfully tagged fa-077:latest


$ docker tag fa-077:latest [account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077:latest


$ docker push [account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077:latest
The push refers to repository [[account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077]
209cb42bdfb7: Pushed
latest: digest: sha256:c9ce7208912b7897c9a4cb273f20bbfd54fd745d1dd64f5e625fff6778469e69 size: 529
Code language: Bash (bash)

イメージのビルド・プッシュが正常に実行できました。

ECRを確認します。

Detail of ECR Repository 2.

確かにイメージがプッシュされています。

ライフサイクルポリシーの実行履歴を確認します。

Detail of ECR Lifecycle Policy 2.

確かにライフサイクルポリシーが実行されました。
ただし条件を満たすイメージがないため、何も発生しませんでした。

イメージプッシュ2回目

同様の作業をもう一度繰り返します。

$ docker build -t fa-077 .
...
Successfully built a4c9f809ffa5
Successfully tagged fa-077:latest


$ docker tag fa-077:latest [account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077:latest


$ docker push [account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077:latest
The push refers to repository [[account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077]
209cb42bdfb7: Layer already exists
latest: digest: sha256:9bbe64cb64212516c9adf5a9961a270388b6b2065b87cc878b38c1d7c77a510f size: 529
Code language: Bash (bash)

再びイメージのビルド・プッシュが正常に実行できました。

ECRを確認します。

Detail of ECR Repository 3.

確かにイメージがプッシュされています。
新たにプッシュされたイメージに「latest」タグが設定され、1回目にプッシュされたイメージのタグ情報は「<untagged>」に変化しました。

ライフサイクルポリシーを確認します。

Detail of ECR Lifecycle Policy 3.

こちらは変化がありません。
タグのないイメージができましたが、まだ1つだけです。
ですからライフサイクルポリシー実行の条件を満たしているわけではありません。

イメージプッシュ3回目

同様の作業を今一度繰り返します。

$ docker build -t fa-077 .
...
Successfully built efafe9ee6cc5
Successfully tagged fa-077:latest


$ docker tag fa-077:latest [account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077:latest


$ docker push [account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077:latest
The push refers to repository [[account-id].dkr.ecr.ap-northeast-1.amazonaws.com/fa-077]
209cb42bdfb7: Layer already exists
latest: digest: sha256:4adf0089f316607778fd6a5e073205b767bd849ac8a2234921fddc4351139b96 size: 529

三たびイメージのビルド・プッシュが正常に実行できました。

ECRを確認します。

Detail of ECR Repository 4.

確かにイメージがプッシュされています。
新たにプッシュされたイメージに「latest」タグが設定され、1回目・2回目にプッシュされたイメージのタグ情報は「<untagged>」に変化しました。
これでライフサイクルポリシーが動作する条件を満たすことになります。

しばらく待機した後にライフサイクルポリシーを確認します。

Detail of ECR Lifecycle Policy 4.

ライフサイクルポリシーに実行履歴が追加されました。
条件を満たす1つのイメージが削除された旨のメッセージです。

改めてECRを確認します。

Detail of ECR Repository 5.

2つのイメージが確認できます。
2つあったタグのないイメージが1つになっています。
このことからライフサイクルポリシーが正常に動作して、自動的に条件を満たす古いイメージを削除できたことがわかりました。

まとめ

ライフサイクルポリシーを設定し、自動的に古いイメージを削除する方法を確認しました。