本記事は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
この連載の記事
-
TECH
責任ある生成AI利用のための「Guardrails for Amazon Bedrock」とは ― AWS re:Invent 2023 -
TECH
同世代エンジニアに刺激を受けた!JAWS-UG「若手エンジニア応援LT会」参加レポート -
TECH
AWS CDKでGuardDutyのRDS保護を有効化しよう(として詰みかけた話) -
TECH
ノーコードで生成AI連携! SlackからAmazon Bedrockのエージェントに質問 -
TECH
Terraform:変数の値が未代入でもインタラクティブな入力を回避する方法 -
TECH
Amazon SESでEメールの送信機能/受信機能を作る手順 -
TECH
Amazon BedrockからWeb上のコンテンツを参照する新機能「Web Crawler」 -
TECH
IAMユーザーのアクセスキーを使わず「IAMロール」を使うべき理由 -
TECH
CX視点で興味深かった「AWS Summit Japan 2024」のセッション -
TECH
AWS EC2でkubeadmを用いたKubernetesクラスターを作ってみたのでメモ -
TECH
AWSアカウントのサインインに「IAM Identity Center」をお勧めする理由 - この連載の一覧へ