開発者ドキュメント

DigitalOceanでTerraformを使用する方法

序章

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

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

このチュートリアルでは、Terraformをインストールし、それを使用して、 DigitalOcean LoadBalancerによって負荷分散される2つのNginxサーバーで構成されるインフラストラクチャをDigitalOceanに作成します。 次に、Terraformを使用して、ロードバランサーを指すDNSエントリをDigitalOceanに追加します。 これは、Terraformの使用を開始するのに役立ち、Terraformを使用して、独自のニーズを満たすDigitalOceanベースのインフラストラクチャを管理および展開する方法についてのアイデアを提供します。

注:このチュートリアルは、Terraform1.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では、.bashrcPATHを再定義する必要があります。これは、新しいシェルが開いたときに実行されます。 次のコマンドを実行して編集用に開きます。

  1. nano ~/.bashrc

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

TerraformのパスをPATHに追加するには、ファイルの最後に次の行を追加します。

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

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

これで、すべての新しいシェルセッションがterraformコマンドを見つけることができるようになります。 新しいPATHを現在のセッションにロードするには、LinuxシステムでBashを使用している場合は、次のコマンドを実行します。

  1. . ~/.bashrc

macOSでBashを使用している場合は、代わりに次のコマンドを実行してください。

  1. . .bash_profile

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

  1. . .zshrc

Terraformが正しくインストールされていることを確認するには、引数なしでterraformコマンドを実行します。

  1. 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が受け入れるコマンドです。 出力には簡単な説明があり、このチュートリアル全体でそれらについて詳しく学習します。

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

ステップ2—DigitalOcean用のTerraformの構成

Terraformは、インストール可能なプロバイダーを通じてさまざまなサービスプロバイダーをサポートします。 各プロバイダーには独自の仕様があり、通常はそれぞれのサービスプロバイダーのAPIにマッピングされます。

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

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

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

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

次に、ファイルに次の変数を定義して、残りの構成ファイルでそれらを参照できるようにします。

ここで値をハードコーディングするのではなく、実行時にこれらの変数の値を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にSSHキーを作成する新しいドロップレットに自動的に追加させる必要があります。 SSHキーをDigitalOceanに追加するときに、名前を付けました。 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サーバーを実行するドロップレットを定義します。

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

Terraformを使用して、DigitalOceanドロップレットを作成し、ドロップレットが起動したらソフトウェアをインストールできます。 このステップでは、単一のUbuntu 20.04ドロップレットをプロビジョニングし、Terraformを使用してNginxWebサーバーをインストールします。

www-1.tfという名前の新しいTerraform構成ファイルを作成します。このファイルには、ドロップレットの構成が保持されます。

  1. nano www-1.tf

次の行を挿入して、ドロップレットリソースを定義します。

〜/ 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リソースを定義しています。 残りの行は、ドロップレットが存在するデータセンターや、構成するドロップレットのサイズを識別するスラッグなど、ドロップレットの属性を指定します。 この場合、s-1vcpu-1gbを使用しています。これにより、1つのCPUと1GBのRAMを備えたドロップレットが作成されます。 (このサイズのスラッグチャートにアクセスして、使用可能なスラッグを確認してください。)

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

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

Dropletリソースに必須またはオプションの引数がわからない場合は、Terraformの公式ドキュメント DigitalOcean DropletSpecificationを参照してください。

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を実行するときにその値を渡します。

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

〜/ loadbalance / www-1.tf
...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # install nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

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

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

〜/ 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",
      # install nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

ファイルを保存して、エディターを終了します。 サーバーを定義し、デプロイする準備が整いました。これを実行します。

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

現在のTerraform構成は、単一のNginxサーバーを記述しています。 これで、Dropletを定義どおりにデプロイします。

terraform planコマンドを実行して、実行プラン、または説明したインフラストラクチャを構築するためにTerraformが実行しようとすることを確認します。 構成ではこの情報を使用してDropletにアクセスしてNginxをインストールするため、DigitalOceanアクセストークンの値と秘密鍵へのパスを指定する必要があります。 次のコマンドを実行して、プランを作成します。

  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 will be created + 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.

+ resource "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はドロップレットをプロビジョニングします。

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は、www-1という新しいドロップレットを作成し、それにNginxをインストールしました。 新しいDropletのパブリックIPアドレスにアクセスすると、Nginxのウェルカム画面が表示されます。 ドロップレットの作成時にパブリックIPが表示されていましたが、Terraformの現在の状態を確認することでいつでも表示できます。 Terraformは、プランを実行したり、状態を更新したりするたびに、状態ファイルterraform.tfstateを更新します。

環境の現在の状態を表示するには、次のコマンドを使用します。

  1. terraform show terraform.tfstate

これにより、ドロップレットのパブリック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で説明したドロップレットをデプロイしました。 次に、2つ目を作成します。

ステップ5—2番目のNginxサーバーを作成する

Nginxサーバーについて説明したので、既存のサーバーの構成ファイルをコピーし、Dropletリソースの名前とホスト名を置き換えることで、1秒をすばやく追加できます。

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

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

sedの詳細については、sedの使用をご覧ください。

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

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

出力は、Terraformが2番目のサーバー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 will be created + 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番目のドロップレットを作成します。

  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つのドロップレットがあるので、ロードバランサーを定義してデプロイし、それらの間でトラフィックを分割します。

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

公式のTerraformプロバイダーがサポートするDigitalOceanLoad 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 ]
}

ロードバランサーの定義では、名前、配置するデータセンター、トラフィックのバランスを取るためにリッスンするポート、ヘルスチェックの構成、バランスを取る必要のあるドロップレットのIDを指定します。これらは、Terraform変数を使用して取得します。 ファイルを保存して閉じます。

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 will be created + 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-1およびwww-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に移動すると、ロードバランサが2つのNginxサーバーのいずれかにトラフィックを送信しているため、Nginxのウェルカム画面が表示されます。

次に、Terraformを使用してDigitalOceanアカウントのDNSを構成する方法を学習します。

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

ドロップレットとロードバランサーに加えて、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サーバーのいずれかにトラフィックを送信しているロードバランサーを指しているため、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はリソースの破棄を続行します。

結論

このチュートリアルでは、Terraformを使用して、DigitalOcean上に負荷分散されたWebインフラストラクチャを構築し、2台のNginxWebサーバーをDigitalOceanロードバランサーの背後で実行しました。 リソースを作成および破棄し、現在の状態を表示し、Terraformを使用してDNSエントリを構成する方法を知っています。

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

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

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

モバイルバージョンを終了