「Constructs(コンストラクト)」の真価は、**「自分たちのプロジェクト専用の、再利用可能なパッケージ」**を作れることにあります。
単にリソースを定義するだけでなく、複数のリソースや複雑な設定を一つの「クラス」に閉じ込める活用例をいくつか紹介します。
1. 会社・プロジェクト専用の「標準セット」
セキュリティポリシーや命名規則を強制したコンストラクトを作る例です。
-
活用例:
SecureS3Bucketコンストラクト -
内容:
- パブリックアクセスを自動で禁止。
- データの暗号化(KMS)をデフォルトで有効化。
- 保存期間が過ぎたファイルを自動削除する設定。
-
メリット: 開発者が
new SecureS3Bucketを使うだけで、会社のセキュリティ基準を自動的に満たせます。
2. Webアプリの「鉄板構成」のパッケージ化
今回お話しした「NestJS + Lambda」のような、よくある組み合わせを一つにまとめます。
-
活用例:
NestJsServerlessApiコンストラクト -
内容:
- Lambda: NestJS を動かす本体。
- API Gateway: 外部からアクセスするための窓口。
- IAM Role: ログ出力やデータベース接続に必要な権限。
- メリット: 他のプロジェクトでも、このコンストラクトを 1 行呼び出すだけで、同じ構成のバックエンドが立ち上がります。
3. 「データベース + 読み取り用 Lambda」のセット
データの保存場所と、それを処理するプログラムはセットで動くことが多いです。
-
活用例:
DatabaseWithTriggerコンストラクト -
内容:
- DynamoDB: データ保存先(ストリーム有効)。
- Lambda: データ更新を検知して動くプログラム。
- メリット: 「テーブルを作って、トリガーを設定して、権限を与える」という一連の複雑な関連付けをコードの中に隠蔽できます。
4. 環境ごとの切り替え(開発・本番)
環境に応じてスペックや設定を自動で変えるコンストラクトです。
-
活用例:
AutoScalingComputeコンストラクト -
内容:
- 「開発環境」なら:最小構成でコストを抑える。
- 「本番環境」なら:高可用性(マルチ AZ)かつオートスケーリングを有効にする。
- メリット: インフラのコードを共通化しつつ、フラグ一つで環境に最適な構成に切り替えられます。
実装のイメージ (TypeScript)
このように、複数の部品を Construct クラスの中に「飼い慣らす」のが CDK 的な活用法です。
// 独自の「認証付きAPIセット」を作る例
export class AuthApiSet extends Construct {
public readonly api: apigateway.RestApi;
constructor(scope: Construct, id: string, props: AuthApiSetProps) {
super(scope, id);
// 1. Lambdaを作る
const handler = new lambda.Function(this, 'Handler', { ... });
// 2. Cognito連携を設定する
const authorizer = new apigateway.CognitoUserPoolsAuthorizer(this, 'Auth', { ... });
// 3. API Gatewayを作って紐付ける
this.api = new apigateway.RestApi(this, 'Api');
this.api.root.addMethod('GET', new apigateway.LambdaIntegration(handler), {
authorizer: authorizer
});
}
}
まとめ
Constructs を活用するということは、「AWS の難しい設定を、自分たちが使いやすい『部品』に翻訳して再利用する」 ということです。
まずは、よく使う「Lambda + API Gateway」や「S3 + CloudFront」といった組み合わせを自分なりに一つのクラスにまとめてみることから始めるのがおすすめです。