このページの本文へ

FIXER Tech Blog - Cloud

AWS CDK v2における基本コマンドの操作をハンズオン形式で学んでみる

2023年07月14日 10時00分更新

文● 村上 滉樹/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「AWS CDK v2における基本コマンドの操作をハンズオン形式で学んでみる」を再編集したものです。

 こんにちは、株式会社FIXERの村上です。

 最近、AWSが提供するCloud Development Kit(CDK)を使用して、AWSのインフラストラクチャを管理するケースが増えてきました。

 本ブログではCDKを操作する上で基本的なcdkコマンドをハンズオン形式で紹介します。

Cf. 公式AWS CDKv2 Toolkit (CDK command)

 ハンズオン

1.CDKのセットアップとインストール方法

 CDKはNode.js上で実行されるため、Node.jsのランタイムが必要です。また Node.jsの公式からパッケージをインストールしてもOKです。
※事前に nvm をインストールしておき、 nvm install することを推奨します。

 LTS版のNode.js をインストールします。

 現在設定された「Node.jsのバージョン」を確認します。本ブログでは `v18.16.1` です。

2023年6月時点
CDKの公式によると Node.js ≥ 14.15.0 でサポートしており、LTS版を推奨しています。
[公式] AWS Cloud Development Kit (AWS CDK)

 CDKはAWSリソースを作成・管理するためにAWS CLIv2が必要です。AWSの公式からパッケージをインストールします。

 現在設定された「AWS CLIv2のバージョン」を確認します。本ブログでは `aws-cli/2.12.1` です。

AWS CLIはv2を利用してください。2023年6月からv1は非推奨になります。
[公式] What is the AWS Command Line Interface?

 AWSリソースを作成したいAWSアカウントの資格情報を設定します。また credentials と configファイルを作成し、エディタから直接 設定してもOKです。
※ 本ブログでは、 defaultプロファイルに資格情報を設定します。

 CDKを利用するためにAWS CDK Toolkitをインストールします。cdkコマンドが使えるようになります。

 現在設定された「AWS CDKのバージョン」を確認します。本ブログでは `2.84.0 (build f7c792f)` です。

 TypeScript で CDK を操作するために、Microsoft の TypeScript コンパイラをインストールします。
Cf. Working with the AWS CDK in TypeScript

 現在設定された「TypeScript」を確認します。本ブログでは `Version 5.1.3` です。

2.CDKプロジェクトの初期化(cdk init)

 プロジェクト用のフォルダを作成します。作成されたディレクトリに移動します。

 cdk initコマンドを実行してCDKのプロジェクトを生成します。

3.CDKのスタック作成

 下記の2ファイルをそれぞれのディレクトリに配置します。

(1)hands-on-cdk-project/lib/fargate-service-stack.ts

import { Construct } from 'constructs';
import * as cdk from 'aws-cdk-lib';
import { aws_ec2 as ec2 } from 'aws-cdk-lib';
import { aws_ecs as ecs } from 'aws-cdk-lib';
import { aws_ecs_patterns as ecs_patterns } from 'aws-cdk-lib';

export class FargateServiceStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // VPCの作成
    const vpc = new ec2.Vpc(this, 'HandsOnCdkVpc', {
      ipAddresses: ec2.IpAddresses.cidr('192.168.0.0/24'),
    })

    // ECSクラスターの作成
    const cluster = new ecs.Cluster(this, 'HandsOnCdkCluster', { vpc });

    // Fargateタスクの定義
    const taskDefinition = new ecs.FargateTaskDefinition(this, 'HandsOnCdkFargateTaskDef');
    const container = taskDefinition.addContainer('HandsOnAppContainer', {
      // https://hub.docker.com/_/nginx アプリを設定
      image: ecs.ContainerImage.fromRegistry('nginx'),
    });
    container.addPortMappings({ containerPort: 80 });

    // Fargateサービスの作成
    new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'HandsOnCdkFargateService', {
      cluster,
      taskDefinition,
      publicLoadBalancer: true,  // 公開ロードバランサーを有効化
    });
  }
}

(2)hands-on-cdk-project/bin/hands-on-cdk-project.ts

4.CDKデプロイメントの事前準備(cdk bootstrap)

 CDKを使用して、リソース作成を行う前に事前準備が必要です。

5.CDKアプリケーションのテストとデバッグ(cdk synth)

 CDKコードが正しいかどうかをテストします。CDKは CloudFormationテンプレートを生成するツール です。

 そのため、cdk synthコマンドを実行して コンソール上に表示されたCloudFormationテンプレートの構成を確認し、作成計画のリソース情報を出力します。

6.CDKアプリケーションのデプロイ(cdk deploy)

 とりわけ、AWSリソースの設定値やメタデータなどに不備がないことを確認し、cdk deployコマンドを実行してAWSリソースを作成します。

 コマンド実行後、最終確認の案内がコンソール上に出力されるので、yを入力して、Enterします。
※ 今回はFargateServiceStackしか定義していないので、1つだけデプロイされます。

 「3.CDKのスタック作成」のサンプルコードでdeployした場合、5分ほどで完了します。完了後の画面はこのようなイメージです。

7.動作確認

 サンプルコードでは、AWS FargateにNginxの「Welcome to Nginx!」画面を表示するDockerイメージをデプロイしています。

 また、AWS FargateのサービスURLはインターネット接続を可能としているため、リンクをブラウザで実行できます。

8.リソースの削除(cdk destroy)

 「5.CDKアプリケーションのテストとデバッグ(cdk synth)」で、CDKはCloudFormationテンプレートを生成するツール(再掲)と紹介しました。実際にAWSコンソールを確認してみます。

 FargateServiceStackを削除することでAWSリソースを削除することが可能です。

 今回はcdk destroyコマンドを使用してAWSリソースを削除します。ただし、DBやストレージ系のサービスはリソースの削除保護が設定できるため、もし保護を有効化したCDKアプリをcdk deployで構築した場合、destroyコマンドでは削除できないので注意ください(AWSコンソール上で手動削除する必要あり)。

 コマンド実行後、最終確認の案内がコンソール上に出力されるので、yを入力して、Enterします。

 AWSコンソール上でFargateServiceStackを確認するとDELETE_IN_PROGRESSステータスになっていますね。

 さらに待つと、削除処理が完了します(5分ぐらい?)。

■ さいごに

 CDKは、AWSのリソースを構築するためのフレームワークであり、TypeScript/JavaScript、Python、Java、C#、Goのプログラミング言語でインフラストラクチャを管理します。今までサーバーサイドやフロントエンドで活躍していた開発者向けのIaCツールになっています。

 TerraformやAnsibleのような宣言型プログラム言語とは違い、CDKは条件分岐や反復処理が容易に定義できるメリットがあります。

 ただ、シンプル is ベストを掲げるIaC界隈で複雑な処理が実装できる必要はあるのか・・・と疑問に思ったり。

 最終的な選択はプロジェクトの要件や個人の好みに依存しますが、AWSではCloudFormationを利用する場面が多いのでCDKを採用するチームが増えてもいいかなと感じました。

村上滉樹/FIXER
株式会社FIXER|エンタープライズ部門所属
2020年4月 新卒入社
職業:Cloud Solution Engineer(主にインフラ)
好きなAWS/Azureサービス:AWS Fargate / App Service

カテゴリートップへ

この連載の記事