ConoHaとTerraformで始めるインフラ自動化 前編:導入から基本のサーバー構築まで

本記事ではConoHa VPS Ver.3.0とTerraformを用いたインフラ管理の導入とシンプルなサーバーの構築方法を解説します。初めての方向けに環境構築や基礎的な設定手順を説明し、実際のサンプルコードを用いて進行します。

後編の「GPUサーバー構築と運用ガイド」も併せてご覧ください。
二部構成の本シリーズで、Terraformでのインフラ自動化を学ぶことができます。

1. はじめに:ConoHaとTerraformの強力な組み合わせ

クラウドインフラの管理と自動化は、現代のITインフラの運用において非常に重要です。ConoHaは、日本国内で提供されているクラウドサービスの中でも、その使いやすさとコストパフォーマンスの高さから、多くのユーザーの皆様にご利用いただいております。

本記事では、ConoHa VPS Ver.3.0とTerraformを組み合わせることで、GPUサーバーを効率的に構築・管理する方法を二部構成でご紹介します。

本記事の目的と対象読者

この記事は、以下のような方々を対象としています。

  • クラウドインフラの自動化に興味のある初心者から中級者のエンジニア
  • DevOps実践者やインフラ管理者
  • 高性能なGPU環境を手軽に構築したい研究者や開発者
  • ConoHa VPSをより活用したい方

本記事ではConoHaやTerraformにあまり触れたことない方への解説も記載しています。TerraformからConoHaを利用するための公開リポジトリの使い方を手っ取り早く知りたい方はクイックスタート:1GBプランのサーバーをさくっと構築の章からご覧ください。

公開リポジトリの紹介とその特徴

本記事で使用するコードと設定ファイルは、以下のGitHubリポジトリで公開しています:

GitHub – skworks33/terraform-conoha-v3-api

ConoHa VPS Ver.3.0の魅力

2023年にバージョン3としてバージョンアップされたConoHa VPSには以下のような特徴があります。

  • 時間課金制により必要な時だけ利用、初期費用なし
  • 無料で利用可能なパブリックAPI
  • ストレージがローカルストレージから分散ストレージとなり耐障害性向上
  • NVIDIA GPU搭載サーバーが利用可能

Terraformによるインフラ管理のメリット

Terraformを使用することで、以下のようなメリットが得られます。

  • インフラのコード化 (Infrastructure as Code)
    環境構築の再現性が向上
    バージョン管理によるインフラの変更履歴の追跡が容易
  • 自動化と効率化
    複雑なインフラ構成も短時間で構築可能
    人的ミスの削減とプロビジョニング時間の短縮
  • 状態管理
    インフラの現在の状態を常に把握可能
    複数人での協調作業がスムーズに

2. 環境構築:スムーズな開始のために

Terraformのインストール

以下はMacOSにHomebrewを使用してTerraformをインストールする際のコマンド例です。

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Terraformのインストールについての詳細な手順は、公式ドキュメントを参照してください。

ConoHa APIの認証情報の取得

ConoHa APIを利用するためには、APIユーザ作成と認証情報が必要です。

ConoHaのコントロールパネルにログインし、左メニュー内の「API」からテナントやユーザなどの各種認証情報を確認し控えてください。

ConoHaに初めて触れる方や、より詳細な手順を知りたい方は、以下記事内の『ConoHa API利用のための事前準備ガイド』のセクションを参照してください。

ConoHa APIを「Postman API ネットワーク」で使えるようにしてみた – ConoHa API利用のための事前準備ガイドセクション

OpenStack CLIのインストール (オプション)

OpenStack CLIは、本記事で紹介しているサンプルコードをカスタマイズしたい場合や、トラブルシューティングの際に活用できるツールです。詳細やインストール方法については後編末巻の「OpenStack CLIの活用シナリオとセットアップ方法」を参照してください。

3. Terraform基礎:ConoHaリソース管理の第一歩

このセクションでは、Terraformの基本的な概念とTerraformからConoHaを利用するための方法について解説します。

Terraformの主要な概念とHCL文法の簡単な解説

Terraformは、宣言型のアプローチでInfrastructure as Code (IaC) を実現可能なツールです。以下で主要な概念と、使用する設定言語であるHashiCorp Configuration Language (HCL) の基本について説明します。

主要な概念

  • リソース (Resource) : インフラの構成要素 (例:仮想マシン、ネットワーク)
  • プロバイダー (Provider) : 特定のクラウドプロバイダーやサービスとの連携を可能にするプラグイン
  • モジュール (Module) : 再利用可能なTerraformコードの集まり
  • 状態 (State) : Terraformが管理するリソースの現在の状態

HCL文法の基本

HCLは読みやすく書きやすい設定言語です。以下に基本的な構文を示します:

# リソースの定義
resource "openstack_compute_instance_v2" "example" {
  name        = "example-instance"
  image_id    = "uuid-of-image"
  flavor_id   = "flavor-id"
  
  network {
    name = "your-network"
  }
}

# 変数の定義
variable "instance_count" {
  type    = number
  default = 1
}

# 出力値の定義
output "instance_ip" {
  description = "The IP address of the created instance."
  value = openstack_compute_instance_v2.example.access_ip_v4
}

OpenStackプロバイダーの設定と主要リソースの定義方法

TerraformからConoHaのインフラを操作するには、OpenStack Providerを利用するのが最適です。ConoHaはOpenStackを基盤とし、OpenStackに準拠したAPIを提供しているためです。1

プロバイダーの設定

terraform {
  required_providers {
    openstack = {
      source = "terraform-provider-openstack/openstack"
      version = "~> 2.0.0"
    }
  }
}

provider "openstack" {
  domain_name = "gnc" # ConoHa VPS は gnc 固定
  auth_url    = var.conoha_v3_auth_url
  tenant_name = var.conoha_v3_tenant_name
  user_name   = var.conoha_v3_user_name
  password    = var.conoha_v3_password
}

ブート用ボリューム作成の定義例

resource "openstack_blockstorage_volume_v3" "volume" {
  name = var.boot_volume_name
  size = 100
  image_id = data.openstack_images_image_v2.image.id
  volume_type = var.boot_volume_type_name
}

インスタンス (サーバー) 作成の定義例

resource "openstack_compute_instance_v2" "instance" {
  name = var.instance_name
  flavor_id = data.openstack_compute_flavor_v2.flavor.id
  key_pair = openstack_compute_keypair_v2.keypair.name
  security_groups = [
    var.default_security_group
  ]
  admin_pass = var.instance_root_password
  metadata = {
    instance_name_tag = var.instance_name
  }
  user_data = data.template_file.user_data.rendered

  block_device {
    uuid = openstack_blockstorage_volume_v3.volume.id
    source_type = "volume"
    destination_type = "volume"
  }

  depends_on = [
    openstack_compute_keypair_v2.keypair,
    openstack_blockstorage_volume_v3.volume
  ]
}

ステートファイルの重要性と効果的な管理手法

Terraformは現在のインフラ状態をステートファイル (terraform.tfstate) に保存します。このファイルはリソースの現在の状態を記録しており、リソースの追跡、差分の検出、大規模なインフラの管理を効率化するために重要となります。

ステートファイルの管理には以下のポイントがあります。

  • Backend Configuration: デフォルトではローカルディスクに保存されますが、オブジェクトストレージやTerraform Cloudなどのリモートに保存する方法があります。
  • State Locking: Terraformには同時編集による競合を防ぐためにステートをロックする機能があります。
  • Protecting sensitive data: ステートファイルには機密情報が含まれるため、用途によっては難読化や適切な保存先を選択する必要があります。

4. クイックスタート:1GBメモリプランのサーバーをさくっと構築

このセクションでは、公開リポジトリのサンプルコードを使用して、ConoHa上に基本的なサーバーを素早く構築する方法を説明します。

本手順で以下のリソースが作成されます。

  • サーバーに接続するためのSSHキーペア
  • サーバーに設定するセキュリティグループ
  • 100GBのブートボリューム (OSイメージはUbuntu22.04)
  • 上記リソースを用いた「2vCPU, 1GB RAM」のサーバー1台

またConoHaで作成するサーバーはcloud-initが稼働していますので、任意のuser-dataスクリプトを指定することで、サーバーの起動時に内部でスクリプトが実行され、サーバーのセットアップを自動化する事ができます。本サンプルでは以下の「ホスト名を任意の名前に設定する」スクリプトをTerraformから指定しています。

#cloud-config
merge_how:
  - name: list
    settings: [append]
  - name: dict
    settings: [no_replace, recurse_list]
runcmd:
  - |
    hostnamectl set-hostname ${hostname} --static
    hostnamectl set-hostname ${hostname} --transient

1. リポジトリのクローン

まず、GitHubからリポジトリをクローンします。ターミナルで以下のコマンドを実行してください。

git clone https://github.com/skworks33/terraform-conoha-v3-api.git
cd terraform-conoha-v3-api

2. 認証情報の設定

ConoHa APIの認証情報の取得のセクションで取得したConoHaの認証情報とサーバー作成に必要な変数を環境変数として設定、またはterraform.tfvarsファイルに記述します。2

オプション1: 環境変数の使用

環境変数を使用すると、機密情報をコードに直接記述せずに済みます。

export TF_VAR_conoha_v3_auth_url="https://identity.c3j1.conoha.io/v3"
export TF_VAR_conoha_v3_tenant_name="gnct********"
export TF_VAR_conoha_v3_user_name="gncu********"
export TF_VAR_conoha_v3_password="****************"
export TF_VAR_ssh_keypair_name="your-terraform-keypair-name"
export TF_VAR_ssh_keypair_public_key="ssh-rsa AAAAB3NzaC1yc2EAAAA..."
export TF_VAR_boot_volume_name="your-terraform-boot-volume-name"
export TF_VAR_instance_name="your-terraform-instance-name"
export TF_VAR_instance_root_password="****************"

オプション2: terraform.tfvarsファイルの使用

terraform.tfvarsファイルを作成し、必要情報を記述します:

conoha_v3_auth_url        = "https://identity.c3j1.conoha.io/v3"
conoha_v3_tenant_name     = "gnct********"
conoha_v3_user_name       = "gncu********"
conoha_v3_password        = "****************"

ssh_keypair_name          = "your-terraform-keypair-name"
ssh_keypair_public_key    = "ssh-rsa AAAAB3NzaC1yc2EAAAA..."
boot_volume_name          = "your-terraform-boot-volume-name"
instance_name             = "your-terraform-instance-name"
instance_root_password    = "****************"

注意点:

  • terraform.tfvarsはGit等のバージョン管理システムへのコミットを防ぐため.gitignoreファイルに追加することをお勧めします。
  • ssh_keypair_public_keyには、SSH接続時に用いるキーペアの公開鍵の内容を記入してください。
  • instance_root_passwordは十分に強力なパスワードを設定してください3

3. Terraformの初期化

プロジェクトディレクトリで以下のコマンドを実行し、Terraformを初期化します:

terraform init

4. 設定の確認

実行計画を確認して、作成されるリソースを事前に把握します:

terraform plan

5. アクションの実行

問題がなければ、以下のコマンドでアクションを実行します:

terraform apply

確認メッセージが表示されたらyesと入力し、Apply complete!が表示されるまで待ちます。

正常に完了した場合、最終的に以下のような出力になります。もし問題が発生した場合はエラー内容を確認してください。また、後編巻末のトラブルシューティングも参考にしてください。

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

Outputs:

instance_id = "4ac99b67-3e88-4c4c-a088-0aeb63dd1051"
instance_ip = "xxx.xxx.xxx.xxx"

6. 作成されたリソースの確認

Terraformの実行が完了したら、ConoHaのコントロールパネルにログインして、実際に作成されたリソースを確認してください。また、terraform showコマンドを使用して、現在の状態を表示することもできます:

terraform show

7. クリーンアップ

作成したリソースが不要になった場合は、以下のコマンドで全てのリソースを削除できます:

terraform destroy

このコマンドを実行すると、Terraformで管理されているすべてのリソースが削除されます。

以上の手順で、ConoHa上に基本的なサーバーを素早く構築することができます。環境変数とterraform.tfvarsファイルのどちらを使用するかは、セキュリティ要件や個人の好みに応じて選択してください。

5. まとめ

本記事ではConoHa VPS Ver.3.0とTerraformを組み合わせて、効率的にインフラを構築する方法について解説しました。

ConoHa VPSは、日本国内で提供されている使いやすいクラウドサービスです。一方で、TerraformはIaCを実現する強力なツールです。これらを組み合わせることで、リソースの作成・管理を自動化し、再現性の高い環境を構築できます。

後編「GPUサーバー構築と運用ガイド」では、NVIDIA L4 GPU搭載サーバーの構築例を用いて、より実用的なConoHaとTerraformの組み合わせ方を解説します。ぜひご覧ください。


  1. ConoHa独自の機能や仕様上の制約により、OpenStack Providerでは動作しない機能も存在します。 ↩︎
  2. 別の方法として、terraform applyコマンド実行時のオプションとして指定することもできます。詳しくは公式ドキュメントをご確認ください。未指定かつデフォルト値が存在しない場合はコマンド実行時に入力を求められます。 ↩︎
  3. ConoHaでは、公開鍵を指定してサーバー作成を行った際は自動的にSSH時のパスワード認証は無効となりますが、万が一有効化する場合に備え、セキュリティを考慮したパスワードが必要です。 ↩︎

後編

後編の「GPUサーバー構築と運用ガイド」も併せてご覧ください。
二部構成の本シリーズで、Terraformでのインフラ自動化を学ぶことができます。

ブログの著者欄

小玉 祥平

GMOインターネットグループ株式会社

2014年よりGMOインターネットグループ株式会社にてバックエンドエンジニアとして従事。OpenStack、Docker、Kubernetesを用いた複数のクラウドサービスのWebAPI設計・開発・運用を10年以上経験。現在は主にConoHaのサービス改善に注力。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック