reizist's blog

ウェブ

ECRのイメージ管理がしやすくなっていた

ecsでサービスを動かす場合、大抵の場合は自前イメージをecrに置くことになるんじゃないでしょうか。 ecrには 1000 images/ 1repo というイメージ保有制限が存在し、定期的なクリーンが必要ですが、最近のアップデートでかなり対応しやすくなっていたので共有です

どうやるの

ecrにライフサイクルポリシーを設定します。terraform的にはこうです

resource "aws_ecr_lifecycle_policy" "ecr_image_clean_lifecycle_policy" {
  count      = "${ length(var.ecr-repos) }"
  repository = "${ element(var.ecr-repos), count.index) }"

  policy = <<EOF
{
    "rules": [
        {
            "rulePriority": 1,
            "description": "Expire excess images more than 100",
            "selection": {
                "tagStatus": "any",
                "countType": "imageCountMoreThan",
                "countNumber": 100
            },
            "action": {
                "type": "expire"
            }
        }
    ]
}
EOF
}

variable "ecr-repos" {
  type    = "list"
  default = ["your-great-repo-name"]
}

補足

ちなみにどうやら先々月にライフサイクルポリシー更新され使いやすくなっていて、 対象のイメージフィルタとして

  • タグ
  • 個数
  • 期間

が存在しましたが、以前はタグ付けされているimageの場合prefixを指定する必要がありました。 つまり git sha1などを使いタグ付けをしていた場合はこれらをフィルタできず、実質タグのないimageのみ削除が可能という微妙な感じだったようです。(ちなみに前にいた会社ではcircle ciでcapistrano task経由によりimage clean scriptを走らせていました) 

今回追加された tagStatus: any により、タグ付けされたものも一括で消せるようになり、圧倒的に便利になったのでこれでいけますね。

https://aws.amazon.com/jp/about-aws/whats-new/2018/07/amazon-ecr-lifecycle-policies-adds-filtering-option-for-tagged-i/