AWS CDKについて

最近趣味でAWS CDK(以下CDK)を触っていて,ECSをCDKで構築してみるということをやったり,CDK本体にContributeをするなどをしている.

そんなCDKについて,触ってみる人が増えたらいいなということでエントリを書いてみる.

CDKとは

Cloud Development Kitの略で,簡単に言えばTypeScriptを書くことでCloudFormationを生成してくれるツールのこと.

AWS公式のツールであり,以下のリポジトリで開発されている.

github.com

メリット

  • TypeScriptによる強力なコード補完
  • 共通パターンをライブラリ化することによる記述量の削減
  • デプロイ時に使える強力なツール群

コード例

Fargateのサービスを動かすサンプルコードは以下.

これを実行すると,VPCが作成され,amazon/amazon-ecs-sampleイメージがFargateで動き,ALBでアクセス可能になるというところまでやってくれる.

import ec2 = require('@aws-cdk/aws-ec2');
import ecs = require('@aws-cdk/aws-ecs');
import cdk = require('@aws-cdk/cdk');

class BonjourFargate extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Create VPC and Fargate Cluster
    // NOTE: Limit AZs to avoid reaching resource quotas
    const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 });
    const cluster = new ecs.Cluster(this, 'Cluster', { vpc });

    // Instantiate Fargate Service with just cluster and image
    const fargateService = new ecs.LoadBalancedFargateService(this, "FargateService", {
      cluster,
      image: ecs.ContainerImage.fromDockerHub("amazon/amazon-ecs-sample"),
    });

    // Output the DNS where you can access your service
    new cdk.Output(this, 'LoadBalancerDNS', { value: fargateService.loadBalancer.dnsName });
  }
}

const app = new cdk.App();

new BonjourFargate(app, 'Bonjour');

app.run();

コードのURL: https://github.com/awslabs/aws-cdk/blob/v0.22.0/examples/cdk-examples-typescript/hello-cdk-fargate/index.ts

このように共通パターンをライブラリ化して,記述量を格段に減らすことができるということは,特に多くのリソースを作成したいときにかなり便利に感じると思う.

デプロイ時に使えるツール群

CDKはデプロイ用のコマンドとしてcdk deploycdk destroy があり,TypeScriptで作成したリソースをそのままデプロイすることができる.

またこの他に,YAMLを生成してくれる cdk synth というのもあり,実際に作成されるリソースを確認することも可能.

また,強力なのがセキュリティ周りの警告で,セキュリティグループやIAMに変更が加わると事前に警告を出してくれる.

f:id:cohalz:20190114214638p:plain

これは本当に強力で,ライブラリを使っていると隠蔽されてしまいがちな部分の中でも簡単にセキュリティ周りの変更が確認できる.

ライブラリの概念

CDKでリソースを作成する場合,下の二種類のライブラリを使って書くことになる

  • CFnリソースがそのままTypeScriptのクラスになったCloudFormation Library
    • CfnXxxという名前のリソース
  • 一段抽象化され,デフォルト値の設定や必要なリソースの作成を行ってくれるConstruct Library

基本的にはConstruct Libraryを使えばいいが,すべてのリソースにConstruct Libraryが用意されているわけではないためCloudFormation Libraryが必要になることもある.

難しいところ

Construct Libraryは強力だけど,上手く使わないとハマってしまうこともある

  • 新しい機能に対応していない場合もある
    • 起動テンプレートや管理ポリシーなど比較的新しいリソースなど
  • 生成されるYAMLとの対応が難しい
    • CFnとは違うデフォルト値を設定してくることもある

終わりに

CDKはまだ開発者プレビューだけれども,今の時点で十分に強力なツールであることは間違いない.

また,下の記事で CDK はまだ完成していません。私たちは CDK をクローズな伽藍ではなくオープンなバザールのように作っています。 とあるようにどんどんissueやPRが取り込まれ良くなっていくと思う.

aws.amazon.com

こんなにもこれからが楽しみになってくるソフトウェアは久しぶりでワクワクしているし,これからもどんどん触ったりPRを出したりしていきたい.