全力で怠けたい

怠けるために全力を尽くしたいブログ。

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 等でも設定できる