AWS CDK入門:IaCでインフラ自動化

AWS CDKによるインフラ構築の自動化入門

近年、クラウドインフラをコードで管理する「インフラをコード(IaC)」の潮流が加速しています。AWS CDK(Cloud Development Kit)はその代表的なツールで、プログラミング言語(TypeScript、Python、Java、C#)を使ってAWSリソースを定義できる点が大きな特徴です。この記事では、CDKを使ってインフラ構築を自動化するための基本的な手順とベストプラクティスを紹介します。

1. CDKを始める前に

  • Node.js(v14以上)とnpmがインストールされていること
  • AWS CLIで適切なプロファイル(例: default)が設定されていること
  • Gitリポジトリを使ってコード管理を行うこと(コミット履歴がインフラ変更の追跡に役立ちます)

2. プロジェクトの作成

まずはCDKプロジェクトを作成します。ここではTypeScriptを例にします。

# プロジェクトフォルダを作成
mkdir my-cdk-app
cd my-cdk-app

# CDKプロジェクトを作成
npx cdk init app --language typescript

これでディレクトリ構成は以下のようになります。

my-cdk-app/
├─ bin/
│   └─ my-cdk-app.ts
├─ lib/
│   └─ my-cdk-app-stack.ts
├─ test/
├─ cdk.json
├─ package.json
└─ tsconfig.json

3. スタック(Stack)の定義

スタックは一つのデプロイ単位です。lib/my-cdk-app-stack.tsにリソースを定義します。ここでは簡単にVPCとS3バケットを作成します。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

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

    // VPCの作成
    const vpc = new ec2.Vpc(this, 'MyVpc', {
      maxAzs: 2, // 可用性ゾーンを2に制限
    });

    // S3バケットの作成
    const bucket = new s3.Bucket(this, 'MyBucket', {
      versioned: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY, // テスト環境での削除を許可
    });

    // 簡易的なタグ付け
    cdk.Tags.of(bucket).add('Environment', 'Dev');
  }
}

4. デプロイの実行

CDKのデプロイは非常にシンプルです。

# 依存関係をインストール
npm install

# CDKのコンテキストを初期化
npx cdk bootstrap

# デプロイ
npx cdk deploy

初回デプロイ時には「cdk bootstrap」で必要な管理リソースを作成します。その後、cdk deployでスタックが作成されます。

5. コードの管理とベストプラクティス

  • モジュール化:1つのスタックに多くのリソースを詰め込まず、機能ごとに分けて管理します。
  • 環境ごとのパラメータcdk.jsoncontextを使って開発・ステージング・本番で異なる設定を管理します。
  • CI/CDとの連携:GitHub ActionsやGitLab CIでcdk deployを自動化し、コードプッシュで自動デプロイできるようにします。
  • ロールベースのアクセス制御:CDKで作成したIAMロールやポリシーは最小権限の原則に従って設計します。
  • テストの実装cdk assertassertionsライブラリを使って、スタックの出力を検証します。

6. 高度な使い方:ライブラリ化とパッケージ化

複数のプロジェクトで共通のリソース(例:共通のVPCやログ管理構成)を再利用したい場合、CDKライブラリを作成します。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export interface SharedVpcProps {
  readonly cidr?: string;
}

export class SharedVpc extends Construct {
  public readonly vpc: ec2.Vpc;

  constructor(scope: Construct, id: string, props: SharedVpcProps = {}) {
    super(scope, id);
    this.vpc = new ec2.Vpc(this, 'SharedVpc', {
      cidr: props.cidr ?? '10.0.0.0/16',
      maxAzs: 3,
    });
  }
}

このコンストラクトを別のスタックからインポートして再利用できます。

7. まとめ

AWS CDKは、開発者の慣れ親しんだ言語でインフラを記述できるため、コードレビューやCI/CDパイプラインへの組み込みが容易です。記事ではCDKプロジェクトの作成からスタック定義、デプロイ、そしてベストプラクティスまでを紹介しました。次回はCDKとTerraformを組み合わせたハイブリッド戦略や、CDKのアドバンスド機能(Layered Architecture、Custom Resources)に挑戦してみると良いでしょう。

Comments

Popular posts from this blog

How to show different lines on WinMerge

Detect Bluetooth LE Device with BlueZ on RaspberryPi

パスワードハッシュ:bcrypt, scrypt, Argon2 徹底解説