🔰
AWS CDK で構築するリソースに 環境名 を入れる
はじめに
CDK で生成されるリソース名に「 環境名 」(Dev, Prodなど)を含ませたい場合のベストな書き方を調べていた際、「Stageクラス」を使用する方法が AWS 公式で紹介されていました🤗
「Stageクラス」を使用して定義したリソース名が、 CDK でどのように出力されるのか試してみた記録です。
引用:AWS Cloud Development Kit (CDK)基本的なコンポーネントと機能 Basic #2
構成
AWS公式の チュートリアル: サーバーレス Hello World アプリケーションを作成する のコードをもとに、ステージ別(Prod/Dev環境)のリソースを同一アカウント内で生成します。尚、CDK のデフォルトの命名規則を確認する為、リソース名を明示的に指定していません。
ソース
- bin/cdk-hello-world.ts
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { HelloWorldAppStage } from '../lib/stage';
const app = new cdk.App();
// App に Stage を追加
new HelloWorldAppStage(app, 'Prod', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
}
});
new HelloWorldAppStage(app, 'Dev', {
// ...省略...
});
- lib/stage.ts
「Stageクラス」を継承しています(extends cdk.Stage
)。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { HelloWorldAppStack } from './cdk-hello-world-stack';
export class HelloWorldAppStage extends cdk.Stage {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const helloWorldAppStack = new HelloWorldAppStack(this,'HelloWorldApp');
}
}
- lib/cdk-hello-world-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
export class HelloWorldAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Define the Lambda function resource
const helloWorldFunction = new lambda.Function(this, 'HelloWorldFunction', {
runtime: lambda.Runtime.NODEJS_18_X, // Choose any supported Node.js runtime
code: lambda.Code.fromAsset('lambda'), // Points to the lambda directory
handler: 'hello.handler', // Points to the 'hello' file in the lambda directory
});
// Define the API Gateway resource
const api = new apigateway.LambdaRestApi(this, 'HelloWorldApi', {
handler: helloWorldFunction,
proxy: false,
});
// Define the '/hello' resource with a GET method
const helloResource = api.root.addResource('hello');
helloResource.addMethod('GET');
}
}
コマンド
下記コマンドでデプロイします。
# deploy --all では Stage 配下は対象にならないため ** を指定
$ cdk deploy '**'
# 特定の Stage に絞ってデプロイする場合
$ cdk deploy 'Prod/*'
うっかりcdk deploy --all
でデプロイしようとすると、「No stack found in the main cloud assembly. Use "list" to print manifest」というエラーが発生します。
結果
CDK App を宣言する CDK のエントリポイントで定義した "環境名-" を前置したスタック名&リソース名を自動生成してくれました🙆(一部対象外)
-
スタック名
-
Lambda
-
API Gateway
API名は Constract ID (今回の場合は'HelloWorldApi') をそのまま使用するようです。
-
IAM Role(Prodスタックのもの)
-
CloudWatch Logs(Prodスタックのもの)
以上、どなたかの参考になれば幸いです。
えみり〜でした|ωΦ)ฅ
Discussion