既存のECRリポジトリにライフサイクルポリシーを設定するためにcdkとawscliでためしたこと

ECRの既存リポジトリにライフサイクルポリシーを設定しようとして、cdkとawscliで試したことをまとめました。cdkは気をつけないと物凄く嵌ることを実感しました。
2020.08.31

はじめに

ECRリポジトリにアップしたDockerイメージを使ったデプロイ作業を継続して行っているうちに、蓄積されたイメージ数が100を超えていました。開発環境であるため再利用する可能性は低く、ライフサイクルポリシーでの上限管理にcdkによる設定を行おうとして若干の嵌りにあい、最終的にはawscliによる設定となりました。

awscliでの設定に用いたコマンドはもとより、cdkで設定しようとして試行錯誤した経過についてまとめました。

awscliによる実行

aws ecr put-lifecycle-policyにて行います。--repository-name$(aws ecr describe-repositories | jq -r ".repositories[].repositoryName")等指定するとよいでしょう。念の為、目的のリポジトリ名が出ることを確認してください。lifecycle-policy-textは事前に用意したjsonファイルを指定します。

aws ecr put-lifecycle-policy \
    --repository-name $(aws ecr describe-repositories | jq -r ".repositories[].repositoryName") \
    --lifecycle-policy-text file://$(pwd)/lifecycle.json

lifecycle.json

{
    "rules": [
        {
            "rulePriority": 1,
            "description": "assets image limit",
            "selection": {
                "tagStatus": "any",
                "countType": "imageCountMoreThan",
                "countNumber": 10
            },
            "action": {
                "type": "expire"
            }
        }
    ]
}

cdkでの試行錯誤

新規リポジトリの場合RepositoryのInitializerを使うことになりますが、今回は既存リポジトリ。Arnを指定できるのはstaticメソッド経由での呼び出しに限られるため、いくつかあるうちfromRepositoryAttiributesを指定しました。

const repos = Repository.fromRepositoryAttributes(this, 'Image Repos', {
  repositoryArn: <ARN>
})

ここに一つ問題があります。Repository.fromRepositoryAttributesから返るのはIRepositoryです。IRepositoryにはaddLifecycleRule()のメソッドは有りません。

既存コードはDockerImageAssetsを使ってイメージのassetを作っており、そこからrepositoryを引いてみたものの、これもIRepositoryとなります。

あとがき

aws-ecr-assetsaws-ecrの違いについて余り意識したことがなかったのですが、実際に触ってみると中々思ったとおりには行かないものだと実感しました。無理に全てをcdkで行う必要もないため、「このコードを変更するのは骨が折れそうだ」と感じた場合には割り切ってAWSCLIを使うことが無難だと思います。

参考リンク