Zenn
📝

今から始める CDK 入門 #1

2023/09/30に公開

概要

CDK をあまり触ったことがないので以下のブログを参考に CDK に入門してみたいと思います。

実践!AWS CDK #1 導入 | DevelopersIO

基本的にはブログの手順通りに実施するので手順についてはブログをご覧ください。
ただし、ブログとは主に以下の点が異なるためエラーの対応方法などは本記事で紹介したいと思います。

  • IDE: Cloud9
  • CDK バージョン: v2

CDK バージョンは v1 と v2 で記述方法などの仕様が異なる点があるため特に注意が必要です。

AWS CDKv2 への移行 - AWS Cloud Development Kit (AWS CDK) v2

Cloud9 環境の作成

まずは CDK を実行するために Cloud9 環境を作成します。
基本的には以下のチュートリアルの手順で環境を作成しますが、ビルド時にある程度スペックがないとメモリ不足のエラーが発生する可能性があるためインスタンスタイプは「t3.small」を選択します。

チュートリアル: Hello AWS Cloud9 (コンソール) - AWS Cloud9

その他の設定はデフォルトのままで作成しました。

IDE を起動して各種バージョンを確認

Cloud9 環境が起動したら IDE を起動して各種バージョンを確認します。
なお、Cloud9 にはデフォルトで CDK や Node.js がインストールされているので、CDK のバージョンを指定する必要がない場合にはデフォルト設定のまま CDK を使用できます。

# CDK バージョンの確認
$ cdk --version
2.96.2 (build 3edd240)

# AWS CLI バージョンの確認
$ aws --version
aws-cli/2.13.20 Python/3.11.5 Linux/4.14.322-246.539.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

# Node.js バージョンの確認
$ node -v
v16.20.2

# npm バージョンの確認
$ npm -v
9.8.1

# TypeScript バージョンの確認 (インストールされていない場合は後述の手順を実施してください)
tsc -v
Version 3.7.5

TypeScript をインストールする方法

$ tsc -v
bash: tsc: command not found

上記メッセージが出力された場合は以下の手順で TypeScript をインストールしてください。

$ mkdir -p ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
$ npm install -g typescript
$ tsc -v
Version 5.7.3

プロジェクトの作成

プロジェクトの作成はブログの手順通り以下のコマンドを実行します。

$ mkdir devio && cd devio
$ cdk init app --language typescript

コマンド実行後、プロジェクトが作成されていれば OK です。

最初のリソース定義

@aws-cdk/aws-ec2 のインストールはブログ通りに以下のコマンドを実行します。

$ npm install @aws-cdk/aws-ec2

devio-stack.ts の編集

devio-stack.ts についてはブログ通りに編集すると v1 と v2 の違いによりエラーが発生します。

  • ブログ (v1) の定義
lib/devio-stack.ts
import * as cdk from '@aws-cdk/core';
import { Vpc } from '@aws-cdk/aws-ec2'; // <- 追加

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

    new Vpc(this, 'Vpc'); // <- 追加
  }
}

上記のコードを v2 のプロジェクトに定義すると以下のようにエラーが発生します。

Argument of type 'this' is not assignable to parameter of type 'Construct'.
Type 'DevioStack' is missing the following properties from type 'Construct": onValidate, onPrepare, onSynthesize

上記エラーは v1 と v2 での記述の差異が原因です。

v1 のドキュメント
v2 のドキュメント

v2 のドキュメントを確認すると、import する対象が異なることがわかります。

# v1
import * as ec2 from '@aws-cdk/aws-ec2';

# v2
import * as ec2 from 'aws-cdk-lib/aws-ec2';

v2 の定義に従い import の form 以降を書き換えます。

lib/devio-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
import { Vpc } from 'aws-cdk-lib/aws-ec2'; // <- 追加

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

    // The code that defines your stack goes here

    // example resource
    // const queue = new sqs.Queue(this, 'DevioQueue', {
    //   visibilityTimeout: cdk.Duration.seconds(300)
    // });
    new Vpc(this, 'Vpc'); // <- 追加
  }
}

v2 の定義に修正したことでエラーも解消しました。

このように v1 と v2 では仕様が異なる部分があるので、エラーが発生した場合はバージョンごとのドキュメントを確認することも必要です。

テンプレートの作成

ブログ通りに cdk synth コマンドを実行します。

$ cdk synth

cdk.out ディレクトリ配下に DevioStack.template.json という CloudFormation テンプレートが作成されました。

エラーが発生した場合

$ cdk synth
Error: Cannot retrieve value from context provider vpc-provider since account/region are not specified at the stack level. Configure "env" with an account and region when you define your stack.See https://docs.aws.amazon.com/cdk/latest/guide/environments.html for more details.

上記のようなエラーが発生した場合、bin/devio.ts を以下のように編集します。

bin/devio.ts
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { DevioStack } from '../lib/devio-stack';

const app = new cdk.App();
new DevioStack(app, 'DevioStack', {
  
  env: {
      account: process.env.CDK_DEFAULT_ACCOUNT,
      region: process.env.CDK_DEFAULT_REGION,
  },
});

初回の作業

ブログ通りに cdk bootstrap コマンドを実行します。

$ cdk bootstrap

CloudFormation コンソールを確認すると「CDKToolkit」というスタックがデプロイされていることがわかります。
CDK でのデプロイに必要なリソースを自動的に作成してくれたようです。

デプロイ

ブログ通りに cdk deploy コマンドを実行します。
途中で変更内容をデプロイしてもよいかどうかの確認が入るので y を入力してエンターキーを押します。

$ cdk deploy
(中略)
Do you wish to deploy these changes (y/n)? y

CloudFormation コンソールを確認すると DevioStack というスタックでデプロイが進行していることがわかります。

VPC 以外のリソースが作成されている理由についてはブログで説明されていますので詳しくはブログをご覧ください。

リソースの削除

ブログ通りに cdk destroy コマンドを実行します。
途中で削除の確認が入るので y を入力してエンターキーを押します。

$ cdk destroy
(中略)
Are you sure you want to delete: DevioStack (y/n)? y

CloudFormation コンソールを確認すると DevioStack が削除中であることがわかります。
なお、削除されるスタックは DevioStack のみであり CDKToolkit は削除されません。

これでブログの手順は完了です。

まとめ

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

  • import の定義

今後もブログの手順を実行しつつ v2 での相違点を紹介してきたいと思います。

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

参考資料

Discussion

ログインするとコメントできます