DigitalOceanとTerraformを使用する方法

はじめに

Terraformは、インフラストラクチャを整理して管理するためのツールです。これを使用して、DigitalOceanのDroplets、ロードバランサー、さらには他のプロバイダが提供するさまざまなサービスを管理できます。Terraformはコマンドラインインターフェイスを使用し、デスクトップまたはリモートサーバーから実行できます。

Terraformは、アプリケーション環境やデータセンターを構成するコンポーネントを記述する構成ファイルを読み取ることで機能します。その構成に基づいて、必要な状態に到達するために行う操作を記述した実行計画を生成します。その後、この計画を実行するためにTerraformを使用してインフラストラクチャを構築します。構成に変更が加えられると、Terraformは既存のインフラストラクチャを新しく記述された状態に更新するための増分計画を生成および実行できます。

このチュートリアルでは、Terraformをインストールして、DigitalOcean上に、DigitalOceanロードバランサーによってロードバランスされた2つのNginxサーバーからなるインフラストラクチャを作成し、次にDigitalOcean上にDNSエントリを追加して、ロードバランサーを指すようにします。これにより、Terraformの使用を始めることができ、自分のニーズに合ったDigitalOceanベースのインフラストラクチャを管理および展開する方法を把握できます。

注意:このチュートリアルは、Terraform 1.1.3でテストされています。

前提条件

このチュートリアルを完了するには、次のものが必要です:

ステップ1 — Terraformのインストール

Terraformは、デスクトップまたはリモートサーバーで実行するコマンドラインツールです。インストールするには、それをダウンロードしてPATHに配置し、作業しているディレクトリで実行できるようにします。

まず、適切なパッケージをOSとアーキテクチャに応じて公式のダウンロードページからダウンロードします。macOSまたはLinuxを使用している場合、curlを使用してTerraformをダウンロードできます。

macOSでは、次のコマンドを使用してTerraformをダウンロードし、ホームディレクトリに配置します:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_darwin_amd64.zip

Linuxでは、次のコマンドを使用します:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip

~/opt/terraformディレクトリを作成します:

  1. mkdir -p ~/opt/terraform

次に、unzipコマンドを使用してTerraformを~/opt/terraformに展開します。Ubuntuでは、aptを使用してunzipをインストールできます:

  1. sudo apt install unzip

次に、ダウンロードしたアーカイブを~/opt/terraformディレクトリに展開するためにそれを実行します。

  1. unzip ~/terraform.zip -d ~/opt/terraform

最後に、~/opt/terraformPATH 環境変数に追加して、実行可能ファイルの完全なパスを指定せずに terraform コマンドを実行できるようにします。

Linux の場合、新しいシェルが開かれるときに実行される .bashrc 内で PATH を再定義する必要があります。編集するには、次のコマンドを実行します:

  1. nano ~/.bashrc

注意: macOS の場合、Bash を使用している場合は、ファイル .bash_profile にパスを追加し、ZSH を使用している場合は .zshrc に追加します。

.bashrc
export PATH=$PATH:~/opt/terraform

ファイルの末尾に次の行を追加して、Terraform のパスを PATH に追加します。

編集が完了したら、ファイルを保存して閉じます。

  1. . ~/.bashrc

Linux システムで Bash を使用している場合は、次のコマンドを実行して、新しいシェルセッションに PATH をロードします:

  1. . .bash_profile

macOS で Bash を使用している場合は、代わりにこのコマンドを実行します:

  1. . .zshrc

ZSH を使用している場合は、次のコマンドを実行します:

  1. terraform

正しく Terraform をインストールしたことを確認するには、引数なしで terraform コマンドを実行します:

Output
Usage: terraform [global options] <subcommand> [args] The available commands for execution are listed below. The primary workflow commands are given first, followed by less common or more advanced commands. Main commands: init Prepare your working directory for other commands validate Check whether the configuration is valid plan Show changes required by the current configuration apply Create or update infrastructure destroy Destroy previously-created infrastructure All other commands: console Try Terraform expressions at an interactive command prompt fmt Reformat your configuration in the standard style force-unlock Release a stuck lock on the current workspace get Install or upgrade remote Terraform modules graph Generate a Graphviz graph of the steps in an operation import Associate existing infrastructure with a Terraform resource login Obtain and save credentials for a remote host logout Remove locally-stored credentials for a remote host output Show output values from your root module providers Show the providers required for this configuration refresh Update the state to match remote systems show Show the current state or a saved plan state Advanced state management taint Mark a resource instance as not fully functional test Experimental support for module integration testing untaint Remove the 'tainted' state from a resource instance version Show the current Terraform version workspace Workspace management Global options (use these before the subcommand, if any): -chdir=DIR Switch to a different working directory before executing the given subcommand. -help Show this help output, or the help for a specified subcommand. -version An alias for the "version" subcommand.

次のような出力が表示されます:

Terraform がインストールされたので、DigitalOcean のリソースと連携するように構成しましょう。

ステップ2 — DigitalOcean の Terraform の設定

Terraform は、インストールできる プロバイダー を通じてさまざまなサービスプロバイダーをサポートしています。各プロバイダーには独自の仕様があり、一般的にそれは対応するサービスプロバイダーの API にマップされます。

DigitalOcean プロバイダー は、Terraform がインフラストラクチャを構築するために DigitalOcean API と対話することを可能にします。このプロバイダーは、次のようなさまざまな DigitalOcean リソースの作成をサポートしています:

  • digitalocean_droplet: ドロップレット(サーバー)
  • digitalocean_loadbalancer: ロードバランサー
  • digitalocean_domain: DNS ドメインエントリ
  • digitalocean_record: DNS レコード

Terraform は、DigitalOcean の個人アクセス トークンを使用して DigitalOcean API と通信し、アカウント内のリソースを管理します。このキーを他の人と共有せず、スクリプトやバージョン管理から外してください。次のコマンドを実行して、DigitalOcean の個人アクセス トークンを DO_PAT という環境変数にエクスポートします:

  1. export DO_PAT="your_personal_access_token"

これにより、後続のコマンドでの使用が容易になり、コードから分離されます。

注意: もしTerraformとDigitalOceanをよく使用する場合は、前のステップでPATH環境変数を修正した方法と同じアプローチを使って、この行をシェル構成ファイルに追加してください。

以下のコマンドを実行して、インフラストラクチャ構成を格納するディレクトリを作成します:

  1. mkdir ~/loadbalance

新しく作成したディレクトリに移動します:

  1. cd ~/loadbalance

Terraformの構成ファイルは.tf拡張子で終わるテキストファイルです。人間が読める形式であり、コメントもサポートされています。(TerraformはJSON形式の構成ファイルもサポートしていますが、ここではカバーしません。)Terraformは宣言的な方法で作業ディレクトリ内のすべての構成ファイルを読み込みますので、リソースと変数の定義の順序は重要ではありません。すべてのインフラストラクチャを単一の構成ファイルに記述することもできますが、明確さを保つためにリソースタイプごとに構成ファイルを分割することをお勧めします。

Terraformでインフラストラクチャを構築する最初のステップは、使用するプロバイダーを定義することです。

TerraformでDigitalOceanプロバイダーを使用するには、Terraformにそのことを伝え、適切な認証変数でプラグインを設定する必要があります。プロバイダーの構成を保存するprovider.tfという名前のファイルを作成します:

  1. nano provider.tf

次の行をファイルに追加して、TerraformにDigitalOceanプロバイダーを使用することを伝え、Terraformがそれを見つける場所を指示します:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

次に、ファイル内で以下の変数を定義して、後続の構成ファイルで参照できるようにします:

  • do_token:あなたのDigitalOceanパーソナルアクセス トークン。
  • pvt_key:プライベートキーの場所、Terraformが新しいDropletsにログインしてNginxをインストールできるようにします。

これらの変数の値をTerraformに実行するときに渡し、ここで値をハードコーディングする代わりに構成をより移植可能にします。

これらの変数を定義するには、ファイルにこれらの行を追加します:

~/loadbalance/provider.tf
...
variable "do_token" {}
variable "pvt_key" {}

次に、DigitalOceanプロバイダを構成し、プロバイダのtoken引数にdo_tokenを割り当てることで、DigitalOceanアカウントの資格情報を指定します:

~/loadbalance/provider.tf
...
provider "digitalocean" {
  token = var.do_token
}

最後に、Terraformに新しいDropletsにSSHキーを自動的に追加させたいと思うでしょう。DigitalOceanにSSHキーを追加するときに名前を付けました。Terraformはこの名前を使用して公開鍵を取得できます。次の行を追加し、terraformをDigitalOceanアカウントで提供したキーの名前に置き換えます:

~/loadbalance/provider.tf
...
data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

完了したprovider.tfファイルは次のようになります:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

variable "do_token" {}
variable "pvt_key" {}

provider "digitalocean" {
  token = var.do_token
}

data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

完了したら、ファイルを保存して閉じます。

注意TF_LOG環境変数を1に設定すると、Terraformが試行する操作の詳細なログが有効になります。次のようにして設定できます:

  1. export TF_LOG=1

プロジェクトのTerraformを初期化するには、次のコマンドを実行します:

  1. terraform init

これにより、構成が読み込まれ、プロバイダのプラグインがインストールされます。出力にログインしているのが見えるでしょう:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) 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://www.terraform.io/docs/cli/plugins/signing.html 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! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.

もしTerraformが予想通りに動作しない場合、terraform.tfstateファイルを削除し、手動で作成されたリソース(例:コントロールパネルを介して)を破棄して、最初からやり直すことができます。

Terraformが構成され、DigitalOceanアカウントに接続できるようになりました。次のステップでは、Terraformを使用してNginxサーバーを実行するDropletを定義します。

ステップ3 — 最初のNginxサーバーを定義する

Terraformを使用してDigitalOcean Dropletを作成し、Dropletが起動した後にソフトウェアをインストールできます。このステップでは、Ubuntu 20.04 Dropletを1つ作成し、Terraformを使用してNginxウェブサーバーをインストールします。

www-1.tfという新しいTerraform構成ファイルを作成し、Dropletの構成を保持します。

  1. nano www-1.tf

次の行を挿入して、Dropletリソースを定義します:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
    image = "ubuntu-20-04-x64"
    name = "www-1"
    region = "nyc3"
    size = "s-1vcpu-1gb"
    ssh_keys = [
      data.digitalocean_ssh_key.terraform.id
    ]

前述の構成では、最初の行でwww-1という名前のdigitalocean_dropletリソースが定義されています。残りの行では、Dropletの属性が指定されており、それにはDropletが存在するデータセンターと、構成するDropletのサイズを識別するスラグが含まれています。この場合、1つのCPUと1GBのRAMを持つDropletを作成するs-1vcpu-1gbを使用しています。(使用可能なスラグの一覧については、このサイズスラグ表を参照してください。)

ssh_keysセクションは、Dropletに追加したい公開鍵のリストを指定します。この場合、provider.tfで定義したキーを指定しています。ここでの名前がprovider.tfで指定した名前と一致することを確認してください。

TerraformをDigitalOcean APIに対して実行すると、Dropletに関するさまざまな情報(パブリックおよびプライベートIPアドレスなど)が収集されます。この情報は、構成内の他のリソースで使用できます。

Dropletリソースに必要またはオプションの引数がどれであるか疑問に思う場合は、公式のTerraformドキュメントを参照してください:DigitalOcean Droplet Specification

TerraformがSSH経由でサーバーに接続するために使用できるconnectionを設定するには、ファイルの最後に次の行を追加します。

~/loadbalance/www-1.tf
...
connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }

これらの行は、Terraformがサーバーに接続する方法を説明しています。Terraformは、SSH経由でNginxをインストールするためにこれを使用できます。プライベートキー変数var.pvt_keyの使用に注目してください。Terraformを実行する際にその値を渡します。

これで接続が設定されたので、Nginxをインストールするために使用するremote-execプロビジョナーを構成します。そのためには、次の行を構成に追加します。

~/loadbalance/www-1.tf
...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # nginxをインストール
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

rootユーザーがNginxをインストールするために実行するコマンドがinline配列内の文字列であることに注意してください。

完成したファイルは次のようになります。

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
  image = "ubuntu-20-04-x64"
  name = "www-1"
  region = "nyc3"
  size = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  
  connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }
  
  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # nginxをインストール
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

ファイルを保存してエディターを終了します。サーバーを定義し、準備が整ったので、それを展開します。

ステップ 4 — Terraform を使用して Nginx サーバーを作成する

現在の Terraform 構成は単一の Nginx サーバーを記述しています。これを定義どおりにドロップレットに展開します。

terraform plan コマンドを実行して、実行計画(Terraform がインフラストラクチャを構築するために試みる内容)を確認します。DigitalOcean のアクセス トークンの値と秘密鍵のパスを指定する必要があります。なぜなら、構成はこれらの情報を使用してドロップレットにアクセスして Nginx をインストールするためです。次のコマンドを実行して計画を作成します:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

警告: terraform plan コマンドは、プランを保存するための -out パラメーターをサポートしています。ただし、プランには API キーが含まれ、Terraform はこのデータを暗号化しません。このオプションを使用する場合は、このファイルを他の人に送信するか、長期間保存する場合には、このファイルを暗号化することを検討する必要があります。

次のような出力が表示されます:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.www-1 が作成されます + resource "digitalocean_droplet" "www-1" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "www-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "nyc3" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

+ リソース "digitalocean_droplet" "www-1" 行は、Terraform が後に続く詳細を持つ www-1 という名前の新しい Droplet リソースを作成することを意味します。 それが起こるべきことですので、現在の計画を実行するには、terraform apply コマンドを実行してください。

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

以前と同じ出力が得られますが、今回は Terraform が進行するかどうかを尋ねられます。

Output
... Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes

yes を入力し、ENTER キーを押してください。 Terraform は Droplet をプロビジョニングします。

Output
digitalocean_droplet.www-1: Creating...

しばらくしてから、Terraform が remote-exec プロビジョナーを使用して Nginx をインストールし、その後、プロセスが完了します。

Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'... .... digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

Terraform は新しい Droplet で Nginx をインストールしました。 新しい Droplet のパブリック IP アドレスにアクセスすると、Nginx のウェルカム画面が表示されます。 Droplet が作成されたときにパブリック IP が表示されましたが、Terraform の現在の状態を見ることで常に表示できます。 Terraform は、計画を実行するか状態を更新するたびに状態ファイル terraform.tfstate を更新します。

環境の現在の状態を表示するには、次のコマンドを使用してください:

  1. terraform show terraform.tfstate

これにより、Droplet のパブリック IP アドレスが表示されます。

Output
resource "digitalocean_droplet" "www-1" { backups = false created_at = "..." disk = 25 id = "your_www-1_droplet_id" image = "ubuntu-20-04-x64" ipv4_address = "your_www-1_server_ip" ipv4_address_private = "10.128.0.2" ...

ブラウザで http://your_www-1_server_ip に移動して、Nginx サーバーが実行されていることを確認してください。

注意: Terraformのインフラストラクチャを変更する場合、状態ファイルが最新ではなくなります。Terraformの外部でリソースが変更された場合、状態ファイルを更新して最新の状態にする必要があります。このコマンドは、プロバイダーから更新されたリソース情報を取得します:

  1. terraform refresh \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

このステップでは、Terraformで説明したDropletを展開しました。これから第二のDropletを作成します。

ステップ5 — 第二のNginxサーバーの作成

すでにNginxサーバーを説明したので、既存のサーバーの設定ファイルをコピーして名前とホスト名を置換することで、簡単に第二のサーバーを追加できます。

これは手動で行うこともできますが、sedコマンドを使用してwww-1.tfファイルを読み取り、すべてのwww-1www-2に置換し、www-2.tfという新しいファイルを作成する方が速いです。以下はそのためのsedコマンドです:

  1. sed 's/www-1/www-2/g' www-1.tf > www-2.tf

sedについて詳しくは、Using sedをご覧ください。

terraform planを再実行して、Terraformが行う変更をプレビューします:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

出力によると、Terraformは第二のサーバーwww-2を作成します:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.www-2 が作成されます + resource "digitalocean_droplet" "www-2" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "www-2" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = true + region = "nyc3" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

terraform apply を再実行して2番目のDropletを作成します。

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

前回同様、Terraformは継続することを確認するように求めます。計画を再度確認し、継続するにはyesと入力してください。

しばらくすると、Terraformが新しいサーバーを作成し、結果を表示します。

Output
digitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Terraformは新しいサーバーを作成し、既存のものを変更しませんでした。追加のNginxサーバーを追加するには、この手順を繰り返すことができます。

これで、Nginxを実行する2つのDropletがあるので、トラフィックを分散するロードバランサーを定義して展開します。

ステップ6 — ロードバランサーの作成

公式のTerraformプロバイダーがサポートしているDigitalOcean Load Balancerを使用して、2つのWebサーバー間のトラフィックをルーティングします。

loadbalancer.tfという新しいTerraform構成ファイルを作成します:

  1. nano loadbalancer.tf

次の行を追加して、ロードバランサーを定義します:

~/loadbalance/loadbalancer.tf
resource "digitalocean_loadbalancer" "www-lb" {
  name = "www-lb"
  region = "nyc3"

  forwarding_rule {
    entry_port = 80
    entry_protocol = "http"

    target_port = 80
    target_protocol = "http"
  }

  healthcheck {
    port = 22
    protocol = "tcp"
  }

  droplet_ids = [digitalocean_droplet.www-1.id, digitalocean_droplet.www-2.id ]
}

ロードバランサーの定義では、その名前、所在地のデータセンター、トラフィックをバランスするためにリッスンするポート、ヘルスチェックの構成、およびTerraform変数を使用して取得したバランスするDropletのIDが指定されています。ファイルを保存して閉じます。

terraform planコマンドを再度実行して、新しい実行計画を確認します。

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

出力のいくつかの行が表示されます。以下の行が含まれます:

Output
... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_loadbalancer.www-lb が作成されます + resource "digitalocean_loadbalancer" "www-lb" { + algorithm = "round_robin" + disable_lets_encrypt_dns_records = false + droplet_ids = [ + ..., + ..., ] + enable_backend_keepalive = false + enable_proxy_protocol = false + id = (known after apply) + ip = (known after apply) + name = "www-lb" + redirect_http_to_https = false + region = "nyc3" + size_unit = (known after apply) + status = (known after apply) + urn = (known after apply) + vpc_uuid = (known after apply) + forwarding_rule { + certificate_id = (known after apply) + certificate_name = (known after apply) + entry_port = 80 + entry_protocol = "http" + target_port = 80 + target_protocol = "http" + tls_passthrough = false } + healthcheck { + check_interval_seconds = 10 + healthy_threshold = 5 + port = 22 + protocol = "tcp" + response_timeout_seconds = 5 + unhealthy_threshold = 3 } + sticky_sessions { + cookie_name = (known after apply) + cookie_ttl_seconds = (known after apply) + type = (known after apply) } } Plan: 1 to add, 0 to change, 0 to destroy. ...

これは、www-1www-2 のドロップレットがすでに存在し、Terraform が www-lb ロードバランサを作成することを意味します。

ロードバランサを構築するには、terraform apply を実行してください:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

再度、Terraform は計画を確認するように求めます。計画を承認するには、yes を入力して続行してください。

承認すると、以下の行が含まれる出力が表示されます(簡潔にするために切り詰められています):

Output
... digitalocean_loadbalancer.www-lb: Creating... ... digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

terraform show terraform.tfstate を使用して、ロードバランサの IP アドレスを特定します:

  1. terraform show terraform.tfstate

IP は www-lb エントリの下にあります:

Output
... # digitalocean_loadbalancer.www-lb: resource "digitalocean_loadbalancer" "www-lb" { algorithm = "round_robin" disable_lets_encrypt_dns_records = false droplet_ids = [ your_www-1_droplet_id, your_www-2_droplet_id, ] enable_backend_keepalive = false enable_proxy_protocol = false id = "your_load_balancer_id" ip = "your_load_balancer_ip" name = "www-lb" ...

ブラウザで http://your_load_balancer_ip に移動すると、Nginx のウェルカム画面が表示されます。これは、ロードバランサが 2 つの Nginx サーバのうちの1つにトラフィックを送信しているためです。

これで、Terraform を使用して DigitalOcean アカウントの DNS を設定する方法を学びます。

ステップ 7 — DNS ドメインとレコードの作成

Dropletsとロードバランサーに加えて、TerraformはDNSドメインとレコードドメインも作成できます。たとえば、ドメインをロードバランサーにポイントさせたい場合は、その関係を記述する構成を記述できます。

注意:独自のユニークなドメイン名を使用するか、TerraformはDNSリソースをデプロイできません。ドメインがDigitalOceanの名前サーバーを指していることを確認してください。

新しいファイルを作成してDNSを記述します:

  1. nano domain_root.tf

次のドメインリソースを追加し、your_domainをご自分のドメイン名に置き換えます:

~/loadbalance/domain_root.tf
resource "digitalocean_domain" "default" {
   name = "your_domain"
   ip_address = digitalocean_loadbalancer.www-lb.ip
}

完了したら、ファイルを保存して閉じます。

www.your_domainyour_domainにポイントするCNAMEレコードも追加できます。CNAMEレコード用の新しいファイルを作成します:

  1. nano domain_cname.tf

次の行をファイルに追加します:

domain_cname.tf
resource "digitalocean_record" "CNAME-www" {
  domain = digitalocean_domain.default.name
  type = "CNAME"
  name = "www"
  value = "@"
}

完了したら、ファイルを保存して閉じます。

DNSエントリを追加するには、他のリソースと同様に、terraform planを実行してからterraform applyを実行します。

ドメイン名に移動すると、ドメインがロードバランサーを指しており、そのロードバランサーが2つのNginxサーバーのうちの1つにトラフィックを送信しているため、Nginxのウェルカム画面が表示されます。

ステップ8 — インフラストラクチャの破棄

一般のプロダクション環境ではあまり使われていませんが、Terraformは作成したインフラストラクチャを破壊することもできます。これは、何度も展開および破棄される開発環境で主に役立ちます。

まず、terraform plan -destroyを使用してインフラストラクチャを破壊する実行計画を作成します:

  1. terraform plan -destroy -out=terraform.tfplan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Terraformは、リソースが赤でマークされ、マイナス記号が付いている実行計画を出力します。これは、インフラストラクチャ内のリソースを削除することを示しています。

次に、terraform applyを使用して計画を実行します:

  1. terraform apply terraform.tfplan

Terraformは、生成された計画で示されているように、リソースを破壊し続けます。

結論

このチュートリアルでは、DigitalOcean上で負荷分散されたWebインフラストラクチャを構築するためにTerraformを使用しました。これには、DigitalOceanロードバランサーの背後で実行される2つのNginx Webサーバーが含まれます。現在の状態を表示し、Terraformを使用してDNSエントリを設定する方法を知っています。

これで、Terraformがどのように機能するかを理解したので、独自のプロジェクトのサーバーインフラストラクチャを記述する構成ファイルを作成できます。このチュートリアルの例は、サーバーの展開を自動化する方法を示す良い出発点です。既存のプロビジョニングツールをすでに使用している場合は、このチュートリアルで使用されているプロビジョニング方法の代わりに、サーバーを構成するためにそれらをTerraformと統合して作成プロセスの一部として使用できます。

Terraformにはさらに多くの機能があり、他のプロバイダーと連携できます。Terraformを使用して独自のインフラストラクチャを改善する方法については、公式のTerraformドキュメントを参照してください。

このチュートリアルは、Terraformでインフラストラクチャを管理する方法シリーズの一部です。このシリーズでは、Terraformを初めてインストールする方法から複雑なプロジェクトを管理する方法まで、さまざまなTerraformのトピックをカバーしています。

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean