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.json
やcontext
を使って開発・ステージング・本番で異なる設定を管理します。 - CI/CDとの連携:GitHub ActionsやGitLab CIで
cdk deploy
を自動化し、コードプッシュで自動デプロイできるようにします。 - ロールベースのアクセス制御:CDKで作成したIAMロールやポリシーは最小権限の原則に従って設計します。
- テストの実装:
cdk assert
やassertions
ライブラリを使って、スタックの出力を検証します。
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
Post a Comment