📝

今から始める CDK 入門 #3

2023/10/11に公開

今から始める CDK 入門シリーズの 3 回目です。

各回については以下のリンクからご覧ください。

  1. 今から始める CDK 入門 #1
  2. 今から始める CDK 入門 #2

前回は実践!AWS CDK #2 VPC | DevelopersIO を参考に以下の内容を実施しました。

  • L1 の CfnVPC クラスを使用して VPC だけを作る

今回は実践!AWS CDK #3 テスト | DevelopersIO を実施します。

AWS CDK におけるテスト

CDK V1 では以下の 3 つの方法について紹介されていますので詳しくはブログをご覧ください。

  • Snapshot tests
  • Fine-grained assertions
  • Validation tests

CDK V2 では以下の 2 つの方法がドキュメントに記載されていました。

  • Snapshot tests
  • Fine-grained assertions

Testing constructs - AWS Cloud Development Kit (AWS CDK) v2

インストール

まずはブログ通りに必要なフレームワークをインストールします。

$ npm install --save-dev jest @types/jest @aws-cdk/assert

フレームワークのインストール後、ブログでは package.json を編集しています。
しかし、私の環境では以下の部分の定義を追記したことでテストコマンド実行時にエラーが発生しました。

package.json
"jest": {
    "moduleFileExtensions": ["js"]
  }
$ npm run build && npm test

● Multiple configurations found:

    * /home/ec2-user/environment/devio/jest.config.js
    * `jest` key in /home/ec2-user/environment/devio/package.json

  Implicit config resolution does not allow multiple configuration files.
  Either remove unused config files or select one explicitly with `--config`.

  Configuration Documentation:
  https://jestjs.io/docs/configuration

エラーメッセージから、jest に関する設定ファイルが複数存在することが原因であると思われたため package.json から上記 jest の追記部分を削除したところエラーが解消しました。

エラー解消時の package.json は以下の通りです。

package.json
{
  "name": "devio",
  "version": "0.1.0",
  "bin": {
    "devio": "bin/devio.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@aws-cdk/assert": "^2.68.0",
    "@types/jest": "^29.5.5",
    "@types/node": "20.5.9",
    "aws-cdk": "2.96.2",
    "jest": "^29.7.0",
    "ts-jest": "^29.1.1",
    "ts-node": "^10.9.1",
    "typescript": "~5.2.2"
  },
  "dependencies": {
    "@aws-cdk/aws-ec2": "^1.204.0",
    "aws-cdk-lib": "2.96.2",
    "constructs": "^10.0.0",
    "source-map-support": "^0.5.21"
  }
}
$ npm run build && npm test

> devio@0.1.0 build
> tsc


> devio@0.1.0 test
> jest

 PASS  test/devio.test.ts (8.549 s)
  ✓ SQS Queue Created (3 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.82 s
Ran all test suites.

ブログの出力とは異なりますがテストコマンド自体は成功することが確認できました。

実装

テストコードについてもブログとは異なる点がありました。

まず、デフォルトで生成される devio.test.ts はブログとは異なり以下の内容でした。

test/devio.test.ts
// import * as cdk from 'aws-cdk-lib';
// import { Template } from 'aws-cdk-lib/assertions';
// import * as Devio from '../lib/devio-stack';

// example test. To run these tests, uncomment this file along with the
// example resource in lib/devio-stack.ts
test('SQS Queue Created', () => {
//   const app = new cdk.App();
//     // WHEN
//   const stack = new Devio.DevioStack(app, 'MyTestStack');
//     // THEN
//   const template = Template.fromStack(stack);

//   template.hasResourceProperties('AWS::SQS::Queue', {
//     VisibilityTimeout: 300
//   });
});

ほとんどコメントアウトされており、デフォルトでは「SQS Queue Created」というメッセージが出力されるだけの状態です。
import 部分などもブログとは異なっていますので V2 の仕様に合わせた結果、以下のテストコードになりました。

test/devio.test.ts
import * as cdk from 'aws-cdk-lib';
import { Template } from 'aws-cdk-lib/assertions';
import * as Devio from '../lib/devio-stack';

test('Vpc', () => {
  const app = new cdk.App();
    // WHEN
  const stack = new Devio.DevioStack(app, 'MyTestStack');
    // THEN
  const template = Template.fromStack(stack);

  template.resourceCountIs('AWS::EC2::VPC', 1)
  template.hasResourceProperties('AWS::EC2::VPC', {
    CidrBlock: '10.0.0.0/16',
    Tags: [{ 'Key': 'Name', 'Value': 'devio-stg-vpc' }]
  });
});

主な相違点は以下の通りです。

import するライブラリが変更になったことで使用するクラスも変わっています。
クラスが変わったことで使用するメソッドも変わっています。

  • countResourcesresourceCountIs
  • haveResourcehasResourceProperties

クラスやメソッドは変わっていますが、テストしている内容自体はブログと同様です。

確認

V2 の仕様に合わせたテストコードで再度テストコマンドを実行します。

$ npm run build && npm test

> devio@0.1.0 build
> tsc


> devio@0.1.0 test
> jest

 PASS  test/devio.test.ts (7.598 s)
  ✓ Vpc (32 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        7.681 s, estimated 9 s
Ran all test suites.

出力メッセージが「Vpc」に変わっていますので、VPC に対するテストの実行結果であることがわかります。
これで V2 のテストコードでもテストができました。

まとめ

今回の手順でブログと大きく異なる点は以下の点でした。

  • package.json 内の jest の追記部分が不要
  • デフォルトのテストコード
  • テストで使用する import するライブラリ
  • テストで使用するクラスやメソッド

次回は実践!AWS CDK #4 Context | DevelopersIO を実施します。

今から始める CDK 入門 #4 へ続く

参考資料

Discussion