削除保護を設定したいCloudFormation StackをCDKで管理している場合の注意点

2022.11.05

こんにちは、CX事業本部 IoT事業部の若槻です。

CloudFormation Stackには削除保護(termination protection)機能があり、これを有効にすると操作ミスなどによるStackの誤削除を防ぐことができます。

今回は、削除保護を設定したいCloudFormation StackをAWS CDKで管理している場合の注意点を2点ご紹介します。

注意点

1. 削除保護設定はCDK側の指定が優先される

まず、CloudFormation Stackの削除保護はコンソールやAPIから手動で設定可能です。

既定では削除保護が無効(Disabled)となっています。

削除保護設定を有効(Enabled)に変更して保存します。

有効化後に削除を試してみると、削除保護を無効にしろと怒られるようになりました。ちゃんと効いてますね。

ここで前述のStack(AwsCdkAppStack)をCDKで管理している場合の挙動はどうなるでしょうか。Deployしたら削除保護設定が上書きされるのでしょうか。

次のAwsCdkAppStackをCDK Deployします。

bin/aws-cdk-app.ts

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { AwsCdkAppStack } from '../lib/aws-cdk-app-stack';

const app = new cdk.App();
new AwsCdkAppStack(app, 'AwsCdkAppStack');
cdk deploy '*'

CDK Deploy後にコンソールを確認すると削除保護が無効化されていました。やはり上書きされてしまうようです。

削除保護の有効化を保持するためには、CDK管理のStackの削除保護を有効にしたい場合はterminationProtectiontrueを指定します。

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { AwsCdkAppStack } from '../lib/aws-cdk-app-stack';

const app = new cdk.App();
new AwsCdkAppStack(app, 'AwsCdkAppStack', { 
  terminationProtection: true 
});

terminationProtectionは既定ではfalseのため、先程のDeployでは無効で上書きされたようです。

terminationProtection?
Type: boolean (optional, default: false)

Whether to enable termination protection for this stack.

再度CDK Deployをすると、今度は削除保護がちゃんと有効化されました。

cdk deploy '*'

2. 削除保護設定には権限が必要

削除保護設定を有効または無効に変更する際には、cloudformation:UpdateTerminationProtectionActionの権限が必要です。

{
    "Version":"2012-10-17",
    "Statement":[{
        "Effect":"Allow",
        "Action":[
            "cloudformation:UpdateTerminationProtection"
        ],
        "Resource":"*"
    }]
}

以前にcloudformation:UpdateTerminationProtectionをAction権限に追加し忘れたままCDKで削除保護を有効にしようとした際にデプロイが権限不足で失敗してしまったことがありました。

        new aws_iam.PolicyStatement({
          effect: aws_iam.Effect.ALLOW,
          actions: [
            's3:getBucketLocation',
            's3:List*',
            'cloudformation:CreateStack',
            'cloudformation:CreateChangeSet',
            'cloudformation:DeleteChangeSet',
            'cloudformation:DescribeChangeSet',
            'cloudformation:DescribeStacks',
            'cloudformation:DescribeStackEvents',
            'cloudformation:ExecuteChangeSet',
            'cloudformation:GetTemplate',
            'cloudformation:UpdateTerminationProtection', //削除保護を設定する場合はこれを追加
          ],
          resources: [
            'arn:aws:s3:::*',
            `arn:aws:cloudformation:${region}:${accountId}:stack/CDKToolkit/*`,
            `arn:aws:cloudformation:${region}:${accountId}:stack/*/*`,
          ],
        }),

CI/CDパイプラインに使用するIAMは権限を必要最低限に絞っている場合がほとんどだと思うので、追加し忘れにご注意ください。

おわりに

削除保護を設定したいCloudFormation StackをAWS CDKで管理している場合の注意点でした。削除保護はStack自体の設定なので、CDKで設定するという意識が初めは持てておらず、少しハマりました。削除保護設定自体はとても有用なので頻繁にDestroyをするStackなどでなければ積極的に有効化するようにしましょう。

参考

以上