こんにちは、株式会社FIXERの村上です。
最近、AWSが提供するCloud Development Kit(CDK)を使用して、AWSのインフラストラクチャを管理するケースが増えてきました。
本ブログではCDKを操作する上で基本的なcdkコマンドをハンズオン形式で紹介します。
基本コマンド | 目的・用途 |
cdk init | CDKプロジェクトの作成 |
cdk bootstrap | cdk deployに必要なリソース(KMS, S3, IAMロール等)を事前準備 |
cdk synth | Stack定義されたCDKアプリのコンパイルとCFnテンプレートの生成 |
cdk deploy | Stack定義されたCFnによるAWSリソースの作成 |
cdk destroy | Stack定義されたCFnによるAWSリソースの削除 |
Cf. 公式AWS CDKv2 Toolkit (CDK command)
■ ハンズオン
1.CDKのセットアップとインストール方法
CDKはNode.js上で実行されるため、Node.jsのランタイム
が必要です。また Node.jsの公式からパッケージをインストールしてもOKです。
※ 事前に nvm をインストールしておき、 nvm install することを推奨します。
LTS版のNode.js をインストールします。
$ > nvm install --lts
現在設定された「Node.jsのバージョン」を確認します。本ブログでは `v18.16.1` です。
$ > node --version
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 --version
AWS CLIはv2を利用してください。2023年6月からv1は非推奨になります。
[公式] What is the AWS Command Line Interface?
AWSリソースを作成したいAWSアカウントの資格情報を設定します。また credentials と configファイルを作成し、エディタから直接 設定してもOKです。
※ 本ブログでは、 default
プロファイルに資格情報を設定します。
$ > aws configure
AWS Access Key ID []: (アクセスキー)
AWS Secret Access Key []: (シークレットキー)
Default region name []: (リージョンコード、`ap-northeast-1` を設定)
Default output format []: (コンソール出力のフォーマット、`json` を設定)
CDKを利用するためにAWS CDK Toolkitをインストールします。cdkコマンドが使えるようになります。
$ > npm install -g aws-cdk@2
現在設定された「AWS CDKのバージョン」を確認します。本ブログでは `2.84.0 (build f7c792f)` です。
$ > cdk --version
TypeScript で CDK を操作するために、Microsoft の TypeScript コンパイラをインストールします。
Cf. Working with the AWS CDK in TypeScript
$ > npm install -g typescript
現在設定された「TypeScript」を確認します。本ブログでは `Version 5.1.3` です。
$ > tsc --version
2.CDKプロジェクトの初期化(cdk init)
プロジェクト用のフォルダを作成します。作成されたディレクトリに移動します。
$ > mkdir hands-on-cdk-project && cd hands-on-cdk-project
cdk init
コマンドを実行してCDKのプロジェクトを生成します。
$ hands-on-cdk-project> cdk init app --language typescript
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
import * as cdk from 'aws-cdk-lib';
import { FargateServiceStack } from '../lib/fargate-service-stack';
const app = new cdk.App();
new FargateServiceStack(app, 'FargateServiceStack');
4.CDKデプロイメントの事前準備(cdk bootstrap)
CDKを使用して、リソース作成を行う前に事前準備が必要です。
$ hands-on-cdk-project> cdk bootstrap
5.CDKアプリケーションのテストとデバッグ(cdk synth)
CDKコードが正しいかどうかをテストします。CDKは CloudFormationテンプレートを生成するツール です。
そのため、cdk synth
コマンドを実行して コンソール上に表示されたCloudFormationテンプレートの構成を確認し、作成計画のリソース情報を出力します。
$ hands-on-cdk-project> cdk synth
6.CDKアプリケーションのデプロイ(cdk deploy)
とりわけ、AWSリソースの設定値やメタデータなどに不備がないことを確認し、cdk deploy
コマンドを実行してAWSリソースを作成します。
$ hands-on-cdk-project> cdk deploy
コマンド実行後、最終確認の案内がコンソール上に出力されるので、y
を入力して、Enterします。
※ 今回はFargateServiceStackしか定義していないので、1つだけデプロイされます。
Do you wish to deploy these changes (y/n)? y
FargateServiceStack: deploying... [1/1]
FargateServiceStack: creating CloudFormation changeset...
「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コンソール上で手動削除する必要あり)。
$ hands-on-cdk-project> cdk destroy
コマンド実行後、最終確認の案内がコンソール上に出力されるので、y
を入力して、Enterします。
Are you sure you want to delete: FargateServiceStack (y/n)? y
AWSコンソール上でFargateServiceStack
を確認するとDELETE_IN_PROGRESS
ステータスになっていますね。
さらに待つと、削除処理が完了します(5分ぐらい?)。
■ さいごに
CDKは、AWSのリソースを構築するためのフレームワークであり、TypeScript/JavaScript、Python、Java、C#、Goのプログラミング言語でインフラストラクチャを管理します。今までサーバーサイドやフロントエンドで活躍していた開発者向けのIaCツールになっています。
TerraformやAnsibleのような宣言型プログラム言語とは違い、CDKは条件分岐や反復処理が容易に定義できるメリットがあります。
ただ、シンプル is ベストを掲げるIaC界隈で複雑な処理が実装できる必要はあるのか・・・と疑問に思ったり。
最終的な選択はプロジェクトの要件や個人の好みに依存しますが、AWSではCloudFormationを利用する場面が多いのでCDKを採用するチームが増えてもいいかなと感じました。