初めに
CDK開発を行い、Stack上にリソースを定義する際、以下のように new を使用するケースがあります。
export class CdkStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new ec2.Vpc(this, 'Vpc', {
maxAzs: 2,
natGateways: 0,
subnetConfiguration: [
{
name: 'Public',
subnetType: ec2.SubnetType.PUBLIC,
cidrMask: 24,
},
{
name: 'Isolated',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
cidrMask: 24,
},
],
});
}
}
この new は、いったい何をしているのでしょうか?
この記事では、new の役割と、なぜCDKで new を使うのかについて、JavaScript / TypeScriptの基本から簡単に見ていきたいと思います。
■ 結論
TypeScriptの new は、クラスから新しいオブジェクト(インスタンス)を生成するための構文です。
CDKでは、以下のように new を使ってConstructを生成し、Stackの中にAWSリソースを定義します。
new ec2.Vpc(...)
■ 仕組み
クラスとは?
JavaScriptとTypeScriptでは、class 構文を使ってクラスを定義できます。
クラスは、オブジェクトを作成するための設計図のようなものです。
例えば、以下のようなクラスを作ることができます。
class User {
name: string;
constructor(name: string) {
this.name = name;
}
}
この User クラスを使って、
const user = new User('田中');
とすると、User クラスから新しいオブジェクト(インスタンス)が生成されます。
Userクラス
↓
【設計図】
↓
new User('田中')
↓
Userのインスタンス
CDKではどうなっているのか?
AWS CDKでは、AWSリソースを定義するためのConstructがあらかじめ用意されています。
例えば、VPCを作成するためのConstructとして ec2.Vpc があります。
new ec2.Vpc(...)
とすることで、Vpc Constructのインスタンスを生成し、Stackの中にVPCを定義できます。
つまり、
CDKが用意しているConstruct
↓
ec2.Vpc
↓
new ec2.Vpc(...)
↓
Vpc Constructのインスタンスを生成
↓
StackにVPCを定義
という流れになります。
なぜCDKではnewを使うのか?
CDKでは、AWSリソースをConstructとして表現しています。
そのため、Constructのクラスからインスタンスを生成するために new を使用します。
例えば、
new ec2.Vpc(...)
でVPCを、
new ec2.Instance(...)
でEC2インスタンスを、
new s3.Bucket(...)
でS3バケットを定義できます。
このように、CDKが用意しているConstructを利用することで、CloudFormationの詳細な設定をすべて自分で記述しなくても、TypeScriptを使ってAWSリソースを定義できます。
注意
Constructを使用するためには、対応するCDKライブラリを import する必要があります。
例えばEC2のConstructを使用する場合は、以下のように記述します。
import * as ec2 from 'aws-cdk-lib/aws-ec2';
これによって、EC2用のConstructを ec2 という名前で使用できるようになります。
例えば、
new ec2.Vpc(...)
や、
new ec2.Instance(...)
のように記述できます。
つまり、
import
↓
EC2用のCDKライブラリを読み込む
↓
ec2.VpcなどのConstructが使用可能になる
↓
new ec2.Vpc(...)
↓
Constructのインスタンスを生成
↓
StackにAWSリソースを定義
という流れになります。
まとめ
今回の内容をまとめると、以下のようになります。
-
classはオブジェクトを作成するための設計図 -
newはクラスから新しいオブジェクト(インスタンス)を生成する - CDKではAWSリソースをConstructとして扱う
-
new ec2.Vpc(...)のようにnewを使ってConstructのインスタンスを生成する - 使用するConstructに対応したCDKライブラリは
importしておく必要がある
つまり、CDKの
new ec2.Vpc(...)
は、
「CDKが用意しているVPC用のConstruct(クラス)からインスタンスを生成し、そのVPCをStackに定義する」
という処理を行っています。