DigitalOceanでTerraformを実行する方法

0 株式
0
0
0
0

導入

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

Terraformは、アプリケーション環境またはデータセンターを構成するコンポーネントを記述した構成ファイルを読み込むことで動作します。この構成に基づいて、目的の状態を達成するための実行プランを作成します。その後、Terraformを使用してこのプランを実行し、インフラストラクチャを構築します。構成に変更が発生した場合、Terraformは増分プランを作成・実行して、既存のインフラストラクチャを記述された新しい状態に更新します。.

このチュートリアルでは、Terraformをインストールし、DigitalOcean上に2台のNginxサーバーからなるインフラストラクチャを構築します。このインフラストラクチャは、DigitalOceanロードバランサーによって負荷分散されます。次に、Terraformを使用して、DigitalOcean上にロードバランサーを指すDNSエントリを追加します。このチュートリアルは、Terraformの使い方を理解し、ニーズに合ったDigitalOceanベースのインフラストラクチャを管理および展開するためにTerraformをどのように活用できるかを理解する上で役立ちます。.

前提条件
  • DigitalOceanアカウント
  • DigitalOcean コントロール パネルから作成できる個人用の DigitalOcean アクセス コード。.
  • パスワードなしの SSH キーが DigitalOcean アカウントに追加されました。.
  • DigitalOcean というサーバーを指す個人ドメイン。.

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

Terraformは、リモートデスクトップまたはサーバー上で実行するコマンドラインツールです。インストールするには、ダウンロードしてPATHに追加し、作業中の任意のディレクトリで実行できるようにします。.

まず、公式ダウンロードページから、お使いのオペレーティングシステムとアーキテクチャに適したパッケージをダウンロードしてください。macOSまたはLinuxをお使いの場合は、curlを使ってTerraformをダウンロードできます。.

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

curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_darwin_amd64.zip

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

curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_linux_amd64.zip

~/opt/terraform フォルダを作成します。

mkdir -p ~/opt/terraform

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

sudo apt install unzip

次のコマンドを実行して、ダウンロードしたアーカイブを ~/opt/terraform フォルダーに抽出します。

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

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

Linuxでは、新しいシェルを開いたときに実行されるbashrcにPATHを定義する必要があります。以下のコマンドを実行して、編集用に開きます。

nano ~/.bashrc

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

export PATH=$PATH:~/opt/terraform

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

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

. ~/.bashrc

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

. .bash_profile

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

. .zshrc

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

terraform

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

OutputUsage: 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 リソースで動作するように設定しましょう。.

ステップ2 – DigitalOcean用にTerraformを構成する

Terraform は、インストール可能な様々なサービスプロバイダーをサポートしています。各プロバイダーには独自の仕様があり、通常は対応するサービスプロバイダー API が公開されています。.

DigitalOcean プロバイダーを使用すると、Terraform は DigitalOcean API と連携してインフラストラクチャを作成できます。このプロバイダーは、以下を含むさまざまな DigitalOcean リソースの作成をサポートします。

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

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

export DO_PAT="your_personal_access_token"

次のコマンドを実行して、インフラストラクチャ構成を保存するディレクトリを作成します。

mkdir ~/loadbalance

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

cd ~/loadbalance

Terraform の設定ファイルは、.tf 拡張子で終わるテキストファイルです。人間が読める形式で、コメントもサポートされています。(Terraform は JSON 形式の設定ファイルもサポートしていますが、ここでは説明しません。)Terraform は作業ディレクトリ内のすべての設定ファイルを宣言的に読み取るため、リソースと変数の定義順序は関係ありません。インフラストラクチャ全体を 1 つの設定ファイルにまとめることもできますが、分かりやすさを考慮して、リソースの種類ごとに設定ファイルを分けることをお勧めします。.

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

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

nano provider.tf

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

terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}

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

  • do_token: 個人の DigitalOcean アクセス パスワード。.
  • プライベートキー: 秘密鍵の場所。Terraform はこれを使用して新しい Droplet にログインし、Nginx をインストールします。.

これらの変数の値は、ここでハードコードするのではなく、Terraform の実行時に渡します。これにより、設定の移植性が向上します。.

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

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

次に、以下の行を追加してDigitalOceanプロバイダーを設定し、DigitalOceanアカウントの資格情報を割り当てます。 do_token 議論へ トークン プロバイダーを指定:

...
provider "digitalocean" {
token = var.do_token
}

最後に、Terraform を使って、新しく作成するドロップレットに SSH キーを自動的に追加できるようにします。DigitalOcean に SSH キーを追加した際に、キーに名前を付けました。Terraform はこの名前を使って公開キーを取得します。以下の行を追加し、DigitalOcean アカウントで指定したキー名を置き換えてください。 テラフォーム する:

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

ファイル プロバイダー.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"
}

次のコマンドを実行して、プロジェクトの Terraform を初期化します。

terraform init

これにより、設定が読み込まれ、プロバイダー用のプラグインがインストールされます。出力には次のように表示されます。

OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.34.1...
- Installed digitalocean/digitalocean v2.34.1 (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 Dropletを作成し、起動してソフトウェアをインストールできます。このステップでは、Ubuntu 20.04をプロビジョニングし、Terraformを使用してNginxウェブサーバーをインストールします。.

新しいTerraform構成ファイル www-1.tf Droplet 設定を保持するファイルを作成します。

nano www-1.tf

Droplet ソースを定義するには、次の行を入力します。

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 のサイズを指定するスラッグなど)を指定します。今回の場合は s-1vcpu-1gb を使用しており、1 つの CPU と 1GB の RAM を持つ Droplet を作成します。(使用可能なスラッグについては、こちらのスラッグサイズ表をご覧ください。)

セクション ssh_keys ドロップレットに追加する公開鍵のリストを指定します。この場合、 プロバイダー.tf ここでの名前が、 プロバイダー.tf 一致する必要があることを指定しました。.

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

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

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

...
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プロバイダーを設定します。設定には、以下の行を追加します。

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

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

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

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が記述したインフラストラクチャを構築するために何を行うかを確認するには、次のコマンドを実行します。DigitalOceanアクセストークンと秘密鍵へのパスを指定する必要があります。これらの情報は、NginxインストールのDropletにアクセスするために設定で使用されるためです。プランを作成するには、次のコマンドを実行します。

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

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

OutputTerraform 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 application コマンドを実行して現在のアプリケーションを実行してください。

terraform apply \
-var "do_token=${DO_PAT}" \
-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では以下の機能が提供されます。

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

環境の現在のステータスを表示するには、次のコマンドを使用します。

terraform show terraform.tfstate

これは Droplet のパブリック IP アドレスを表示します。.

Outputresource "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"
...

Nginx サーバーが実行中であることを確認するには、ブラウザで http://your_www-1_server_ip にアクセスします。.

ここまでで、Terraform で記述した Droplet をデプロイできました。次に、2つ目の Droplet を作成します。.

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

Nginx サーバーが構成されたので、既存のサーバー構成ファイルをコピーし、Droplet ソース名とホスト名を置き換えることで、2 番目のサーバーを簡単に追加できます。.

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

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

sed の使用の詳細については、「sed の使用」を参照してください。 sed もっと詳しく知る。.

Terraform による変更をプレビューするには、terraform プログラムを再度実行します。

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

出力は、Terraform が 2 番目のサーバー www-2 を作成することを示しています。

OutputTerraform 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 アプリケーションを再度実行して、2 番目のドロップレットを作成します。

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

前回と同様に、Terraform は続行するかどうかの確認を求めます。プランを再度確認し、「はい」と入力して続行してください。.

しばらくすると、Terraform によって新しいサーバーが作成され、結果が表示されます。

Outputdigitalocean_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 サーバー間のトラフィックをルーティングします。.

新しいTerraform構成ファイル ロードバランサー.tf 作成する:

nano 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 変数を使用して取得します。.

次に、デプロイ後にロード バランサが実際に利用可能かどうかを確認するためのステータス チェックを定義します。

check "health_check" {
data "http" "lb_check" {
url = "http://${digitalocean_loadbalancer.www-lb.ip}"
}
assert {
condition = data.http.lb_check.status_code == 200
error_message = "${data.http.lb_check.url} returned an unhealthy status code"
}
}

このチェックは、ロードバランサーのIPアドレスのステータスをHTTP経由で要求し、リターンコードが200であることを確認します。これは、ドロップレットが正常で利用可能であることを示します。エラーが発生した場合、または異なるリターンコードが返された場合は、デプロイメント手順の後に警告が表示されます。完了したら、ファイルを保存して閉じてください。.

再度注文する テラフォーム計画 実行して新しい実行可能ファイルを確認します。

terraform plan \
-var "do_token=${DO_PAT}" \
-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
<= read (data resources)
Terraform will perform the following actions:
# data.http.lb_check will be read during apply
# (config refers to values not yet known)
<= data "http" "lb_check" {
+ body = (known after apply)
+ id = (known after apply)
+ response_body = (known after apply)
+ response_body_base64 = (known after apply)
+ response_headers = (known after apply)
+ status_code = (known after apply)
+ url = (known after apply)
}
# 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
+ http_idle_timeout_seconds = (known after apply)
+ id = (known after apply)
+ ip = (known after apply)
+ name = "www-lb"
+ project_id = (known after apply)
+ 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
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
│ Warning: Check block assertion known after apply
│ on loadbalancer.tf line 27, in check "health_check":
│ 27: condition = data.http.lb_check.status_code == 200
│ ├────────────────
│ │ data.http.lb_check.status_code is a number
│
│ The condition could not be evaluated at this time, a result will be known when this plan is applied.
╵
...

飛沫が www-1 そして www-2 これらはすでに存在しており、Terraform Load Balancer は www-lb を作成し、プロビジョニング後にチェックします。.

デプロイする前に、プロジェクトを再起動して、health_check で使用される http 依存関係を追加する必要があります。

terraform init -upgrade

次に、terraform アプリケーションを実行してロード バランサを作成します。

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

再度、Terraform からプランの確認を求められます。「はい」と入力してプランを確認し、続行してください。.

これを実行すると、簡潔にするために切り捨てられた次の行を含む出力が表示されます。

Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
data.http.lb_check: Reading...
data.http.lb_check: Read complete after 0s [id=http://lb-ip]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...

lb_check が正常に完了したことに注意してください。.

から terraform は terraform.tfstate を表示します ロードバランサーの IP アドレスを見つけるには、次のコマンドを使用します。

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 ドメインの作成とドメイン登録も行えます。例えば、ドメインをロードバランサーに関連付けたい場合は、その関係を記述する設定を記述できます。.

DNS を記述する新しいファイルを作成します。

nano domain_root.tf

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

resource "digitalocean_domain" "default" {
name = "your_domain"
ip_address = digitalocean_loadbalancer.www-lb.ip
}

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

CNAMEレコードを追加することもできます。 www.your_domainあなたのドメイン CNAME レコード用の新しいファイルを作成します。

nano domain_cname.tf

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

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

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

DNSエントリを追加するには、アプリケーション テラフォーム その後 テラフォームアプリケーション 他のリソースと同じように実行します。.

ドメイン名に移動すると、Nginx のウェルカム ページが表示されます。これは、ドメインが 2 つの Nginx サーバーのいずれかにトラフィックを送信するロード バランサーを指しているためです。.

ステップ8 – インフラを破壊する

Terraform は通常、本番環境では使用されませんが、既存のインフラストラクチャを破壊することもできます。これは主に、複数回デプロイおよび破壊される開発環境で役立ちます。.

まず、 テラフォームプラン - 破棄 インフラ破壊の実施計画を作成します。

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

Terraform は、リソースが赤で強調表示され、マイナス記号が先頭に付いたプランを出力します。これは、インフラストラクチャ リソースが削除されることを示します。.

それから テラフォームアプリケーション 計画を実行するには、次を使用します。

terraform apply terraform.tfplan

Terraform は、生成されたプランで指定されたとおりにリソースを破棄し続けます。.

結果

このチュートリアルでは、Terraformを使用してDigitalOcean上に負荷分散されたウェブインフラストラクチャを構築しました。DigitalOceanロードバランサーの背後で2台のNginxウェブサーバーが稼働しています。リソースの作成と削除、現在の状態の確認、そしてTerraformを使用してDNSエントリを設定する方法を学習しました。.

Terraformの仕組みを理解したら、プロジェクトのサーバーインフラストラクチャを記述する構成ファイルを作成できます。このチュートリアルの例は、サーバーのデプロイメントを自動化する方法を示す良い出発点となります。既にプロビジョニングツールをお使いの場合は、このチュートリアルで使用されているプロビジョニング方法を使用するのではなく、それらのツールをTerraformに統合して、作成プロセスの一部としてサーバーを構成することができます。.

Terraformにはさらに多くの機能があり、他のプロバイダーと連携できます。Terraformを使用してインフラストラクチャを改善する方法の詳細については、Terraformの公式ドキュメントをご覧ください。このチュートリアルは、「Terraformを使用したインフラストラクチャの管理方法」シリーズの一部です。このシリーズでは、Terraformの初回インストールから複雑なプロジェクトの管理まで、Terraformに関する様々なトピックを取り上げています。.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない