Amazon ECR のリポジトリにライフサイクルポリシーを設定する方法。
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 等でも設定できる