kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CloudFormation の DeletionPolicy: RetainExceptOnCreate を試す

AWS CloudFormation でリソースをデプロイするときに「意図的に」リソースを残すために DeletionPolicy: Retain を設定することがある👌しかし AWS CloudFormation スタックを新しく作るときに AWS CloudFormation テンプレートが間違っていてエラーになってしまうとログを見ながらトラブルシューティングが必要になる❗️(よくある)

docs.aws.amazon.com

そのときに AWS CloudFormation スタックのデフォルトの挙動は「ロールバック」になるため,もし DeletionPolicy: Retain を設定したリソースがあるとそのまま残ってしまう.エラー原因を特定して「さぁ!再デプロイするぞー💪」と思っても,その前にマネジメントコンソールで削除する必要があって,ああ面倒だ〜😇という気持ちになる.

ロールバックを無効化する

ちなみに2021年にリリースされた設定を使うとロールバックを無効化できてトラブルシューティングがしやすくなる👌リリース記事に shortening development cycles(開発サイクルを短縮する) と書いてあってまさに❗️という感じ.

aws.amazon.com

docs.aws.amazon.com

DeletionPolicy: RetainExceptOnCreate を設定する

別の選択肢として,2023年にリリースされた DeletionPolicy: RetainExceptOnCreate を設定することもできる👌簡単に言うとリソースを作るときにエラーになった場合は DeletionPolicy: Delete の挙動になって,一度リソースを作ったら DeletionPolicy: Retain の挙動をするという「それは助かる〜」と思う挙動を実現できる.リリース記事のタイトルに to accelerate dev-test cycle(開発とテストのサイクルを加速するため) と書いてあってこれまたまさに❗️

aws.amazon.com

実は今まで 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 は残っていた👏