Open5

カスタムリソースを使ってECRのイメージ、S3のオブジェクトを削除する

kentzkentz

カスタムリソースとは

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

カスタムリソースを使用すると、CloudFormation テンプレートにカスタムプロビジョニングロジックを記述し、スタックを作成、更新 (カスタムリソースを変更した場合)、または削除するたびに CloudFormation にそのロジックを実行させることができます。これは、プロビジョニング要件に、CloudFormation の組み込みリソースタイプでは表現できない複雑なロジックやワークフローが含まれる場合に役立ちます。
  • ECRリポジトリを作成したスタックを削除しようとすると、ECRにイメージが残っている場合ECRの削除に失敗する。(S3も同様)
  • 今まではコンソール上でイメージを削除していたが、面倒作業であるので自動化したい
kentzkentz

AWS::ECR::Repositoryのプロパティにいつの間にかEmptyOnDeleteが追加されている。
(確か今まではなかった)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html

If true, deleting the repository force deletes the contents of the repository. If false, the repository must be empty before attempting to delete it.

EmptyOnDeletetrueにすることでわざわざリポジトリ内のイメージを消さなくても、スタックの削除ができそう

kentzkentz

試してみた。

環境準備

  • cfnファイルの用意
    • EmptyOnDelete: trueを設定する
AWSTemplateFormatVersion: 2010-09-09
Description: > 
  test delete ecr repo
Resources:
  TestRepo:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: "test-repo"
      EmptyOnDelete: true
  • 作成されたリポジトリに適当なイメージをpushする

スタックを削除

問題なくスタックの削除ができた。

コンソール上での作業がなくなるのでだいぶ楽になりそう

kentzkentz

カスタムリソースを試してみる

  • TypeにAWS::CloudFormation::CustomResourceを指定することでカスタムリソースの設定ができる
    • Custom::Stringでもできそう
  • 指定できるプロパティはServiceTimeoutServiceTokenの2つ
  • ServiceTimeoutはカスタムリソースの操作がタイムアウトするまでの時間
    • 1~3600秒の間で設定
    • デフォルトは3600秒(1時間)
  • ServiceTokenでSNSトピックかLambdaのARNを指定してあげる必要がある
    • 更新はできない
    • 連携するリソースは同じリージョンでなければならない

参考
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html