オンラインワークショップでAWS CDK を体験する

AWS運用自動化サービス「Cloud Automator」

こんにちは、技術4課の多田です。

昨年、「AWS Cloud Development Kit」(以下、AWS CDK) が開発者プレビューですが、発表されました。

AWS CDK 開発者プレビュー

GitHub – awslabs/awscdk

AWS CDK」の特徴は、プラグラマブルに CloudFormation のプロビジョングができるので、アプリケーションの開発からインフラまで一貫した開発を行えるのがメリットになります。

今回は CDK Workshop を使って、「AWS CDK」を使ってみます。

普段は CloudFormaiton を使ってプロビジョニングを行なっているので、 CloudFormation との使いっぷりを気にしつつ触っていきます。

TL;DR

  • CDK のワークショップを使って、 CDK を実践した
    • サンプルプロジェクトとサーバーレス構成を作った
  • CDK を使ってみて CloudFormation との比較をした

AWS CDK の概要

AWS CDK」 はコードでクラウドインフラストラクチャを定義し、CloudFormation でプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。

サポートされている言語は以下の通りです。今後は Python もサポート予定とのことです。

  • TypeScript
  • JavaScript
  • Java
  • .Net

AWS CDK の実践

準備作業

環境は、AWS Cloud(以下、Cloud9) を使います。「AWS CDK」には以下の要件が必要です。

  • AWS CLI
  • Node.js (バージョンが8.11以上)

Cloud9 には AWS CLI がインストールされているのでインストール不要です。

また、Cloud9 のデフォルトの Node.js ではバージョンが満たしてないため、バージョンをあげます。

ワークショップでは、バージョンを「v8.12.0」にする必要があるため左記バージョンまでアップデートします。

次に、「AWS CDK」も導入します。ワークショップでは、バージョンを意図的に「0.22」を指定しています。

東京リージョンにリソースを作りたいので、「AWS_DEFAULT_REGION」の変数をセットします。

AWS CDK」のコマンドで cdk doctor コマンドを打つと現状の設定を確認できて便利なので、上記の変数をセットした後確認します。

AWS CDK プロジェクトの作成

次に TypeScript のサンプルプロジェクトを作成していきます。

プロジェクト関連ファイルについて解説があったためまとめます。

  • lib/cdk-workshop-stackts.ts はCDKアプリケーションのメインスタックが定義される
  • bin/cdk-workshop.ts はCDKアプリケーションのエントリポイントになる
  • lib/cdk-workshop-stack.ts で定義されているスタックをロードされる
  • package.json はnpmモジュールのマニフェストファイルである
  • cdk.json はツールキットにアプリの実行方法を指示する
    • 今回は node bin/cdk-workshop.js になる
  • tsconfig.json はTypeScriptの設定が定義される
  • node_modules ディレクトリにはnpmによって管理され、プロジェクトのすべての依存関係を含まれる

サンプルプロジェクトでは、以下のリソースを作ります。

  • SQS キュー
  • SNS トピック
  • SQS キューを SNS トピックでサブスクライブ

アプリケーションコードから CloudFormation テンプレートの確認とデプロイ

cdk synth を実行すると CDK で作る、 CloudFormation のテンプレートを確認できます。

 

続いて、CloudFormation のデプロイを行なっていきます。

AWS CDK」アプリを初めてデプロイするときに「bootstrap stack」をインストールする必要があります。

bootstrap stack」では、CloudFormation テンプレートを格納する S3 が用意されます。

コマンドが成功すると、 CloudFormation スタックが作成されS3バケットが作成されます。

 CloudFormation のコンソールを確認するとスタックが出来上がっているのを確認できました。 

次の作業のためにサンプルで作成したリソースを削除します。

lib/cdk-workshop-stack.tsを以下のように編集します。

変更後のリソースの変化の確認の仕方は、cdk diff で確認可能です。

変更内容が問題なければ、再度 cdk deploy を実行します。

Lambda と API Gateway の構成方法

次に、AWS Lambda(以下、Lambda)、Amazon API Gateway(以下、APIGW)のサーバーレス構成を CDK で行います。

まず最初に、Lambda のコードを作成します。

binやlibと同じ階層に lambda/hello.js を作成し、以下のコードを記載します。

APIGW の URI にアクセスすると、「Hello, CDK! You’ve hit /(アクセスしたパス)」と返すコードになります。

加えて、 Constructs ライブラリを追加します。このライブラリは AWS サービスごとにあり、AWSのベストプラクティスに従った設定を内包しています。

今回でいうと、 Lambda を定義したり、 APIGW を定義するには上記のライブラリをインストールする必要があります。

 

APIGW と Lambda を統合するコードを lib/cdk-workshop-stack.tsに追記します。

cdk diff で変更箇所の確認してみます。

それでは、デプロイしてみます。

デプロイされたエンドポイントに対して、アクセスしてみたら想定通りの結果が帰ってきました。

DynamoDB リソースの追加

次に、Amazon DynamoDB(以下、DynamoDB)のリソースを追加します。

アクセスした URI のパスを DynamoDB のテーブルに記録する処理を定義するものを定義します。

まずは、DynamoDB の Constructs ライブラリをインストールします。

lambda/hitcounter.js に以下のコードを追加します。

lib/hitcounter.ts は次のように編集します。

lib/cdk-workshop-stack.ts は次のように編集します。

それではデプロイします。

URI にアクセスしてみます。

3回アクセスしたので、 DynamoDB のテーブルに3つレコードが登録されていることを確認できました。最後は、作ったリソースを削除しますが、cdk destroy を実行します。

AWS CDK と CloudFormation の比較考察

AWS CDK」を使ってみてのメリット/デメリットを CloudFormation を使う場合と比較してみます。

AWS CDK と CloudFormation を比較してみて感じたメリット

  • 普段書き慣れている言語であれば、YAML や JSON の CloudFormation よりは書きやすい
  • 感覚的にリソースのデプロイが CloudFormation よりは簡易
    • !Ref のような関数を使わなくても関連リソースの定義ができるのはよかった
    • 例えば、Lambda の IAM ロール設定が table.grantReadWriteData(this.handler.role); だけなので、CloudFormation のように ARN を指定しなくていいのでシンプルだと感じた
  • IDEで書いているため、コードの中でのライブラリ定義の参照元などをすぐに調べやすい

AWS CDK と CloudFormation を比較してみて感じたデメリット

  • サポートされてる言語の習得が必須であること
  • 自由度が高く CloudFormation テンプレートを書けるのでプロジェクト内での運用ルールを考える必要はありそう
  • CloudFormation のサポートしている JSON や YAMLの方が開発者が馴染むのなら CloudFormation の方が良い

まとめ

AWS CDK」を使った AWS リソース構成の実践と、 CloudFormation との使い分けを自分なりに考察してみました。

現状サポートされている言語が少ないものの、個人的には今後の Python サポートが楽しみです。

プログマブルに条件分岐や繰り返しの処理などを組み合わせて、 CloudFormation だけではできなかった運用ができそうです。

なお、 Constructs ライブラリのレファレンスはこちらです。

本リリースまでに CloudFormation で作ったソースを置き換えたりしてみて更に使い込んでみたいです。

AWS運用自動化サービス「Cloud Automator」