はじめに
前回の記事では、AWS CDKを使った複数リソースの連携についてご紹介しました。今回はさらに進んで、CDKでのテスト手法ついて解説します。これにより、インフラ作成/変更の信頼性を高めリリースできるようになります。今回はCDKの構成が正しいことを確認するための簡単なテストを導入してみましょう。
AWS CDKのテスト方法
コードでインフラを管理する場合、アプリケーションコードと同様に、CDKで作成したインフラのコードもテストすることが重要です。CDKには、ユニットテストやインテグレーションテストなどのテスト手法をサポートするための機能が用意されています。AWS CDKは、Jestなどの一般的なテストフレームワークと連携して動作します。TypeScriptプロジェクトの場合は、Jestを使用するのが一般的で、プロジェクトのセットアップ時に自動でtestディレクトリなど必要なファイルが自動で生成されます。
テストの下準備
aws-cdk-stack.tsファイルを今回のユニットテスト用に以下のように編集しておきましょう。
import * as cdk from 'aws-cdk-lib';
import { Stack, StackProps } from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
// スタックの定義
export class AwsCdkStack extends Stack {
constructor(scope: cdk.App, id: string, props?: StackProps) {
super(scope, id, props);
// バージョニングが有効なS3バケットを作成
new s3.Bucket(this, 'VersionedBucket', {
versioned: true, // バージョニングを有効化
});
}
}
ユニットテストの作成
AWS CDKのユニットテストでは、スタックが期待どおりにリソースを定義しているかをチェックします。以下は、S3バケットが正しく作成されているかをテストするコードの例です。”test”ディレクトリにある、”aws-cdk.test.ts”を以下のように編集しましょう。
import * as cdk from 'aws-cdk-lib';
import { Template } from 'aws-cdk-lib/assertions';
import { AwsCdkStack } from '../lib/aws-cdk-stack';
let app: cdk.App;
let stack: AwsCdkStack;
let template: Template;
beforeEach(() => {
// テスト用のセットアップ
app = new cdk.App();
stack = new AwsCdkStack(app, `MyUniqueTestStack-${Date.now()}`); // ユニークなスタック名を付加
template = Template.fromStack(stack);
});
test('Only One S3 Bucket Exists', () => {
// S3バケットが1つだけ作成されていることを確認
template.resourceCountIs('AWS::S3::Bucket', 1);
});
test('S3 Bucket Created with Versioning Enabled', () => {
// S3バケットにバージョニングが有効化されていることを確認
template.hasResourceProperties('AWS::S3::Bucket', {
VersioningConfiguration: {
Status: 'Enabled'
}
});
});
このテストでは、AWS::S3::Bucketリソースが一つだけ作成され、バージョニングを有効化した状態で作成されているかを確認しています。Template.fromStackを使ってCDKのスタックを抽象的に取得し、それをもとに検証を行います。
リソース数の検証
特定のリソースがいくつ作成されているかを確認するには、resourceCountIsメソッドを使用します。第二引数に期待するリソース数を指定することでテストを行います。
バージョニングの検証
hasResourcePropertiesメソッドは、特定のリソースタイプが期待されるプロパティを持っているかを検証します。第一引数にはリソースタイプ(例: AWS::S3::Bucket)、第二引数にはプロパティの条件を指定します。
ユニットテストの実行
では、実際にユニットテストを実行してみましょう。
npm test
> aws-cdk@0.1.0 test
> jest
PASS test/aws-cdk.test.ts (17.907 s)
√ Only One S3 Bucket Exists (796 ms)
√ S3 Bucket Created with Versioning Enabled (219 ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 18.181 s, estimated 34 s
Ran all test suites.
成功すると、Jestは「PASS」というメッセージを表示され、その下にどのPASSしたテストがリストで表示されます。失敗した場合は、どのテストが失敗したのか、その理由を詳細に確認することができます。
まとめ
AWS CDKでのユニットテストを導入することで、インフラ構成の品質を確保し、安心してデプロイを進めることができます。今回紹介したユニットテストは、開発プロセスにおける品質向上の第一歩で、今回の記事で紹介したテスト用のメソッド以外にも、多くのメソッドが用意されています。公式ドキュメントを参照して、ご自身の環境にあったテストを構成してみるとさらなる信頼性を確保することができるかと思います。