0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CDK (TypeScript) でインフラ構築【用語解説・ハンズオン】

0
Posted at

サムネ2.png

はじめに

IaC (Infrastructure as Code)、CloudFormation、AWS CDK、Terraform。 こうした言葉に興味を持って調べてみたものの、「何から手をつければいいか分からない」「コードでインフラを作るイメージが湧かない」という方も多いのではないでしょうか?
本記事では、TypeScriptを使用してAWS CDKアプリケーションを作成し、S3バケットの構築から削除までの一連の流れを解説します。
この記事を通して、AWS CDKの基本的な仕組みや、コードベースでのインフラ構築に対する理解を深めていただければ幸いです。

1. AWS CDK(Cloud Development Kit) とは?

AWS CDKは、TypeScriptやPythonなどのプログラミング言語を使ってインフラを定義できるフレームワークです。 CDKで記述したコードをビルド(合成)すると、裏側で自動的に「CloudFormationテンプレート」が生成(合成)され、それをもとにリソースが展開されます。
プログラミング言語の機能(変数、ループ、型補完など)を使えるため、効率よく、短いコードでインフラを記述できるのが特徴です。

CDKは TypeScript、Python、Java、C#、Goなど複数の言語をサポートしていますが、CDK自体がTypeScriptで開発されているため、構造的に最も親和性が高いのはTypeScriptと言えます。
また、公式ドキュメントや技術ブログなどの情報量もTypeScriptは豊富であるため、学習コストの低減やトラブルシューティングの容易さを踏まえると、TypeScriptによる開発が進めやすいと言えます。

2. ハンズオンの構成

今回のハンズオンでは、ローカル環境で作成したTypeScriptのコードをAWS CDKを使ってデプロイし、AWS上に「S3バケット」を1つ作成します。
本ハンズオンを通じて、以下のコマンドを使用したAWS CDK開発の一連の流れを学ぶことができます。

  1. cdk init でプロジェクトの雛形を作成
  2. TypeScriptコードでAWSリソースを定義
  3. cdk deploy でAWS上にリソースを作成(デプロイ)
  4. cdk destroy でリソースを削除(クリーンアップ)

ハンズオン構成図-1024x238.png

3. ハンズオンStep1(環境構築)

CDKを実行するためには、以下のツールが必要です。
まだの方はインストールをお願いします。

・Node.js (CDKはNode.js上で動作するため)
Node.jsのインストール
・AWS CLI(ローカルのターミナルからcdkコマンドを実行するため)
AWS CLIのインストール

3.1 CDKのインストールと作業用フォルダの作成

ターミナル(WindowsならPowerShellやコマンドプロンプト、MacならTerminal)を開き、以下のコマンドを実行してCDKをインストールします。

npm install -g aws-cdk
インストール後、以下のコマンドでバージョンが表示されればOKです。

cdk --version
続いて、作業用のフォルダを作成し、その中に移動しましょう。

mkdir cdk-s3-handson
cd cdk-s3-handson

3.2 AWS認証情報の設定

・AWSへのアクセス権限設定
今回は、既存の設定や他のプロジェクトと混ざらないように、名前付きプロファイルを指定して設定します。
ご自身の環境に合わせて、以下のいずれかの手順を実行してください。

【パターンA:IAMユーザー(アクセスキー)を使用する場合】

aws configure --profile cdk-demo
※ コマンド実行後、AWS Access Key ID や Secret Access Key などを聞かれるので入力します。(この設定は cdk-demo という名前で保存されます)

####【パターンB:SSO (IAM Identity Center) を使用する場合】

aws configure sso --profile cdk-demo
※ SSOを使用する場合、古い credentials ファイルの情報が残っていると認証エラーになることがあります。
CDKコマンド実行時にエラーが出る場合は .aws/credentials ファイルを確認してください。

3.3 CDKプロジェクトの初期化(init)と構成確認

以下のコマンドを実行すると、TypeScript用のCDKプロジェクトの雛形が自動生成されます。

cdk init app --language typescript --profile cdk-demo
※今回はプロファイルを指定したため、CDKコマンドを実行する際は、必ず末尾に --profile cdk-demo を付ける必要があります。

フォルダ構成の確認 :
初期化が終わると、いくつかのファイルが生成されます。 特に重要になるファイルは以下の2つです。

・bin/cdk-s3-handson.ts: プログラムの実行開始地点(エントリポイント)
ここで「どのStack(構成のまとまり)を作るか」を定義します。

・lib/cdk-s3-handson-stack.ts: 使用するAWSリソースを記載する場所
具体的に「S3バケットを作る」といったリソースの定義は、このファイルの中に記述していきます。

3.4 CDK用の環境準備(Bootstrap)

CDKをそのAWS環境(リージョン)で初めて使う場合、CDKが利用する管理用リソースを準備する必要があり、これを「Bootstrap」と呼びます。

cdk bootstrap --profile cdk-demo
※ 成功すると、CloudFormationコンソールに CDKToolkit というスタックが作成されます。

4. ハンズオンStep2(コードの作成)

それでは、実際にS3バケットを作成するコードを書いてみましょう。
今回は bin フォルダと lib フォルダ配下の2つのファイルを修正します。

ステップ①:エントリポイントの記述 (bin/cdk-s3-handson.ts)

まずは、アプリの入り口となるファイルを修正します。
bin/ 配下の cdk-s3-handson.ts を以下のコードに修正してください。

#!/usr/bin/env node
import 'source-map-support/register'; // エラー時のスタックトレースを見やすくするユーティリティ
import * as cdk from 'aws-cdk-lib';   // AWS CDKの基本ライブラリをインポート
import { CdkS3HandsonStack } from '../lib/cdk-s3-handson-stack'; // libフォルダで定義したStackクラスを読み込み

const app = new cdk.App(); // CDKアプリケーション全体の初期化(ルートとなる要素)

// 定義したStack(S3リソースの定義)をアプリに追加して実体化する
new CdkS3HandsonStack(app, 'CdkS3HandsonStack', {

});

ステップ②:メインロジックの記述 (lib/cdk-s3-handson-stack.ts)

次に、S3バケットを定義するメインのコードを記述します。
lib/ 配下の cdk-s3-handson-stack.ts を以下のコードに修正してください。

import * as cdk from 'aws-cdk-lib'; // AWS CDKのコアライブラリ(StackやAppなど)をインポート
import { Construct } from 'constructs'; // Construct(リソース構成要素の基本クラス)をインポート
import * as s3 from 'aws-cdk-lib/aws-s3'; // S3モジュールをインポート

// Stackクラスを定義(CloudFormationの1つのスタックに相当)
export class CdkS3HandsonStack extends cdk.Stack {
  // コンストラクト:Stackが初期化される際に呼ばれる処理
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props); // 親クラス(cdk.Stack)のコンストラクタを呼び出し

    // S3バケットの作成
    const bucket = new s3.Bucket(this, 'MyBucket', {
      bucketName: 'my-cdk-handson-bucket0001', // バケット名は一意になるように設定する
      versioned: true, // バージョニングを有効化
      removalPolicy: cdk.RemovalPolicy.DESTROY, // スタック削除時にバケットも削除する
      autoDeleteObjects: true, // バケット削除時に中身のファイルも自動削除する
    });
    
    // 作成されたバケット名をコンソールに出力
    new cdk.CfnOutput(this, 'BucketNameOutput', { 
      value: bucket.bucketName,
      description: 'S3バケットが作成されました',
    });
  }
}

カスタムコードの解説

1.S3バケットの定義で、デフォルトの状態からこちらで追記した設定オプション (Props)のコードについて解説します。
・versioned: true
バケットのバージョニング機能をONにします。

・removalPolicy: cdk.RemovalPolicy.DESTROY
通常、CloudFormationはデータ保護のため、スタック削除コマンドを実行してもバケットを残そうとします。
しかし、今回はハンズオンなので、スタック削除時にバケットも削除されるように設定します。

・autoDeleteObjects: true
S3バケットは中身(ファイル)が入っていると削除エラーになります。
この設定を入れることで、削除時に中身を自動で空にしてからバケットを消してくれます。
エラーになりがちなポイントを回避する重要な設定です。

5. ハンズオンStep3(デプロイ〜削除)

ステップ①:CloudFormationテンプレートの確認

デプロイ前に、TypeScriptコードがどのようなCloudFormationテンプレートに変換されるか確認します。

cdk synth --profile cdk-demo
※想定していないリソースが記載されている場合はここで確認できます。

ステップ②: デプロイ

実際にAWSリソースを作成します。

cdk deploy --profile cdk-demo
・実行すると、「IAMポリシーの変更などが発生するけど大丈夫?」と聞かれるので、y(Yes)を入力してEnterを押します。

cdk-deployキャプチャ-1024x387.png

数分待つと、Stack ARN や BucketNameOutput が表示され、完了します。

ステップ③:作成されたリソースの確認

  1. AWSマネジメントコンソールで「S3」にアクセスすると、my-cdk-handson-bucket... から始まるバケットができていることが確認できます。
  2. 同じように CloudFormation にアクセスすると、CdkS3HandsonStack というスタックができていることが確認できます。

スタックのキャプチャ-1024x397.png

ステップ④:リソースの削除

最後に、以下のコマンドで作成したリソースを削除します。

cdk destroy --profile cdk-demo
・確認メッセージが出るので y を入力します。
・これでS3バケットも含め、今回作成したリソースがすべてきれいに削除されます。
(コード内で removalPolicy と autoDeleteObjects を設定したため)

cdk-destroyのキャプチャ-1024x349.png

6. まとめ

本記事では、AWS CDK (TypeScript) を使用した環境構築の基本からデプロイ・削除までを解説しました。
インフラの規模が大きくなるほど、このコード管理による利便性が向上します。
今回はS3のみを作成しましたが、EC2やLambdaなどの他リソースも同様にTypeScriptのクラスとして定義可能です。
次回は、CDKを用いてVPCおよびEC2(Webサーバー)を構築し、実際にブラウザからアクセスする手順を解説します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?