こんにちは、ちゃりおです。
デフォルトではCDKでECRを作成して、「cdk destroy」で削除したときにECRのリポジトリが残ります。
検証時は、「cdk destroy」でスタック削除と同時に消えてほしいです。
やり方を調べました。
結論から書くと、ecrのプロパティで「removalPolicy: cdk.RemovalPolicy.DESTROY」にするだけです。
Cloudformationにも触れつつ、解説します。
ECRを「cdk destroy」時に削除する
やりたいこと
「cdk destroy」と同時に、ECRのリポジトリを消したいです。
こんな感じでECRを作成します。
new ecr.Repository(this, "repo", {
repositoryName: "sample-app-repo",
}
CDKでデプロイして、リポジトリを作成します。
$ cdk deploy
# リポジトリが作成される
$ aws ecr describe-repositories --query "repositories[].repositoryName" | grep sample-app-repo
"sample-app-repo",
CDKでスタックを削除します。しかし、リポジトリが削除されません。
$ cdk destroy
# リポジトリが削除されない
$ aws ecr describe-repositories --query "repositories[].repositoryName" | grep sample-app-repo
"sample-app-repo",
なぜ削除できないか
リポジトリの「DeletionPolicy」が「Retain」になっているから削除されませんでした。
CloudFormationのドキュメントを見てみると下記のような記述がありました。
AWS CloudFormation はスタックを削除する際、リソースやコンテンツを削除せず保持します。この削除ポリシーは、あらゆるリソースタイプに追加することができます。AWS CloudFormation がスタックの削除を完了すると、スタックの状態は Delete_Complete になりますが、保管されたリソースはその後も存在し続けます。それらのリソースを削除するまでは、対象料金が課金されます。
「Retain」だとスタック削除時もリソースは存在し続けます。
$ cdk synth
~~~省略~~~
Resources:
repoBEC318EA:
Type: AWS::ECR::Repository
Properties:
RepositoryName: sample-app-repo
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
~~~省略~~~
リポジトリを削除できるようにする
「DeletionPolicy」を「Delete」に変更します。
new ecr.Repository(this, "repo", {
repositoryName: "sample-app-repo",
removalPolicy: cdk.RemovalPolicy.DESTROY
}
生成されるCloudFormationを見てみると「Delete」に変更されました。
$ cdk synth
~~~省略~~~
Resources:
repoBEC318EA:
Type: AWS::ECR::Repository
Properties:
RepositoryName: sample-app-repo
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
~~~省略~~~
これで「cdk destroy」時に、リポジトリも同時に削除されるようになりました。
まとめ
上記の設定を変更したことで、検証時にスタックの作成・削除が楽になりました。
想定した動作になっていない場合は、CloudFormation確認するのが大切だと思いました。