はじめに

さくらのクラウドを使用したシステム構築の依頼がありました。

ロードバランサー、webサーバー、DBサーバーといったコンポーネントで、DBサーバはインターネットに公開しないというようなよくある構成です。

馴染みがなかったので、AWSでいうところのコントロールパネルを使用して作っていました。が、試行錯誤するにはIaCでやりたいなと思って調べたら、terraformが対応しているじゃないですか。

ということで、terraformを使って作ってみました。この記事では個人的に躓いた箇所を中心に書きます。

参考にした記事など

公式のドキュメントです。

Terraform for さくらのクラウド(v2)

ユーザーコミュニティのドキュメントです。具体例がコードで掲載されているので、高頻度で参照しました。

sacloud/docs.usacloud.jp: Documents for sacloud OSS products

手始めに写経するのにもってこいです。

さくらのクラウドでTerraformを使ってみる | さくらのナレッジ

terraformのポイント

provider

以下のように、バージョンは2.22.0を使用しました。高頻度でバージョンがあがっているようなので、公式ドキュメントを参照して最新のを使用した方が良いと思います。

私は古いバージョンを使用していまして、OSにUbuntu22.04を使用したかったのに定義されてないと怒られて、バージョンを新しくする必要があることに気が付きました。

terraform {
  required_providers {
    sakuracloud = {
      source  = "sacloud/sakuracloud"
      version = "2.22.0"
    }
  }
}

サーバのNIC

ここはつまづきました。

webサーバーに3つのNICを用意するのですが、記述した順番にeth0、eth1、eth2とNICが作られます。

そして、インターネットに接続するNICは一番上に記述する必要があります。

さらにuser_ip_addressは構成図に表示されるIPアドレスです。ここで設定したIPアドレスがNICに割り当てられると思ってましたが、そうではないので注意が必要です。(ドキュメントには表示されるIPアドレスということは書いてあります。読めということですね。)

 network_interface {
    upstream = "shared"
  }
  
  network_interface {
    upstream        = sakuracloud_switch.fpm_sw.id 
    user_ip_address = "192.168.99.1" 
  }

  network_interface {
    upstream        = sakuracloud_switch.db_sw.id 
    user_ip_address = "192.168.100.1" 
  }

NICへのIPアドレス割り当て

ではどうするかというと、以下のようにサーバーの定義内でnoteを使用します。

   note {
      id = data.sakuracloud_note.ipaddress.id
      variables = {
        addresses = <<EOT
192.168.99.1/24
192.168.100.1/24
EOT
      }
    }

合わせて、スタートアップのスクリプトのためのsakuracloud_noteを使用します。

data "sakuracloud_note" "ipaddress" {
  filter {
    names = ["IPアドレス設定スクリプト for Ubuntu"]
  }
}