実践!AWS CDK #1 導入

題字・息子たち
2021.05.15

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

はじめに

最近、モバイルアプリエンジニアから AWS のインフラエンジニアにジョブチェンジしました。田中圭介です。
CloudFormation(以下 CFn)を一通り学習し AWS CDK に手を出し始めたので、本ブログにてこれから数回に渡り AWS CDK で実践的なインフラ構築を行いたいと思います。

まず皆さん、AWS アカウントの環境を整えてください。
次に IDE, AWS CLI, Node.js を用意していただけますか。
ここからがマグマなんです。

それでは始めましょう!

AWS CDK とは

ざっくり解説。

  • CDK は Cloud Development Kit の略
  • AWS の環境を一般のプログラミング言語で記述し構築するためのツールキット
  • バックエンドは CFn
  • オープンソースのソフトウェア開発フレームワーク
  • テストコードが記述できる <- 激アツ

CFn との大きな違いは 抽象化可能 という部分でしょう。CFn では似たような属性を持つリソースがある場合でも、それらの定義をベタ書きするしか方法がありませんでした。しかし CDK は複数のプログラミング言語がサポートされており、それらの言語の強みを活かすことでより少ないコード量でリソースを定義することが可能となります。
また CDK はデプロイ時に CFn のテンプレートを作成してそれを実行します。よって CFn の知識は十分に活用できるため、これまで CFn で多くの経験を積んできたインフラエンジニアこそ今後 CDK を利用していくべきではないでしょうか。

AWS CDK のインストール

以下のコマンドを実行します。

$ npm install -g aws-cdk

これで CDK がインストールされました。簡単ですね。

次にバージョンを確認してみましょう。

$ cdk --version

1.104.0 (build 44d3383)

ちゃんとインストールできているようですね。

なお私は IDE には Visual Studio Code(VS Code) を、プラグラミング言語には TypeScript を使用します。以下に私の環境を記載します。

環境 バージョン
macOS 10.15.7
VS Code 1.56.2
AWS CLI 2.1.39
AWS CDK 1.104.0
TypeScript 4.2.4
Node.js v16.1.0

プロジェクトの作成

まずは空のディレクトリを作成し、そのディレクトリに移動します。ここでのディレクトリ名は CDK のプロジェクト名となります。

$ mkdir devio && cd devio

続いて cdk init コマンドでプロジェクトを作成します。

$ cdk init app --language typescript

~ 省略 ~
All done!

これでプロジェクトが作成されました。以下のようなファイル群が自動生成されます。

1

最初のリソース定義

手始めに VPC を作成してみましょう。
Vpc クラスを利用するためにはパッケージ @aws-cdk/aws-ec2 をインストールする必要があります。以下のコマンドを実行してください。

$ npm install @aws-cdk/aws-ec2

added 10 packages, removed 7 packages, and audited 779 packages in 6s
~ 省略 ~

パッケージがインストールされました。
今後もこのように利用するクラスによって必要なパッケージをインストールしていきます。

続いて devio-stack.ts を以下のように編集します。

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'); // <- 追加
  }
}

このファイル devio-stack.ts に定義されている DevioStack が CFn のスタックを表しており、今後はこのクラスに構築したいリソースを追加していくことになります。

テンプレートの作成

cdk synth コマンドを使用して、コードから CFn のテンプレートを生成(synthesize: CDK の用語らしい)します。

$ cdk synth

Resources:
  Vpc8378EB38:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: DevioStack/Vpc
    Metadata:
      aws:cdk:path: DevioStack/Vpc/Resource
~ 省略 ~

テンプレートが生成されました。
ここに記載されているリソースが次の cdk deploy コマンドで AWS クラウド上に構築されることになります。

初回の作業

AWS CDK のアプリを環境(アカウント/リージョン)に初めてデプロイする場合は初期設定を行います。cdk bootstrap コマンドを実行しましょう。

$ cdk bootstrap

これによりデプロイプロセスの際に使用される CFn のテンプレートやアセットを保存するための S3 バケットが作成されます。

デプロイ

いよいよデプロイです。cdk deploy コマンドを実行します。

$ cdk deploy

DevioStack: deploying...
DevioStack: creating CloudFormation changeset...

~ 省略 ~

DevioStack

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:xxxxxxxx

はい、デプロイが完了しました。デプロイの様子は CFn のコンソール上でも確認できます。

このデプロイにより VPC 1 つ、サブネット 4 つ、ルートテーブル 4 つ、インターネットゲートウェイ 1 つ、Elastic IP 2 つ、NAT ゲートウェイ 2 つが作成されました。

・・・ちょっと・・・・・・・・そんなに頼んでないんですけど!!!

Construct

CDK 上においてクラウドコンポーネントは Construct という単位の基本ビルディングブロックとして提供されており、リソース作成に必要なすべてがカプセル化されています。そしてこの Construct は以下の 3 つのレイヤーに分けられています。

  • L3: Patterns
    • 複数のリソースを含む構成パターンを事前定義したもの
  • L2: High-level constructs
    • デフォルト値や便利なメソッドを定義した AWS リソースを表すクラス
  • L1: Low-level constructs
    • CFn リソースおよびプロパティと 1:1 で対応

今回のサンプルで使用したクラス(Construct)Vpc は L2 であり、それを作成することでネットワーク構築に必要な(ベストプラクティスとされる)他のリソースが適切な設定値で軒並み一緒に作られてしまったというわけです。
細かい設定は気にせず、すぐに動くものをデプロイしたいという方には都合がいいかもしれませんが、インフラエンジニアとしては各リソースのプロパティは細かくカスタマイズしたいものです。

そんな時は L1 の Low-level Construct を使いましょう。
CDK では各リソースを表すクラスに Cfn というプレフィックスが付いた L1 のものが用意されています。このクラスを利用することで CFn と同等の制御が可能となります。よって私も今後は L1 の Construct を使用し、本ブログではそれらに関する紹介をさせていただきたいと思います。

Vpc に該当する L1 の Construct は CfnVPC となります。次回は改めてこのクラスを利用して VPC を構築していきましょう。

リソースの削除

今回作成したリソースを削除しましょう。特に、意図せず作成してしまった NAT ゲートウェイは比較的料金がかかるサービスなのでお忘れなく。
スタックを削除するには cdk destroy コマンドを実行します。

$ cdk destroy

Are you sure you want to delete: DevioStack (y/n)? y
DevioStack: destroying...

~ 省略 ~

DevioStack: destroyed

これでキレイになりました。

GitHub

作成したソースコード一式は GitHub に公開していきます(今回のタグは コチラ)。今後も新しい記事を書くたびに更新していこうと思うので、よろしければ参考にしてみてください。

README にも記載していますが node_modules/ は git 管理外としていますので、プロジェクトを実行する際は npm install コマンドを実行して必要なモジュールをインストールしてください。

おわりに

このような流れで AWS CDK に関する解説をしていきたいと思います。
以下、このシリーズの特徴です。

  • AWS CDK の魅力を少しずつ伝える
  • IDE は VS Code
  • プログラミング言語は TypeScript
  • 利用する主な Construct は L1 の Cfn プレフィックスが付いたクラス
  • GitHub でコードを公開
    • 記事ごとにタグ付け

このような条件がマッチする方は、よろしければ今後もウォッチしてみてください。

リンク