AWS CDKとは
概要
AWS CDKとは、AWS上でInfrastructure as Code(IaC)を実現するためのフレームワークです。他の代表的なIaCのツールにはTerraform, AWS CloudFormation, Bicepなどがあります。
AWS CDKでは、様々なプログラミング言語(JavaScript, TypeScript, Python, Java, C# など)でAWSのリソースを記述出来ます。記述したコードからCloudFormationのテンプレートの作成、AWS上へのデプロイまでを一括で実行することが出来ます。イメージとしてはTypescriptやPythonで書かれたコードをCDKがコンパイルし、CloudFormationを生成するといった感じです。
様々なプログラミング言語を使って記述出来ると書きましたが、実際に自分が調べた際に出てくる実装例はほぼTypescriptで、TypescriptがCDKのデファクトスタンダードのような感じがしました。CDK自体がTypescriptで開発されているので、実装例も自然とTypescriptが多いのだと思います。ただ、TerraformのようなIaCツールより日が浅いので、今後他の言語での実装例が増えていくのかもしれません。
デプロイフロー
CDKでの開発時には以下のようなコマンドを使用します。
-
cdk synth
:コードからCloudFormationのテンプレートを生成 -
cdk deploy
:生成したテンプレートからスタックを作成し、AWS環境上にデプロイ -
cdk diff
:ローカル環境のコード上での構成とAWS環境上での構成の差分を表示 -
cdk destroy
: テンプレートから作成されたAWS上のスタックを削除
上記のコマンドを使ったCDKのデプロイフローを図にしてみました。裏ではこんな感じで処理されています。
当たり前ですが、生成されたCloudFormationのテンプレートはそのまま単体でも使えます。CloudFormationのテンプレートを作成するためにCDKを使うというのもありかと思います。
CDKの構成概念
CDKには上の図のような構成概念があります。一番下のConstructはAWSのリソースの集合で、EC2やRDSのような各AWSサービスのリソースを定義します。次に、中段のStackですが、こちらはCloudFormationのスタックに該当するもので、Constructの集合となっています。最後に一番上のAppはスタックをまとめる役割をするもので、このAppの中でデプロイするスタックを指定したり、スタック間の依存関係などを記述することが出来ます。
Constructの種類
Constructには三種類あります。
- L1 Construct
こちらは、CloudFormationでの実装と1対1で対応しています。細かいパラメータの調整が必要な場合にはこちらを用います。 - L2 Construct
こちらはL1 Constructよりも抽象化されており、少ないコード量で記述が可能です。ただその反面、一部設定出来ないパラメータが存在します。 - L3 Construct
こちらはL2 Constructよりもさらに抽象化されており、Lambda+API GatewayやECS+Fargateなどの代表的なAWSサービスの組み合わせを実装可能となっています。
このConstructの正体は各AWSリソースを抽象化したクラスなので、自分で独自のAWSリソースを含めた新しいクラスをConstructとして作成することも出来ます。名前がクラスのコンストラクタに似ているのでややこしいですが、Construct自体はクラスです。(ややこしい。)
このように、L1→L3にかけて抽象度が高くなっており、L2 Construct以上で設定不能な値はベストプラクティスに沿ったデフォルト値が設定されるようになっています。抽象度が高いほどパラメータが隠匿化されるので、自分の意図していないパラメータが設定される場合があります。
このように抽象度とパラメータ設定の自由度はトレードオフの関係にあるので、実装する際には要件に合わせて適切なConstructを選択する必要があります。まずは抽象度の高いConstructから使用してみて、より細かい設定が必要な場合は他のConstructを使用するというのが良さそうです。
Discussion