Claude CodeとTerraformでさくらのクラウドにサーバ構築してみた

Y
2026-04-08
2026-04-08

Claude Code利用していますか?
 資料作成やシステム構築、コード生成だけに使うのはちょっともったいないですよね。そこで今回は、Claude Code にTerraformを使ったインフラ構築について書いてみます。

対象はさくらのクラウドです。普段からお世話になっているんですが、
Terraformのproviderドキュメントを毎回読みに行くのが地味に面倒で、そこをまるっとClaudeに任せたらどうなるか、というのが今回の動機です。

結論から言うと、ほぼプロンプトを打つだけでデプロイまで完走できます。

Claude Codeとは?(念のため)

Anthropicが提供するターミナル上で動くAIエージェントです。自然言語で指示するとコードを書いたり、コマンドを実行したり、ファイルを編集したりしてくれます。

上記の説明はClaudeに「Claude Codeって何?」って聞いたのをそのまま載せているので、ハルシネーションはたぶんないはずです(笑)

claudeインストールについては割愛します。

 さっそく試してみた 

 さっそく試してみた
まずはプロジェクトディレクトリを作って claude と打つだけでエージェントが起動します。

> cd Desktop

> mkdir sakura-infra && cd sakura-infra


> claude

 ここに雑に指示を投げます。 

> さくらのクラウドにWebサーバを1台立てるTerraformコードを作ってください。ゾーンはis1b、スペックは2コア/4GB/Ubuntu22.04でお願いします。

● Claude thinking...

● 作成完了です。以下の3ファイルを作成しました。

  ファイル構成:
  - main.tf — プロバイダ、サーバ、ディスク、パケットフィルタ、スタートアップスクリプト
  - variables.tf — rootパスワード変数
  - outputs.tf — IPアドレス・SSH秘密鍵の出力

構成内容:

  ┌──────────────────┬──────────────────────────────────────────────┐
  │       項目       │                    設定値                    │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ ゾーン           │ is1b                                         │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ CPU / メモリ     │ 2コア / 4GB                                  │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ OS               │ Ubuntu 22.04                                 │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ ディスク         │ SSD 20GB                                     │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ ネットワーク     │ 共有セグメント(グローバルIP自動付与)       │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ パケットフィルタ │ SSH(22), HTTP(80), HTTPS(443), ICMP のみ許可 │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ スタートアップ   │ Nginx自動インストール・起動                  │
  ├──────────────────┼──────────────────────────────────────────────┤
  │ SSH認証          │ 鍵認証のみ(パスワード認証無効)             │
  └──────────────────┴──────────────────────────────────────────────┘


  使い方:

  # 環境変数にAPIキーを設定
  export SAKURACLOUD_ACCESS_TOKEN="your-token"
  export SAKURACLOUD_ACCESS_TOKEN_SECRET="your-secret"

  # 実行
  terraform init
  terraform plan -var 'server_password=YourSecurePassword123'
  terraform apply -var 'server_password=YourSecurePassword123'

  # SSH接続(apply後)
  terraform output -raw ssh_private_key > webserver.pem
  chmod 600 webserver.pem
  ssh -i webserver.pem ubuntu@$(terraform output -raw server_ip)

export はLinux/Macのbash用のコマンドなので、Windowsをご利用の方はこのあたりを修正する必要がありますが、数秒で3ファイルが生成されました。使い方まで出力してくれています。すごいですね。

 生成されたコードを見てみる


せっかくなので実際に生成されたコードも載せておきます。

[main.tf]

# ==================================================
# さくらのクラウド Webサーバ構築
# ゾーン: is1b / 2コア / 4GB / Ubuntu 22.04
# ==================================================

terraform {
  required_version = ">= 1.0"

  required_providers {
    sakuracloud = {
      source  = "sacloud/sakuracloud"
      version = "~> 2.25"
    }
    tls = {
      source  = "hashicorp/tls"
      version = "~> 4.0"
    }
  }
}

# プロバイダ設定
provider "sakuracloud" {
  zone = "is1b"
}

# ---------- SSH鍵 ----------
resource "tls_private_key" "ssh" {
  algorithm = "ED25519"
}

resource "sakuracloud_ssh_key" "key" {
  name       = "webserver-key"
  public_key = tls_private_key.ssh.public_key_openssh
}

# ---------- ディスク ----------
data "sakuracloud_archive" "ubuntu" {
  os_type = "ubuntu2204"
}

resource "sakuracloud_disk" "web" {
  name              = "web-disk"
  plan              = "ssd"
  size              = 20
  source_archive_id = data.sakuracloud_archive.ubuntu.id
}

# ---------- パケットフィルタ ----------
resource "sakuracloud_packet_filter" "web" {
  name = "web-filter"

  expression {
    protocol         = "tcp"
    destination_port = "22"
    description      = "Allow SSH"
  }

  expression {
    protocol         = "tcp"
    destination_port = "80"
    description      = "Allow HTTP"
  }

  expression {
    protocol         = "tcp"
    destination_port = "443"
    description      = "Allow HTTPS"
  }

  expression {
    protocol = "icmp"
    description = "Allow ICMP"
  }

  expression {
    protocol    = "ip"
    allow       = false
    description = "Deny all"
  }
}

# ---------- サーバ ----------
resource "sakuracloud_server" "web" {
  name   = "webserver"
  core   = 2
  memory = 4

  disks = [sakuracloud_disk.web.id]

  network_interface {
    upstream         = "shared"
    packet_filter_id = sakuracloud_packet_filter.web.id
  }

  disk_edit_parameter {
    hostname        = "webserver"
    password        = var.server_password
    ssh_key_ids     = [sakuracloud_ssh_key.key.id]
    disable_pw_auth = true

    note {
      id = sakuracloud_note.startup.id
    }
  }
}

# ---------- スタートアップスクリプト ----------
resource "sakuracloud_note" "startup" {
  name    = "web-setup"
  content = <<-EOF
    #!/bin/bash
    apt-get update -y
    apt-get install -y nginx
    systemctl enable nginx
    systemctl start nginx
  EOF
}
 [outputs.tf] 

output "server_ip" {
  description = "WebサーバのグローバルIPアドレス"
  value       = sakuracloud_server.web.ip_address
}

output "ssh_private_key" {
  description = "SSH秘密鍵"
  value       = tls_private_key.ssh.private_key_openssh
  sensitive   = true
}
 [variables.tf] 

variable "server_password" {
  description = "サーバのrootパスワード"
  type        = string
  sensitive   = true
}

terraform plan → apply まで一気に

 コードが固まったので、そのままapplyまでお願いしてみます。

> terraform planを実行して問題なければapplyまでやってください

⎿ Bash terraform init && terraform plan

Plan: 5 to add, 0 to change, 0 to destroy.

問題なさそうです。applyしてもよいですか?

> はい


● Apply 完了です! 全6リソースが正常に作成されました。

  ┌────────────┬──────────────────────────────────────────────────┐
  │    項目    │                        値                        │
  ├────────────┼──────────────────────────────────────────────────┤
  │ サーバIP   │ xxxxxxxx                                   │
  ├────────────┼──────────────────────────────────────────────────┤
  │ SSH秘密鍵  │ terraform output -raw ssh_private_key で取得可能 │
  ├────────────┼──────────────────────────────────────────────────┤
  │ パスワード │ xxxxxx@xxxxxx(12文字以上に変更済み)          │
  └────────────┴──────────────────────────────────────────────────┘

  SSH 接続するには:
  terraform output -raw ssh_private_key > webserver.key
  chmod 600 webserver.key
  ssh -i webserver.key ubuntu@xxxxxxxx 

  Nginx は http://xxxxxxxx  でアクセスできるはずです(スタートアップスクリプトの実行完了後)。

指示してから約3分でサーバが完成しました。Claude Codeが勝手にplanの結果を解釈して
「問題ないですよ」と教えてくれた上でapplyまで進めてくれます。一応確認を求めてくれるので、人間は判断するだけです。

 SSH接続も確認できました。

>    ssh -i webserver.key ubuntu@xxxxxxxx 


> ssh -i webserver.key ubuntu@xxxxxxxx  
Last login: Mon xxx  x xx:xx:xx2026 from  xxxxxxxx  
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
 
ubuntu@webserver:~$

ハマったところ感想

 何度か試していたのですが、全部スムーズだったかというとそうでもなく、いくつかハマりました。

401 Unauthorized : APIキーの環境変数が設定されていない or スペルミス。PowerShellで $env:SAKURACLOUD_ACCESS_TOKEN と打って確認する。

環境変数を設定したのに認証エラーが出る : PowerShellを再起動しないと永続化した環境変数が反映されないことがある。新しいウィンドウで試す。

ただ、エラーが出てもClaudeに「こんなエラーが出た」と貼り付けると原因と修正方法を教えてくれるので、
詰まる時間がかなり短くなります。自分でドキュメントを掘りに行く時間が激減した感覚があります。

プロンプトのコツ

要件と出力形式を最初に明示しておくと手戻りが少ないということです。
雑な指示でも動くんですが、こういう形式で伝えるとより精度が上がります。

さくらのクラウドにWebサーバを立てるTerraformコードを作ってください。

## 要件
- ゾーン: is1b
- スペック: 2コア / 4GB / Ubuntu 22.04
- ディスク: 50GB SSD
- 開放ポート: 22, 80, 443のみ

## 出力
main.tf / variables.tf / outputs.tf の3ファイルに分けて作成
各リソースにはコメントで用途を記載してください

感想

Claude Codeを使ってさくらのクラウドへのTerraformデプロイをやってみました。感想をまとめると:

プロンプトからapplyまでの体験がスムーズで、ドキュメントを別タブで開く必要がほぼなくなった
コード生成・レビュー・修正・実行が全部ターミナルの中で完結するのが快適
エラーもその場で貼り付けると解決策を出してくれるので、詰まる時間が激減した
もちろん生成されたコードは目視で確認する必要がありますし、最終的には人間が判断する必要があります。
完全に手放しはまだ怖いですが、「考える・書く・直す」の大部分をClaudeに任せられるようになったのは確かで、インフラ作業のスピード感がかなり変わっていきそうですね。