CDKTF + Azureで始めるインフラコード入門【M2 Mac環境】
CDKTF + Azureで始めるインフラコード入門【M2 Mac環境】
こんにちは!この記事では、CDK for Terraform (CDKTF) を使ってAzure上にインフラを構築する方法を、筆者の愛用するMacBook Pro M2pro環境を前提に初心者向けにご紹介します。
📚 CDKTF(Cloud Development Kit for Terraform)とは?
CDKTF の位置付け
通常、Terraformでインフラを構築する場合、HCL(HashiCorp Configuration Language)という専用言語を書きます。
# 通常のTerraform(HCL)
resource "azurerm_resource_group" "example" {
name = "my-rg"
location = "Japan East"
}
一方、CDKTFは、TypeScript、Python、Go などのプログラミング言語を使って、Terraformコードを生成するツールです。
// CDKTFの場合(TypeScript)
const rg = new ResourceGroup(this, "example", {
name: "my-rg",
location: "Japan East"
});
CDKTF の利点
- プログラミング言語で記述できる → ロジックが容易、変数操作が直感的
- TypeScript/Python の IDE サポート → 補完やバリデーション
- Terraform の資産は活かせる → 最終的には Terraform ファイルに変換される
- 再利用可能なコンポーネント化 → インフラのDRY原則が実現しやすい
CDKTF vs 他のIaC ツール
| ツール | 言語 | 学習曲線 | Azure対応 |
|---|---|---|---|
| Terraform (HCL) | HCL専用 | 中程度 | ◎ 公式対応 |
| CDKTF | TypeScript/Python等 | 低い(プログラマ向け) | ◎ 公式対応 |
| Bicep | 専用言語 | 中程度 | ◎◎ Azure最適化 |
| Pulumi | TypeScript/Python等 | 低い | ◎ 公式対応 |
初心者向けの位置付け: プログラマであれば CDKTF は学習曲線が低く、TypeScript の知識があれば直感的に始められます。
🛠️ M2 Mac での環境セットアップ
前提条件チェック
まず、あなたのMacで必要なツールがインストールされているか確認しましょう。
# 確認コマンド
which node # Node.js がインストールされているか
which npm # npm がインストールされているか
which terraform # Terraform がインストールされているか
which az # Azure CLI がインストールされているか
どれかが見つからなければ、以下のセットアップ手順に進みます。
📥 ステップ 1: 必須ツールのインストール
1-1. Node.js & npm のインストール
M2 Mac では、Homebrew を使うのが最も簡単です。
# Homebrew がなければインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Node.js のインストール(npm も含まれます)
brew install node
# インストール確認
node --version # v18 以上推奨
npm --version # v9 以上推奨
1-2. Terraform CLI のインストール
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
# バージョン確認
terraform --version # v1.5 以上推奨
1-3. Azure CLI のインストール
brew install azure-cli
# バージョン確認
az --version
# Azure にログイン
az login
# ブラウザが開きます。Microsoft アカウントでサインイン
1-4. CDKTF CLI のインストール
npm install -g cdktf-cli
# バージョン確認
cdktf --version # v0.17 以上推奨
M2 Mac でのインストール時の注意点:
- Rosetta 2 互換性: ほぼ全てのツールがネイティブ対応しています
- インストール後は必ずシェルを再起動してください
# シェル再起動(zsh の場合)
exec zsh
🚀 ステップ 2: CDKTF プロジェクト初期化
2-1. プロジェクトディレクトリ作成
mkdir cdktf-azure-demo
cd cdktf-azure-demo
2-2. CDKTF プロジェクト初期化
cdktf init --template=typescript --providers=azurerm --local
コマンドのオプション説明:
-
--template=typescript→ TypeScript を使用 -
--providers=azurerm→ Azure Resource Manager プロバイダを追加 -
--local→ ローカル状態ファイルで管理(学習用)
2-3. 初期化時の対話的入力
Project Name: cdktf-azure-demo
Project Description: CDKTF Azure Demo Project
初期化完了後のディレクトリ構造
cdktf-azure-demo/
├── main.ts # メインのコード
├── cdktf.json # CDKTF 設定ファイル
├── package.json # Node.js 依存関係
├── tsconfig.json # TypeScript 設定
├── terraform.tfvars # Terraform 変数(自動生成)
└── .gitignore
2-4. 依存パッケージの確認・インストール
npm install
💻 ステップ 3: 最初のサンプルコード
3-1. Azure認証設定
まず、Azure Provider を設定します。main.ts を以下のように編集します。
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { AzurermProvider } from "@cdktf/provider-azurerm/lib/provider";
import { ResourceGroup } from "@cdktf/provider-azurerm/lib/resource-group";
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string) {
super(scope, id);
// Azure Provider の設定
new AzurermProvider(this, "azurerm", {
features: {},
skipProviderRegistration: true,
});
// Azure リソースグループを作成
new ResourceGroup(this, "example", {
name: "rg-cdktf-demo",
location: "Japan East",
});
}
}
const app = new App();
new MyStack(app, "cdktf-azure-demo");
app.synth();
3-2. コード解説
| 部分 | 説明 |
|---|---|
AzurermProvider |
Azure と連携するためのプロバイダ設定 |
ResourceGroup |
Azure 上のリソースグループを定義 |
features: {} |
Provider の機能設定(デフォルト) |
name |
リソースグループの名前 |
location |
リソースが配置されるリージョン |
🔄 ステップ 4: プロジェクト初期化からデプロイまで
4-1. TypeScript のコンパイル
npm run build
出力例:
✔ generated Terraform code in /path/to/cdktf.out
4-2. 生成された Terraform コードの確認
cat cdktf.out/stacks/cdktf-azure-demo/main.tf
HCL 形式の Terraform コードが自動生成されています!
# 自動生成されたコード例
resource "azurerm_resource_group" "example" {
location = "Japan East"
name = "rg-cdktf-demo"
}
4-3. Terraform 初期化
cd cdktf.out/stacks/cdktf-azure-demo
terraform init
初回実行時は、Terraform が必要なプロバイダプラグインをダウンロードします。
4-4. デプロイ計画の確認
terraform plan
実際に作成されるリソースを確認できます:
Terraform will perform the following actions:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = (known after apply)
+ location = "Japan East"
+ name = "rg-cdktf-demo"
}
Plan: 1 to add, 0 to change, 0 to destroy.
4-5. Azureへのデプロイ実行
terraform apply
確認プロンプトが表示されます:
Do you want to perform these actions?
Terraform will perform the following actions...
Enter a value: yes
yes と入力してEnterキーを押すと、Azure 上にリソースが作成されます!
デプロイ完了後の出力例:
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
4-6. リソースの確認
# CLI で確認
az group show --name rg-cdktf-demo
# または Azure Portal で確認
# https://portal.azure.com → リソースグループ
🧹 ステップ 5: クリーンアップ(リソース削除)
学習用リソースなので、不要になったら削除しましょう。
cd cdktf.out/stacks/cdktf-azure-demo
terraform destroy
確認プロンプト:
Do you really want to destroy all resources?
Enter a value: yes
リソースが Azure から削除されます。
📋 フルコード参考:main.ts
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { AzurermProvider } from "@cdktf/provider-azurerm/lib/provider";
import { ResourceGroup } from "@cdktf/provider-azurerm/lib/resource-group";
interface MyStackConfig {
resourceGroupName: string;
location: string;
}
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string, config: MyStackConfig) {
super(scope, id);
// Azure Provider
new AzurermProvider(this, "azurerm", {
features: {},
skipProviderRegistration: true,
});
// Resource Group
new ResourceGroup(this, "resourceGroup", {
name: config.resourceGroupName,
location: config.location,
});
}
}
const app = new App();
new MyStack(app, "cdktf-azure-demo", {
resourceGroupName: "rg-cdktf-demo",
location: "Japan East",
});
app.synth();
このあたりまでは簡単にcdkでIaCが実現できそうな希望に満ち溢れた未来がイメージできるのですが、この先に驚くような困難を筆者を襲います
それはまた次の機会にでも。。。
🤝 参考資料
Happy Coding! 🚀
Discussion