🔰

AWS CDK で構築するリソースに 環境名 を入れる

2024/10/01に公開

はじめに

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