Terraform for さくらのクラウド で実現するインフラ自動化 (1) ~ ディスク+サーバを構築しよう

Terraform(テラフォーム)は、インフラ構成をコードで管理し、構築や変更を効率化するIaC(Infrastructure as Code)ツールです。

本記事から全2回にわたり、さくらのクラウド向けTerraformプロバイダ「Terraform for さくらのクラウド」を中心に、Terraformの基本的な考え方から実際の操作、利用イメージまでを開発者視点で解説します。さくらのクラウドをコード管理したい方や、Terraformの導入・移行を検討しているエンジニア、インフラの自動化・運用改善に関心のある方におすすめです。

さくらのナレッジでは2022年にも「さくらのクラウドでTerraformを使ってみる」という記事を公開しましたが、これは「Terraform for さくらのクラウド v2」が対象でした。現在は「Terraform for さくらのクラウド v3」を提供しており、新規の利用については「v3」の方を推奨していますので、ぜひ本記事を参考にしてください。

第1回では、Terraformの基本的な使い方を解説しつつ、さくらのクラウド上に「ディスク+サーバ」を構築してみます。

インフラをコードで管理するInfrastructure as Code

IaC(Infrastructure as Code)とは、ITシステムのインフラ構成をコードとして定義し、自動的に構築・管理する手法です。サーバーやネットワーク、データベース、ロードバランサーなど、これまで手作業で作ったり管理画面(GUI)で設定したりしていた作業を、設定ファイル(コード)として記述してシステムを自動構築できます。

従来の手作業中心のインフラ構築には、次のような課題があります。

  • 手作業/手入力のため、設定ミスが起きやすい
  • 誰が・いつ・何を変更したか記録が残らない
  • 環境(本番/検証/開発)を揃えるのが大変
  • 同じ構成をもう一度作るのに手間がかかる

IaCツールを利用することで、こうした課題を解決して次のような効果が得られます。

  • 同じシステム構成を何度でも手間をかけずに再現できる
  • システム構成の内容をコードとして記録できる
  • Gitでバージョン管理できる
  • 変更差分が分かるので安全

普段からGitHubなどでコードを差分管理しているエンジニアであれば、インフラをコード管理するメリットは十分理解できると思います。

Terraformとは

IaC(Infrastructure as Code)を実現するツールはいくつか種類があり、用途や思想、得意分野がそれぞれ異なります。その中でTerraformは代表的なIaCツールで、HashiCorp社が開発・提供しています。

Terraformには、次のような特徴があります。

  • システム構成を宣言的に記述できる
  • State(状態)を管理して差分適用できる
  • AWS / Azure / GCP / さくらのクラウド など多数対応
  • コミュニティ・事例が非常に多い

システム構成を宣言的に記述するとは、最終的な「あるべきインフラの状態」をコードで宣言する考え方です。作成手順を逐一書くのではなく、意図した構成をそのまま表現でき、結果として設定が読みやすくなり、変更点の把握やレビューもしやすくなります。

State(状態)を管理して差分を適用するとは、現在のインフラ状態をStateとして記録し、コードとの差分を自動で比較する機能です。変更が必要な部分だけを適用できるため、インフラの一部を安全に更新できます。その結果、意図しない再作成や設定漏れを防止して、安定した運用が可能になります。

Terraformでは、多数のクラウドサービスに対応するためのプラグイン機能を「プロバイダー」として提供しています。Terraform Registryで、5000件以上の「プロバイダー」が公開されており、モジュールやポリシーなど一部機能だけを公開することもできます。クラウドベンダーからスタートアップのサービスまで、さまざまなプロバイダが存在しており、さくらインターネットでも、「さくらのクラウド」のリソースを管理するためのプロバイダーとして「Terraform for さくらのクラウド」をここで提供しています。

このツールを使うことで、Terraformでさくらのクラウドのリソースを宣言的に定義し、構築・変更・削除できます。

Terraform for さくらのクラウド v3を提供中

現在、さくらのクラウドでは、プロバイダーとしてTerraform for さくらのクラウドの「v3」を提供しています。

「v3」は、以前から提供していた「v2」と完全な互換性がないので注意してください。「v2」は、Terraform SDK v2ベースで開発していましたが、Terraform自体がSDK v2を非推奨にしているため、現在の「v2」はメンテナンスモードになっています。

これに対して「v3」は、Terraform Plugin Frameworkベースで開発しており、厳密な型定義やWriteOnly属性などを強化しています。あわせて、非推奨機能も削除しています。

これまで「v2」を使っていた場合は「v3」で設定ファイルの一部書き換えが必要になる場合があります。プロバイダー名も変更になっているので、「v2」と「v3」を共存させて少しずつ移行することも可能です。

さくらのクラウド上にディスク+サーバを構築する手順

それでは、Terraformを使って、実際にさくらのクラウド上にシステムを構築する手順を紹介します。大きな流れは、次のようになります。

  1. Terraformをインストール
  2. プロバイダーの設定ファイルを記述する
  3. terraform initコマンドを実行
  4. 接続先情報を記述する
  5. terraformコマンドを実行
  6. サーバ用にSSH公開鍵を作成
  7. ディスクとサーバのセットアップファイルを書く
  8. サーバを作成する

利用前の準備

さくらのクラウドを利用するには、さくらのクラウドの会員IDが必要です。

会員IDは、さくらのクラウドのサービスページから申し込むことができます。

1. Terraformをインストール

まず、Terraformを実行したいマシンにインストールします。Terraformが対応している代表的なOSとインストール方式を下記に示します。

  • macOS:Homebrewでインストール
  • Linux:パッケージ管理システムでインストール
  • Windows:公式ページからダウンロードして、exeファイルを適当なフォルダに置く

インストール方法の詳細は、Terraform公式サイトに記載されています。

インストールしたら、次のコマンドで動作確認してみましょう。

$ terraform version

Terraform v1.x.x
on windows_amd64

2. プロバイダーの設定ファイルを記述する

続いて、インフラ構築したいサービスに合わせて、プロバイダーの設定ファイル「terraform_sakura.tf」を記述します。

「さくらのクラウド」の設定ファイルは次のようになります。このファイルを、コマンドを実行したいカレントディレクトリに配置します。

# プロバイダーの指定
terraform {
  required_providers {
    sakura = {
      source = "sacloud/sakura"
      version = "3.8.1"
    }
  }
}

「Terraform for さくらのクラウド v3」を利用する場合、「source = "sacloud/sakura"」を指定します。「version = "3.8.1"」では、バージョン番号を指定しています。バージョン番号は、「Terraform for さくらのクラウド v3」のTerraform Registryページで確認できます。

3. terraform initコマンドを実行

設定ファイルを用意したら、ファイルを置いたディレクトリでterraform initコマンドを実行します。このコマンドで、Terraform Registryに接続できるか確認します。

$ terraform init

Initializing the backend...
Initializing provider plugins...
- Finding sacloud/sakura versions matching "3.8.1"...
- Installing sacloud/sakura v3.8.1...
- Installed sacloud/sakura v3.8.1 (self-signed, key ID xxxxxxxxxxxxxxx)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://developer.hashicorp.com/terraform/cli/plugins/signing
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

...

initコマンドを実行することで、Terraformは、選択したプロバイダーを記録するために、ロックファイル「.terraform.lock.hcl」を作成します。このファイルをバージョン管理リポジトリに含めておくと、将来「terraform init」を実行した際に、Terraformがデフォルトで同じ選択を行うことが保証されます。

4. 接続先情報を記述する

次に、接続先サービスの情報を記述して、プロバイダーをセットアップします。ここでは、さくらのクラウドのAPIキーやシークレットなどを指定します。

APIキーは、「さくらのクラウド」にログインして、コントロールパネルにアクセスして次のように作成します。

  • APIキーの種類:リソース操作APIキー
  • アクセスレベル:作成・削除
  • サービスへのアクセス権:利用するサービスで有効化(例:オブジェクトストレージやAppRunなど)

APIキー作成の詳細は、クラウドマニュアルのAPIキーを参照してください。

接続先の情報は、先ほどの設定ファイル(terraform_sakura.tf)に追記します。

# プロバイダーのセットアップ
provider "sakura" {
  #profile = "app1"               # usacloudのプロファイルがある場合
  token = var.provider_token      # トークンとシークレットを直接記述する場合
  secret = var.provider_secret    # トークンとシークレットを直接記述する場合
  zone = "tk1b"                   # デフォルトのゾーンを指定
}

トークンとシークレットを指定する場合は、設定ファイルに記述しないで、次の2つのファイルで変数として記述します。ここでは、variables.tfで変数名を定義し、secrets.auto.tfvarsでトークンとシークレットを記述しています。トークンとシークレットが流出しないよう、secrets.auto.tfvarsファイルは、必ずGitの対象から除外してください。

# 変数定義
variable "provider_token" {
  type      = string
  sensitive = true
}

variable "provider_secret" {
  type      = string
  sensitive = true
}

# トークンとシークレットを記述
# このファイルはGitの対象から除外すること
provider_token   = "your_provider_token"
provider_secret = "your_provider_secret"

さくらのクラウドの公式CLIツールであるusacloudを利用しているなら、そのプロファイルを指定できます。この場合、「profile = "app1"」のようにプロファイル名を指定することで、tokenやsecretを直接書かなくても、usacloudのプロファイル情報をTerraformが参照できます。この場合、「token」と「secret」は省略してください。

zone = "tk1b"」では、インフラ構築先となるデフォルトのゾーンを指定しています。本記事執筆時点で利用できるリージョンとゾーンは、次の通りです。

  • tk1a:東京第1ゾーン
  • tk1b:東京第2ゾーン
  • is1a:石狩第1ゾーン
  • is1b:石狩第2ゾーン
  • is1c:石狩第3ゾーン

最新の情報はマニュアルを参照してください。

5. terraformコマンドを実行

接続先情報が準備できたら、terraformコマンドを実行します。

まずは、terraform planコマンドで設定内容を検証します。

$ terraform plan

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.

この時点ではまだリソース定義を書いていないため、Terraformが管理対象として認識するリソースが存在せず、「No changes」と表示されます。これはエラーではありません。

特にエラーがなければ、terraform applyコマンドで設定内容を適用できるか試してみます(この時点ではリソース定義が存在しないため、terraform applyを実行しても作成対象はありません)。

$ terraform apply

6. サーバ用にSSH公開鍵を作成

それでは、実際にサーバを構築していきます。

まずは、サーバ接続用の暗号化キーを作成します。ssh-keygenでは、次のコマンドで暗号化キーを作成します。

$ ssh-keygen -t ed25519

これで、秘密鍵(~/.ssh/id_ed25519)と公開鍵(~/.ssh/id_ed25519.pub)が作成されます。ここではデジタル署名アルゴリズムとしてRSAよりセキュアな「Ed25519」を指定しています。

7. ディスクとサーバのセットアップファイルを書く

続いて、ディスクとサーバのセットアップファイルを記述します。「さくらのクラウド」では、ディスクとサーバをそれぞれ用意する必要があります。

# ディスクのセットアップ

data "sakura_archive" "ubuntu" {
  os_type = "ubuntu"
}

resource "sakura_disk" "foobar" {
  name = "foobar"
  source_archive_id = data.sakura_archive.ubuntu.id
}

# サーバのセットアップ

resource "sakura_server" "foobar" {
  name = "foobar"
  disks = [sakura_disk.foobar.id]
  core = 1
  memory = 1

  network_interface = [{upstream = "shared"}]

  disk_edit_parameter = {
    hostname = "foobar"
    password_wo = var.server_password # サーバパスワード変数
    disable_password_auth = true
    ssh_keys = [
      file("~/.ssh/id_ed25519.pub") # 公開鍵ファイルを指定
    ]
  }
}

利用できるOSと、そのos-typeは、下記を参照してください。

ここでは「password_wo」でOS初期セットアップ時の管理者パスワードを指定しています。SSH鍵認証を有効にする場合でも、初期設定として指定が必要です。

サーバパスワード変数と実際のパスワードは、「variables.tf」と「secrets.auto.tfvars」に追記しておきます。

# サーバパスワード変数
variable "server_password" {
  type      = string
  sensitive = true
}
# 実際のサーバパスワード(Gitから除外すること)
server_password = "your_server_password"

8. コマンドを実行して、サーバを作成する

では、実際にサーバを構築してみましょう。

Terraformのplanコマンドとapplyコマンドで、実際にインフラを作っていきます。

$ terraform plan

data.sakura_archive.ubuntu: Reading...
data.sakura_archive.ubuntu: Read complete after 1s [id=113701786854]
 Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
$ terraform apply

sakura_disk.foobar: Creating...
…
sakura_server.foobar: Creating...
…
 Apply complete\! Resources: 2 added, 0 changed, 0 destroyed.

これで、さくらのクラウド上にサーバとディスクを構築できました。コントロールパネルを見ると、サーバが作成されているのが確認できます。このように、一度コードを書いておけば、同様のシステムを何度でもいくつでもコマンドを実行するだけで再現できるのです。

Terraform管理下のリソースを削除するにはterraform destroyを実行します。

$ terraform destroy   # リソースの削除

ディスクを残したままにしていると、サーバを削除しても課金が継続されます。検証用途の場合は、不要になったリソースを必ずterraform destroyコマンドで削除してください。

まとめ

ここまで、Terraformの基本的な使い方を解説しながら、さくらのクラウド上にディスク+サーバを構築してみました。手動で作る場合は、基本的な操作や仕組みを確認しやすくなりますが、同一構成を繰り返し構築する場合や設定変更を安全に管理したい場合は、Terraformによるコード管理の方が運用の手間とコストを大きく削減できます。

次回は、Terraformを使った具体的なシステム構築例と利用上のテクニックを解説します。

関連リンク

2025年11月開催の「クラウド活用最前線セミナー」では「Terraform for さくらのクラウド」開発者の中川真宏が使い方などを解説しました。次の動画を参照してください。

クラウド活用最前線セミナー」より「Terraform for さくらのクラウド」の解説

そのほか以下のリンク先も参考にしてください。

Terraform

Terraform for さくらのクラウド

v3

関連ツール

Usacloud

Terraform policy for さくらのクラウド

さくらのナレッジでの解説記事

前述したように2022年に「v2」ベースで記述された記事を公開しています。

やってみた

外部の解説記事でも取り上げていただいています。