いつの間にかCloudFormationがDeletionPolicyのみの更新に対応していました

CloudFormationテンプレートにDeletionPolicyだけでも更新できるようになったよ。
2023.10.04

どういうこと?

以前は既存のCloudFormationスタックに対しDeletionPolicyのみを追加した場合は、リソースの変更がないと判定されてしまい更新ができませんでした。

例えば、以下のVPCを作成するスタックが既にあるとします。

AWSTemplateFormatVersion: 2010-09-09
Description: VPC Stack

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: sample-vpc

これにDeletionPolicyを追加してもリソース自体には変更がないので、スタックの更新ができませんでした。

AWSTemplateFormatVersion: 2010-09-09
Description: VPC Stack

Resources:
  VPC:
    Type: AWS::EC2::VPC
    DeletionPolicy: Retain
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: sample-vpc

もし追加したい場合は、以下ブログのようにダミーのタグを一度追加してから削除するか、他のリソースの更新のついでに行う必要がありました。ちょっと面倒ですよね。

これがいつの間にかできるようになっていました。

AWSドキュメントを確認してみると、英語版ではDeletionPolicy単体で更新できないという記載がなくなっていました(日本語版にはまだDeletionPolicyの記載があったので、是非フィードバックお願いします)

You can't update the CreationPolicy or UpdatePolicy attribute by itself. You can update them only when you include changes that add, modify, or delete resources. For example, you can add or modify a metadata attribute of a resource.

やってみる

上の説明だけで十分かと思いますが、一応やっていきましょう。

先ほど例に挙げた以下のテンプレートでスタックを作成します。

AWSTemplateFormatVersion: 2010-09-09
Description: VPC Stack

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: sample-vpc

スタックの作成が完了したら、DeletionPolicy: Retainを追加したテンプレートで更新します。

AWSTemplateFormatVersion: 2010-09-09
Description: VPC Stack

Resources:
  VPC:
    Type: AWS::EC2::VPC
    DeletionPolicy: Retain
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: sample-vpc

変更セットのプレビューをみると、変更されるリソースとして表示されています。

そのまま更新してみると、問題なく更新が完了しました。

スタックを削除してみても、ちゃんとDeltetionPolicyがRetainになっているのでVPCは残っています。

問題なくDeletionPolicyだけを更新できることが確認できました。

まとめ

試してみたらDeletionPolicyの追加のみでもテンプレートが更新できるようになっていたので書きました。意外と困ることがある部分だったので嬉しいですね。

アップデート記事見かけてなかったんですが、もしどこかにあったら教えてください。