ECRがライフサイクルポリシーでワイルドカード(*)をサポートするようになりました

2023.12.20

こんにちは、岩城です。

本日、表題のアップデートがありましたので紹介します。

忙しい人向けまとめ

  • ライフサイクルポリシーに`タグ付き(ワイルドカードマッチング)が追加された
  • ワイルドカードに指定できるのは*(アスタリスク)のみ
  • 1つのタグに含められるワイルドカードは3つまで、4つ登録しようとするとエラーになる
  • 従来のタグ付け済みは`タグ付き(プレフィックマッチング)というメニューに変わった
  • CloudFormationにも対応している

やってみた

マネジメントコンソール

実際にやってみます。

本エントリでは検証用にリポジトリを作成しました。レポジトリの作成が終わったらライフサイクルポリシーの画面に遷移し、ルールを作成します。

イメージのステータスにタグ付き(ワイルドカードマッチング)が追加され、従来のタグ付け済みからタグ付け(プレフィックマッチング)に変わっていました。

ワイルドカードマッチング用のタグ指定フォームに、ワイルドカード含むタグの文字列のリストを指定します。

なお、コンソールに記載はありませんが、公式ドキュメントに1つのタグに含められるワイルドカードは3つまで、4つ以上は無効と記載がありました。

この点の動作確認も行うため、以下のタグパターンを指定するライフサイクルポリシーをそれぞれ作成しました。

  • prod*
  • test-1*linux
  • test-2*1*2*3
  • test-3*1*2*3*
  • test-4*1*2*3*4*

単一のライフサイクルポリシーで複数タグを指定することもできるのですが、指定したタグすべてに一致するイメージが対象となります。
感覚的には、どれか一つでも該当するイメージが対象となるような気がするかも知れませんが、そうではないので注意しましょう(私はハマりました)。

test-4*1*2*3*4*を指定したライフサイクルポリシー作成しようとすると、

Invalid parameter at 'LifecyclePolicyText' failed to satisfy constraint: 'Lifecycle policy validation failure: Invalid tag pattern provided. Total number of * must not exceed 4'

とエラーが出力されました。ドキュメントどおりですね。

検証用のライフサイクルポリシーの準備が整いました。

指定したタグに合うように適当にイメージをプッシュして動作確認をします。なお、本エントリでは動作確認をすぐ行うため、ライフサイクルルールで保存するイメージ数を1つとしています。

実はライフサイクルルールはルールに一致したイメージがあっても即座に当該イメージを削除せず、24時間以内に削除するというふわっとした仕様です。

すぐに動作確認したいので、テストライフサイクルールの機能を使い、DryRunして意図した動作になるか確認します。

私のイメージタグの命名センスが絶望的で分かりづらいのですが、古いイメージが各ルールによって選出されているのが分かると思います。

CloudFormation

CloudFortmationにも対応しているのを確認しました。

AWSTemplateFormatVersion: 2010-09-09

Description: test lifecycle policy

Resources:
  Repository:
    Type: AWS::ECR::Repository
    Properties:
      EncryptionConfiguration:
        EncryptionType: KMS
      ImageTagMutability: IMMUTABLE
      LifecyclePolicy:
        LifecyclePolicyText: |
          {
            "rules": [
                {
                    "rulePriority": 1,
                    "description": "CloudFormation",
                    "selection": {
                        "tagStatus": "tagged",
                        "tagPatternList": ["test5*"],
                        "countType": "imageCountMoreThan",
                        "countNumber": 1
                    },
                    "action": {
                        "type": "expire"
                    }
                }
            ]
          }
        RegistryId: !Ref AWS::AccountId
      RepositoryName: devio-test-iwaki-2

おわりに

私自身、普段コミットハッシュ値をそのままタグに指定しているので、タグの文字列を気にしてライフサイクルルールを作成したことがありませんでした。

検証する上でワイルドカードマッチングやプレフィックスマッチング、単一のライフサイクルルールないで複数タグ指定は想像していた動作じゃなかったりと、色々と知れて良かったです。

本エントリがどなたかのお役に立てれば幸いです。