【ハンズオン】AWS CDKの基本操作を学ぶ in TypeScript
本ブログではAWS Cloud Development Kit (CDK v2) の基礎操作をハンズオン形式で紹介します。
No. | 基本コマンド | 目的・用途 |
---|---|---|
1 | cdk init | CDKプロジェクトの作成 |
2 | cdk bootstrap | cdk deployに必要なリソース(KMS, S3, IAMロール等)を事前準備 |
3 | cdk synth | Stack定義されたCDKアプリのコンパイルとCFnテンプレートの生成 |
4 | cdk deploy | Stack定義されたAWSリソースの作成 |
5 | cdk destroy | Stack定義されたAWSリソースの削除 |
■ ハンズオン
1. 環境設定
AWS CDKはNode.js上で実行されるため、Node.jsのランタイム
が必要です。本ブログではnvmを使用していますが、Node.jsの公式からパッケージをインストールしてもOKです。
# LTS版のNode.js をインストールする
> nvm install --lts
# 現在設定された Node.jsのバージョン を確認する
> node --version
v20.9.0
AWS CDKはAWSリソースを作成・管理するためにAWS CLIv2
が必要です。AWSの公式からパッケージをインストールします。
# 現在設定された AWS CLIv2のバージョン を確認する
> aws --version
aws-cli/2.13.29
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` を設定)
AWS CDKを利用するためにCDK Toolkitをインストールします。cdkコマンドが使えるようになります。
# aws-cdk@2 をインストールする
> npm install -g aws-cdk@2
# 現在設定された AWS CDKのバージョン を確認する
> cdk --version
2.103.0 (build d0d7547)
TypeScript で AWS CDK を操作するために、Microsoft の TypeScript コンパイラをインストールします。cf. Working with the AWS CDK in TypeScript
# typescript をインストールする
> npm install -g typescript
# 現在設定された TypeScript を確認する
> tsc --version
Version 5.2.2
2. CDKプロジェクトの作成(cdk init)
フォルダを作成します。ディレクトリに移動します。
> mkdir hands-on-cdk-project && cd hands-on-cdk-project
CDKのプロジェクトをcdk init
コマンドを実行して生成します。
hands-on-cdk-project> cdk init app --language typescript
3. CDKアプリケーションの定義
CDKの構成は、他のIaCツールとほぼ変わりません。
1つのAppファイルにAWSリソースを定義した1つ以上のStackファイルを書きます。
下記の2ファイルをそれぞれのディレクトリに配置してください!
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, // 公開ロードバランサーを有効化
});
}
}
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 synth)とデプロイ(cdk deploy)
まずは、作成されたCDKコードが正しいかどうかを調べます。
CDKは CloudFormationテンプレートを生成するツール なので、cdk synth
コマンドを実行して構築計画のリソース情報を確認します。
hands-on-cdk-project> cdk synth
とりわけ、AWSリソースの設定値やメタデータなどに不備がないことを確認し、cdk deploy
コマンドを実行してAWSリソースを構築します。
hands-on-cdk-project> cdk deploy
コマンド実行後、最終確認の案内がコンソール上に出力されるので、y
を入力して、エンターを押下します。
Do you wish to deploy these changes (y/n)? y
FargateServiceStack: deploying... [1/1]
FargateServiceStack: creating CloudFormation changeset...
「3. CDKアプリケーションの定義」のサンプルコードでdeploy
した場合、5分ほどで完了します。
完了後の画面はこのようなイメージです。
AWS FargateのサービスエンドポイントURLをブラウザでアクセスしてみます(赤枠の部分)。みなさんも見慣れたNginxのクイックスタート画面が表示さればAWSリソースの構築は成功です。
6. 環境削除(cdk destroy)
「5. テスト(cdk synth)とデプロイ(cdk deploy)」で、CDKはCloudFormationテンプレートを生成するツール(再掲)と紹介しました。実際にAWSコンソールを確認してみます。FargateServiceStack
を削除することでAWSリソースを削除することが可能です。
今回はcdk destroy
コマンドを使用してAWSリソースを削除します。ただし、DBやストレージ系のサービスはリソースの削除保護を設定可能であり、もしその設定をcdk deploy
で構築した場合、destroy
コマンドでは削除できないので注意ください(AWSコンソール上で手動削除する必要あり)。
hands-on-cdk-project> cdk destroy
コマンド実行後、最終確認の案内がコンソール上に出力されるので、y
を入力して、エンターを押下します。
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は条件分岐や反復処理が容易に定義できる利点がある反面、IaC自体はシンプルisベストを主として運用されるため、インフラエンジニアから見ると苦手意識がある反面も。
最終的な選択はプロジェクトの要件や個人の好みに依存しますが、AWSではCloudFormationを利用する場面が多いのでCDKを採用するチームが増えてもいいかなと感じました。
Discussion