開発者ドキュメント

チームでTerraformを使用する方法

著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

複数の人が異なる場所から同時に同じTerraformプロジェクトで作業している場合、上書きエラーを回避するために、インフラストラクチャコードとプロジェクトの状態を正しく処理することが重要です。 解決策は、状態をローカルではなくリモートで保存することです。 チームのすべてのメンバーがリモートシステムを利用でき、作業中に状態をロックすることができます。

そのようなリモートバックエンドの1つがpgで、これは状態をPostgreSQLデータベースに保存します。 このチュートリアルの過程で、 DigitalOcean Managed Database とともに使用して、データの可用性を確保します。

Terraformは、 Terraform Cloud と呼ばれるHashicorpによる公式のマネージドクラウドサービスもサポートしています。これは、チームの作業を1か所で同期し、構成と管理のためのユーザーインターフェイスを提供する独自のアプリです。

このチュートリアルでは、プロジェクトを接続する組織をTerraformCloudに作成します。 次に、組織を使用してワークスペースとリソースを設定します。 状態をマネージドクラウドに保存して、いつでも利用できるようにします。 また、付属のマネージドPostgreSQLデータベースを使用してpgバックエンドを設定します。

前提条件

注:このチュートリアルは、Terraform1.1.3を使用して具体的にテストしました。

マネージドPostgreSQLデータベースへの状態の保存

このセクションでは、Dropletをデプロイし、pgプロバイダーを使用して状態をDigitalOceanマネージドPostgreSQLデータベースに保存するプロジェクトを設定します。 このプロバイダーは状態ロックをサポートしているため、同時に発生する2つ以上の変更によって状態が上書きされることはありません。

プロジェクトを保存するterraform-team-pgという名前のディレクトリを作成することから始めます。

  1. mkdir ~/terraform-team-pg

そこに移動します:

  1. cd ~/terraform-team-pg

最初にプロバイダーを定義してから、データベースとdigitaloceanモジュールの接続文字列を渡します。 provider.tfを作成して開き、編集します。

  1. nano provider.tf

次の行を追加します。

〜/ terraform-team-pg /provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

ここでは、digitaloceanプロバイダーが必要であり、接続文字列を受け入れるpgバックエンドを定義します。 次に、do_token変数を定義し、それをdigitaloceanプロバイダーのインスタンスに渡します。

your_db_connection_stringDigitalOceanコントロールパネルの管理対象データベースの接続文字列に置き換えることを忘れないでください。アクションを押して接続の詳細[ X211X]をクリックし、ドロップダウンメニューから接続文字列を選択します。 次に、ファイルを保存して閉じます

警告:続行するには、データベースの設定で、許可リストにTerraformを実行しているマシンのIPアドレスがあることを確認してください。

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

  1. terraform init

出力は次のようになります。

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. 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! ...

Terraformはバックエンドを正常に初期化しました。これは、データベースに接続したことを意味します。

次に、droplets.tfというファイルでドロップレットを定義します。 次のコマンドを実行して、編集用に作成して開きます。

  1. nano droplets.tf

次の行を追加します。

〜/ terraform-team-pg / droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

このコードは、web-1というドロップレットをfra1リージョンにデプロイし、1GBのRAMと1つのCPUコアでUbuntu20.04を実行します。 定義する必要があるのはこれだけなので、ファイルを保存して閉じます。

環境変数にDigitalOceanトークンが必要です。 your_do_tokenをトークンに置き換えて、作成します。

  1. export DO_PAT="your_do_token"

データベースへの接続が機能していることを確認するには、構成を計画してみてください。

  1. terraform plan -var "do_token=${DO_PAT}"

出力は次のようになります。

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.web will be created + resource "digitalocean_droplet" "web" { + 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 = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + 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はエラーを報告せず、通常どおりアクションを計画しました。 PostgreSQLデータベースに正常に接続され、その状態が保存されました。 プロジェクトの同期を維持しながら、複数の人が同時にこれに取り組むことができるようになりました。

Terraformクラウドに状態を保存する

このステップでは、ドロップレットをデプロイし、 TerraformCloudcloudプロバイダーのバックエンドとして使用するプロジェクトを作成します。 これには、Terraform Cloudで組織とワークスペースを作成し、インフラストラクチャコードを記述し、それを計画することが含まれます。

組織の作成

Terraform Cloudを使用すると、ワークスペースとモジュールを収容する複数の組織を作成できます。 有料プランの組織は、アクセスレベルの制御機能を備えた複数のチームを持つことができますが、使用する無料プランでは、組織ごとに1つのチームしか提供されません。 チームメンバーを組織に招待できます。

Terraform Cloud に移動して、ログインすることから始めます。 まだ組織を作成していない場合は、作成するように求められます。

選択した組織名を入力し、TerraformCloudのすべての名前の中で一意である必要があることに注意してください。 名前がすでに存在する場合は、エラーが発生します。 メールアドレスには、アカウントのアドレスがすでに入力されている必要があります。 終了したら、組織の作成ボタンをクリックして続行します。

次に、ワークスペースのタイプを選択するように求められます。

コマンドラインを使用してTerraformCloudとインターフェイスするため、CLI駆動型ワークフローオプションをクリックします。 次に、ワークスペースの名前を入力し、説明を空のままにします。

選択したワークスペース名(sammyと呼びます)を入力し、ワークスペースの作成をクリックして、組織の作成プロセスを完了します。 次に、ワークスペース設定ページに移動します。

これで、組織の一部であるワークスペースが作成されました。 作成したばかりなので、ワークスペースにはインフラストラクチャコードが含まれていません。 インターフェイスの中央部分で、Terraform Cloudは、このワークスペースに接続するための開始手順を提供します。

接続する前に、クラウドがコマンドの実行に使用するTerraformのバージョンを構成する必要があります。 設定するには、概要の横にある設定ドロップダウンをクリックし、リストから一般を選択します。 ページが開いたら、 Terraformバージョンドロップダウンに移動し、1.1.3を選択します(このチュートリアルの場合)。

次に、設定の保存ボタンをクリックして変更を保存します。

プロジェクトを組織およびワークスペースに接続するには、最初にコマンドラインを使用してログインする必要があります。 コマンドを実行する前に、トークンページに移動して、サーバーの新しいアクセストークンを作成します。これにより、アカウントへのアクセスが提供されます。 APIトークンを作成するためのプロンプトが表示されます。

デフォルトの説明で問題ないので、APIトークンの作成をクリックして作成します。

トークン値またはその後ろのアイコンをクリックして、APIトークンをコピーします。 このトークンを使用して、プロジェクトをTerraformCloudアカウントに接続します。

コマンドラインで、次のコマンドを実行してログインします。

  1. terraform login

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

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

Terraformは、トークンがローカルに保存されることを警告しています。 プロンプトが表示されたら、yesと入力します。

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

コピーしたトークンを貼り付け、ENTERで確定します。 Terraformは成功メッセージを表示します:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

TerraformクラウドアカウントにアクセスするようにローカルTerraformインストールを構成しました。 次に、Dropletをデプロイするプロジェクトを作成し、TerraformCloudを使用してその状態を保存するように構成します。

プロジェクトの設定

まず、プロジェクトを保存するterraform-team-cloudという名前のディレクトリを作成します。

  1. mkdir ~/terraform-team-cloud

そこに移動します:

  1. cd ~/terraform-team-cloud

プロジェクトを設定するには、次のことを行う必要があります。

プロバイダーとモジュールの要件仕様をprovider.tfという名前のファイルに保存します。 次のコマンドを実行して、編集用に作成して開きます。

  1. nano provider.tf

次の行を追加します。

〜/ terraform-team-cloud /provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

ここでは、最初にTerraformのバージョンを指定します。 次に、必要に応じてdigitaloceanプロバイダーを指定し、バックエンドをcloudに設定します。 organizationおよびworkspaces.nameの場合、強調表示された値を指定した名前に置き換えます。

次に、do_tokenという変数を定義し、その後に作成されたdigitaloceanプロバイダーに渡します。 これで、組織に接続するようにプロジェクトを構成したので、ファイルを保存して閉じます。

次のコマンドを使用してプロジェクトを初期化します。

  1. terraform init

出力は次のようになります。

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.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 Cloud has been successfully initialized! ...

ドロップレットの定義は前のプロジェクトと同じなので、次のコマンドを実行してコピーできます。

  1. cp ../terraform-team-pg/droplets.tf .

最後に、変数値を定義します。 cloudプロバイダーは、コマンドラインを介した変数への値の受け渡しをサポートしていないため、変数ファイルを使用して値を渡すか、TerraformCloudで設定する必要があります。 Terraformは、ファイル名が.auto.tfvarsで終わるファイルから変数値を読み取ります。 編集用にvars.auto.tfvarsというファイルを作成して開きます。このファイルで、do_token変数を定義します。

  1. nano vars.auto.tfvars

次の行を追加して、your_do_tokenをDigitalOceanAPIトークンに置き換えます。

vars.auto.tfvars
do_token = "your_do_token"

完了したら、ファイルを保存して閉じます。 Terraformは、アクションを計画するときにこのファイルを自動的に読み取ります。

これでプロジェクトが完了し、TerraformCloudをバックエンドとして使用するように設定されました。 次に、ドロップレットを計画して適用し、それがクラウドアプリにどのように反映されるかを確認します。

構成の適用

このチュートリアルのステップ1では、terraform planコマンドを使用してプロジェクトを計画しました。 Terraform Cloudプロジェクトには同じリソースが定義されているため、計画を再度スキップして、TerraformCloudに直接適用できます。

次のコマンドを実行してプロジェクトを更新し、プロジェクトを適用します。

  1. terraform apply

localをバックエンドとして使用した場合とは出力が異なることに気付くでしょう。

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... 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.web will be created + resource "digitalocean_droplet" "web" { + 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 = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + 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. ...

cloudバックエンドを使用する場合、Terraformはローカルマシンからの構成を計画または適用していません。 代わりに、それらのタスクをTerraform Cloudに委任し、出力をコンソールにリアルタイムでストリーミングするだけです。

プロンプトが表示されたら、yesと入力します。 Terraformはまもなく構成の適用を終了し、Terraform Cloud Webサイトのワークスペースに移動して、新しいアクションが適用されていることを確認できます。

これで、以下を実行して、デプロイされたリソースを破棄できます。

  1. terraform destroy

このセクションでは、プロジェクトをTerraform Cloudに接続し、プロジェクトの状態を中央の場所でチームがアクセスできるようにしました。 これにより、プロジェクトにアクセスできるすべての人が状態を共有および同期できるようになり、よりスムーズなエクスペリエンスが実現します。

結論

このチュートリアルでは、2つの異なるバックエンドを使用しました。TerraformCloudは、HashicorpのTerraform向けマネージドクラウドオファリングです。 pgは、プロジェクトの状態をPostgreSQLデータベースに保存できるようにします。 DigitalOceanのマネージドPostgreSQLデータベースを使用しました。これは、Terraformで数分以内にプロビジョニングして使用できます。

Terraform Cloudの機能の詳細については、公式ドキュメントにアクセスしてください。

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

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