[小ネタ]昔作ったAWS BackupのCloudFormationテンプレートをAWS CDK v2で書き直してコード行数削減具合を感じてみた

2022.09.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どーもsutoです。

AWS CDK v2でコード書きたいなーと思っていたので、昔作成したAWS Backup用のCloudformation(以下CFn)テンプレートをCDKのコードにしてみました。

元のCFnテンプレートは以下の記事に載せているものを使います。比較しやすくするため、作成リソースの内容はそのまま(リソース名だけは変えてますが)でCFnとCDK(L2)のコード量がどのくらい違うのか注目してみたいと思います。

実装してみた

AWS CDK v2(TypeScript)でCDKスタックを作成し、デプロイします。

lib/backup-stack.ts

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Duration, aws_backup as backup } from 'aws-cdk-lib';
import { Schedule } from 'aws-cdk-lib/aws-events';

export class CdkBackupStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const backupSelection = new backup.BackupSelection(this, 'MyBackupSelection', {
      backupPlan: new backup.BackupPlan(this, 'MyBackupPlan', {
        backupPlanName: 'backup-plan',
        backupPlanRules: [new backup.BackupPlanRule({
          startWindow: Duration.hours(1),
          completionWindow: Duration.hours(12),
          deleteAfter: Duration.days(14),
          ruleName: 'backup-rule',
          scheduleExpression: Schedule.cron({ minute: '0', hour: '19' }),
        })],
      }),
      resources: [backup.BackupResource.fromTag('backup', 'true'),],
      backupSelectionName: 'backup-selection',
    });
  }
}

ステータスが完了になったらリソースを確認してみます。

想定どおりの設定が出来上がっています。

コード内で定義していなかったVaultやIAMロールもデフォルト設定のものをよしなに新規作成してくれるので、その分コードを書く量を減らすことができますね。

コード全体の行数を比較してみても、CFnテンプレートでは63行なのに対し、CDKでは25行で済んでいます。L2モジュールを積極的に使用していけば少ないコードでスタックを作成できるのでうれしいです。

おまけ

今回はバックアッププランルールのパラメータを指定したかったため、 backupPlanRules 配下にパラメータを書いていますが、極端な話プランさえもデフォルト設定で良いなら、以下のように1行で実装することも可能です。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Duration, aws_backup as backup } from 'aws-cdk-lib';
import { Schedule } from 'aws-cdk-lib/aws-events';

export class CdkBackupStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const backupSelection = new backup.BackupSelection(this, 'MyBackupSelection', {
      backupPlan: new backup.BackupPlan(this, 'MyBackupPlan', {
        backupPlanName: 'backup-plan',
        backupPlanRules: [new backup.BackupPlanRule({ ruleName: 'backup-rule' })],
      }),
      resources: [backup.BackupResource.fromTag('backup', 'true'),],
      backupSelectionName: 'backup-selection',
    });
  }
}

まあ現実的には、基本的にデフォルト設定を利用しつつもバックアップの頻度とスケジュール、リソースの保持期間はユーザーの需要に合わせて指定したいはずなので、「CDKで実装すればコードは数行で済む」という話を聞きますが、実際はパラメータ指定などでもう少し追記が必要ですね。

参考