はじめに
今回はAWSインフラ構築のコード化(IaC)にかかせない、AWS CDKについて、実装前に知っておきたいことをまとめてみました。
AWS CDKの基礎知識に関しては、こちらの記事がおすすめです。
CloudFormationとの違い
CDKは、「CloudFormationをより使いやすくしたい」との思いから誕生しました。
以下に、CloudFormationとCDKの違いを簡単に表にまとめてみました。
| 比較項目 | AWS CloudFormation | AWS Cloud Development Kit (CDK) |
|---|---|---|
| 定義方法 | YAML / JSON | TypeScript / Python / Java など |
| 実行方法 | そのままデプロイ | 内部でCloudFormationに変換してデプロイ |
| 複数スタック | (基本)一つずつデプロイ | 複数のスタックをまとめて一つのアプリとしてデプロイ |
| 依存関係 | 手動でデプロイ順序を決める | CDKが依存関係を解決する |
| 抽象度 | 低い(リソース単位) | 高い(Construct単位) |
| 再利用性 | 低い(コピペ・Nested Stack) | 高い(関数・クラス・Construct) |
| 可読性 | 冗長になりがち | コードとして整理しやすい |
| ロジック | 制限あり(条件・マッピング程度) | 自由(ループ・条件分岐・関数) |
| デバッグ | ChangeSet / Drift検知 | synth結果+CloudFormation依存 |
エスケープハッチ(代替手段)
AWSの進化は速いため、CDKがまだ対応していないリソースが存在することがあります。
そのような場合、以下のように対応することが可能です。
- L2コンストラクト(抽象レイヤー)がない場合
→Cfnで始まるL1コンストラクトを使用する
→L1コンストラクトもない場合、cdk.CfnResourceを使用する - L2コンストラクトでプロパティが設定できない場合
→construct.node.defaultChildでL1コンストラクトを取得し、プロパティを設定する - CloudFormationでも対応していない機能の場合
→Provider Frameworkを使用してカスタムリソースを作成する
(AWSのAPIを呼び出すシンプルなカスタムリソースは、AwsCustomResource コンストラクトを使用することで、Lambda関数のコードを記述することなく簡単に作成可能)
詳しくは:AWS CDK 概要 (Basic #1)【AWS Black Belt】
セットアップ
空のディレクトリを作成したらそこへ移動し、以下のコマンドを実行します。
cdk init --language typescript
初期準備に関しては、ぜひ一度チュートリアルをハンズオン形式で試してみることをおすすめします。
公式ドキュメントの用語解説
実際にCDKを実装していく場合、公式ドキュメントを参照しながら進めていくことになるかと思います。
そこで、公式ドキュメントに出てくる基本用語をまとめてみました。
(今回はVPCを例にします)
以下のドキュメントに出てくる大項目
- Construct
- Props
- Properties
- Methods
について解説します。
1. Construct(コンストラクト)
CDKの基本単位で、「AWSリソース」や「抽象化された部品」を表すクラスのことを指します。
new ec2.Vpc(this, 'MyVpc', { ... })
ここでのVpcがConstructにあたります。
CloudFormationリソースのラッパーであり、クラスとして定義されます。
スタックの中ではツリー構造になっています。
2. Props(=Construct Props)
Constructを生成するときに渡す(初期)設定値のことを指します。
明示的に指定しない場合、デフォルト値が適用されるため、把握しておくことが重要です。
new ec2.Vpc(this, 'MyVpc', {
maxAzs: 2,
natGateways: 1,
})
ここでの{ maxAzs: 2, ... }がPropsにあたります。
(TypeScriptでは[VpcProps]という型で定義されています)
オプション設定の集合であり、初期化時にしか使えません。
3. Properties
Constructが生成された後に持つ「値・属性(=作成されたリソースの状態・情報)」のことを指します。
const vpc = new ec2.Vpc(...);
console.log(vpc.vpcId);
console.log(vpc.publicSubnets);
ここでのvpc.vpcId, vpc.publicSubnetsがPropertiesにあたります。
他のリソースに渡すための情報として、基本的に読み取り専用で使います。
IDなど、AWS側で決まる値も含みます。
4. Methods(メソッド)
あらかじめクラスに用意されている、Constructに対して操作を行う関数のことを指します。
const vpc = new ec2.Vpc(...);
vpc.addFlowLog(...)
vpc.selectSubnets(...)
ここでのvpc.addFlowLog(...)などがMethodsにあたります。
設定の追加・取得・加工など、リソースに対する操作をおこないます。