☁️

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