Amazon ECR リポジトリ内のイメージのライフサイクルを管理する
Amazon ECR を利用していると、リポジトリ内のイメージのライフサイクルを管理したくなることがある。 たとえば、リポジトリに登録してから xx 日以上たったイメージを削除したりだとか、リポジトリに登録しているイメージの数が xx 個以上になったら古いイメージを削除する、といった感じだ。
Amazon ECR のライフサイクルポリシーを使うと、こういったイメージのライフサイクル管理を詳細に制御できる。
このエントリーでは、「リポジトリに登録して366日 (= 約1年) が経過したイメージを削除する」ライフサイクルポリシーを設定していく。 設定方法としては、管理コンソールから設定する等いろいろな設定方法があるが、このエントリーでは AWS CLI での設定方法と CDK での設定方法を記載していく *1
AWS CLI での設定方法
AWS CLI では、aws ecr put-lifecycle-policy
コマンドにて Amazon ECR のライフサイクルポリシーを設定できる。
まず、ライフサイクルポリシーを記述した JSON を用意しておく。 この JSON は、登録から 366 日以上経ったイメージをタグ付けの有無に関わりなく期限切れにする、というポリシーにしている。
$ cat policy.json { "rules": [ { "rulePriority": 1, "description": "古いイメージを削除する", "selection": { "tagStatus": "any", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 366 }, "action": { "type": "expire" } } ] }
aws ecr put-lifecycle-policy
コマンドを実行し、ライフサイクルポリシーを Amazon ECR のリポジトリに設定する。
ここでは、bob/awesome-tool
というリポジトリに対してライフサイクルポリシーを設定している。
$ aws ecr put-lifecycle-policy --repository-name=bob/awesome-tool --lifecycle-policy-text="file://policy.json"
aws ecr get-lifecycle-policy
コマンドにて、bob/awesome-tool
というリポジトリに設定されているライフサイクルポリシーを取得すると、さきほどの JSON に記載していたとおりのライフサイクルポリシーが設定されている。
$ aws ecr get-lifecycle-policy --repository-name=bob/awesome-tool { "registryId": "xxxxxxxxxxxx", "repositoryName": "bob/awesome-tool", "lifecyclePolicyText": "{\"rules\":[{\"rulePriority\":1,\"description\":\"古いイメージを削除する\",\"selection\":{\"tagStatus\":\"any\",\"countType\":\"sinceImagePushed\",\"countUnit\":\"days\",\"countNumber\":366},\"action\":{\"type\":\"expire\"}}]}", "lastEvaluatedAt": "1970-01-01T09:00:00+09:00" }
CDK での設定方法
CDK では Repository
を定義するときに lifecycleRules
にてライフサイクルポリシーを設定できる。
new ecr.Repository(this, 'bob-awesome-tool-repository', { repositoryName: `bob/awesome-tool`, lifecycleRules: [ { description: "古いイメージを削除する", maxImageAge: cdk.Duration.days(366), tagStatus: ecr.TagStatus.ANY, } ] });
参考サイト
*1:もちろん、CloudFormation 等でも設定できる