第35回 - CDKで新しいIaCを体験しよう

2/21 に第35回ZEALOT勉強会を実施しました。

テーマは、「CDKで新しい IaC を体験しよう」ということで、IaC の歴史と、AWS がオフィシャルに提供している CDK (Cloud Development Kit) についてお話ししていただきました。


CDK は CloudFormation より後発のツールであり、記述方式は DSL を超えて高度なプログラミングになってきています。

CloudFormation との比較や、便利なところなど、エントリー向けに解説いただきました。 開発業務の中で何かしら IaC に関連することに触れたことがあったり、手動でインフラを構築することに違和感を覚え始めた、という人向けのお話でした。


IaC とは

IaC とは、Infrastructure as Code を省略したもので、「コードで表現されたインフラ」です。

利用目的にあったサーバをすべてコードで書き起こし、いつ誰が実行しても同じ状態に構築可能にするためのものです。


IaC のざっくり歴史

  • 手動管理時代(〜2005)
    • 手順書を利用
    • 自前シェルでサーバ構築を自動化
  • Puppet(2005年〜)シェルでやっていたことをグローバルに標準化するためステップをモジュール化した。
  • Chef(2009年〜)構成管理対象デバイスに別途ソフトウェアのインストールが必要となるエージェントモデル
  • Ansible(2012年〜)エージェントレスモデル。リモートシェルで実行可能。
  • Terraform(2014年〜)「サーバを構築する」から、「インフラ全体を構築する」へ目的がシフト。

AWS における IaC

CloudFormation (2010~)

  • 問題点
    • コメントが書けない
      • JSON形式のファイルではコメントを書くことができない。
      • {}, [] が多用され読みにくい。
  • 1年後
    • YAML形式がサポートされた。

IaC の範囲を比較してみる

レガシーなインフラストラクチャの場合
legacy
 
クラウドサービスでのインフラストラクチャの場合
cloud service
 

CDK とは?

CDK (AWS Cloud Development Kit)

使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースを定義するためのオープンソースのソフトウェア開発フレームワーク。

  • メリット
    • 学習コストが低い
      • 様々なプログラミング言語でCDKを利用できるため、CDK を開始・利用しやすい。
    • テストしやすい
      • プログラミング言語でインフラを構築することになるので、そのプログラミング実装はテスト可能です。
    • コンテキストスイッチが不要
  • サポートしている言語
    • JavaScript
    • TypeScript
    • Python
    • Java
    • C#
    • Go(開発者プレビュー)
  • Low-Level Component と High-Level Component
    • High-Level Component を使うとCDK の恩恵を受けやすい(記述量が少なく、簡単に構築できる)
    • Low-Level Component で細かい制御が必要。

CloudFormation と CDK の比較

CloudFormation は Low-Level な IaC ツールであるため、すべての設定を詳細まで記述する必要があります。 実際にCloudFormation と CDK で同じAWSの構成を作るコードにより比較してもらいました。

よくある構成 VPC と 2-tier な Multi-AZ Subnet を作る時の記述量が以下の画像のようになります。 一目瞭然ですね!

 
CloudFormation で記述する量
CloudFormation
 
CDK で記述する量
CDK
 

CDK ここがいい(個人的意見)

  • CDK は後発ツールだけあって、非常に便利に作られている。
  • CDK は他のツールを駆逐するようなものではなく、共存できる
    • CloudFormation Template を扱える。
    • Terraform とインテグレーションする仕組みがある。
  • VS Code を使えばコードサジェストがバンバン出てくるのでコーディングスピードが爆上がりで、記述ミスもほぼなくなる(CloudFormation だと実行するまで気づかない)
  • アプリ実装の言語と統一することができるかもしれない。
  • 実際、書いていて楽しい←これ重要

まとめ

これまでの歴史であらゆるツール・思想のものが出てきましたが、クラウド時代は「リソースをオブジェクトとしてとらえて、コードで構成を表現する」という考え方が必要になってきたように思います。