AWS CloudFormation でリソースをデプロイするときに「意図的に」リソースを残すために DeletionPolicy: Retain
を設定することがある👌しかし AWS CloudFormation スタックを新しく作るときに AWS CloudFormation テンプレートが間違っていてエラーになってしまうとログを見ながらトラブルシューティングが必要になる❗️(よくある)
そのときに AWS CloudFormation スタックのデフォルトの挙動は「ロールバック」になるため,もし DeletionPolicy: Retain
を設定したリソースがあるとそのまま残ってしまう.エラー原因を特定して「さぁ!再デプロイするぞー💪」と思っても,その前にマネジメントコンソールで削除する必要があって,ああ面倒だ〜😇という気持ちになる.
ロールバックを無効化する
ちなみに2021年にリリースされた設定を使うとロールバックを無効化できてトラブルシューティングがしやすくなる👌リリース記事に shortening development cycles(開発サイクルを短縮する)
と書いてあってまさに❗️という感じ.
DeletionPolicy: RetainExceptOnCreate
を設定する
別の選択肢として,2023年にリリースされた DeletionPolicy: RetainExceptOnCreate
を設定することもできる👌簡単に言うとリソースを作るときにエラーになった場合は DeletionPolicy: Delete
の挙動になって,一度リソースを作ったら DeletionPolicy: Retain
の挙動をするという「それは助かる〜」と思う挙動を実現できる.リリース記事のタイトルに to accelerate dev-test cycle(開発とテストのサイクルを加速するため)
と書いてあってこれまたまさに❗️
実は今まで RetainExceptOnCreate
を試したことがなく,最近使う機会があったのでメモを残しておこうと思う📝
1. DeletionPolicy: Retain
の場合
今回は AWS SAM (AWS CloudFormation) で Amazon CloudWatch Logs Group と AWS Lambda 関数をデプロイする.そして Amazon CloudWatch Logs Group に DeletionPolicy: Retain
を設定しつつ,意図的に AWS Lambda 関数に設定する IAM Role を誤った ARN にしておく😇
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: Logs: Type: AWS::Logs::LogGroup Properties: LogGroupName: sandbox-retain-except-on-create DeletionPolicy: Retain Function: Type: AWS::Serverless::Function Properties: FunctionName: sandbox-retain-except-on-create CodeUri: src/ Handler: app.lambda_handler Runtime: python3.12 Architectures: - x86_64 Role: arn:aws:iam::000000000000:role/xxxxx LoggingConfig: LogGroup: !Ref Logs
デプロイをするとエラーになって AWS CloudFormation スタックのステータスは ROLLBACK_COMPLETE になる.
Resource handler returned message: "The role defined for the function cannot be assumed by Lambda.
しかし DeletionPolicy: Retain
を設定しているため Amazon CloudWatch Logs Group は残ってしまう.
2. DeletionPolicy: RetainExceptOnCreate
の場合
今度は Amazon CloudWatch Logs Group に DeletionPolicy: RetainExceptOnCreate
を設定する.
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: Logs: Type: AWS::Logs::LogGroup Properties: LogGroupName: sandbox-retain-except-on-create DeletionPolicy: RetainExceptOnCreate Function: Type: AWS::Serverless::Function Properties: FunctionName: sandbox-retain-except-on-create CodeUri: src/ Handler: app.lambda_handler Runtime: python3.12 Architectures: - x86_64 Role: arn:aws:iam::000000000000:role/xxxxx LoggingConfig: LogGroup: !Ref Logs
デプロイをするとエラーになって AWS CloudFormation スタックのステータスは ROLLBACK_COMPLETE になる.
しかし Amazon CloudWatch Logs Group は消えていた❗️
そして今度は AWS Lambda 関数に設定する IAM Role を正しく修正して,一度デプロイを成功させてから AWS CloudFormation スタックを削除する🗑️
するとリソースを作った後の操作になるため Retain
になって Amazon CloudWatch Logs Group は残っていた👏