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

著者は、フリーおよびオープンソース基金を、寄付のための執筆プログラムの一環として受け取ることを選択しました。

はじめに

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

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

Terraformはまた、Hashicorpによって提供される公式の、管理されたクラウドオファリングであるTerraform Cloudをサポートしています。これは、チームの作業を1か所で同期し、構成と管理のためのユーザーインターフェースを提供するプロプライエタリアプリです。

このチュートリアルでは、Terraform Cloud内に組織を作成し、その組織にプロジェクトを接続します。その後、組織を使用してワークスペースとリソースを設定します。状態を管理されたクラウドに保存するため、常に利用可能にします。また、関連する管理されたPostgreSQLデータベースを備えたpgバックエンドも設定します。

前提条件

  • A DigitalOcean Personal Access Token, which you can create via the DigitalOcean Control Panel. You can find instructions in the DigitalOcean product documents, How to Create a Personal Access Token.
  • ローカルマシンにTerraformがインストールされていること。 デジタルオーシャンとTerraformの使用方法チュートリアルのステップ1を完了してください。
  • pgバックエンドを使用する場合は、管理されたPostgreSQLデータベースクラスターを作成し、アクセスできる状態にしてください。詳細については、クイックスタートガイドを参照してください。このチュートリアルでは別のデータベースを使用できます。
  • Hashicorpの管理されたクラウドを使用する場合は、Terraform Cloudのアカウントが必要です。サインアップページから作成できます。サインアップページ

注意: このチュートリアルは、Terraform 1.1.3を使用して明示的にテストされています。

管理された PostgreSQL データベースに状態を保存する

このセクションでは、Droplet をデプロイし、pg プロバイダを使用して DigitalOcean の管理された PostgreSQL データベースに状態を保存するプロジェクトを設定します。このプロバイダは状態のロックをサポートしているため、同時に複数の変更が行われても状態が上書きされることはありません。

まず、プロジェクトを保存する 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_stringを、DigitalOceanコントロールパネルからの管理されたデータベースの接続文字列に置き換えることを忘れないでください。これは、アクションを押し、接続の詳細を選択し、ドロップダウンメニューから接続文字列を選択することで見つけることができます。その後、ファイルを保存して閉じます。

警告: 続行するには、データベースの設定で、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というファイルでDropletを定義します。これを行うには、次のコマンドを実行してファイルを作成し、開きます:

  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という名前のDropletをfra1リージョンに展開し、Ubuntu 20.04を1GB RAMと1つのCPUコアで実行します。これで定義する必要があるすべてですので、ファイルを保存して閉じます。

環境変数にDigitalOceanトークンが必要です。トークンを置き換えて、環境変数を作成してください:

  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 が作成されます + 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 Cloud での状態の保存

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

組織の作成

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

まず、Terraform Cloudにアクセスしてログインしてください。まだ組織を作成していない場合は、それを行うように促されます。

任意の組織名を入力し、Terraform Cloud内のすべての名前の中で一意である必要があることを覚えておいてください。名前が既に存在する場合はエラーが表示されます。メールアドレスは、アカウントのアドレスで既に入力されているはずです。完了したら、「組織を作成」ボタンをクリックして続行してください。

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

コマンドラインを使用してTerraform Cloudとやり取りするので、CLIドリブンワークフローオプションをクリックします。その後、ワークスペースの名前を入力し、説明を空白のままにしてください。

好きなワークスペース名を入力します(ここではsammyとします)、その後、ワークスペースを作成をクリックして組織作成プロセスを完了します。その後、ワークスペース設定ページに移動します。

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

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

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

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

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

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

コマンドラインで、次のコマンドを実行します:

  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 Cloud アカウントにアクセスできるように設定しました。これで、Dropletを展開するプロジェクトを作成し、その状態を保存するためにTerraform Cloud を使用できます。

プロジェクトの設定

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

  1. mkdir ~/terraform-team-cloud

それに移動します:

  1. cd ~/terraform-team-cloud

プロジェクトを設定するには、以下の手順が必要です:

  • cloud プロバイダを定義して構成します。これは Terraform Cloud とのインタフェースです。
  • digitalocean リソースをデプロイするために、digitalocean プロバイダが必要です。
  • 使用する変数を定義し、初期化します。

プロバイダとモジュールの要件仕様を 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 に設定します。 organizationworkspaces.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! ...

前のプロジェクトと同じく、Dropletの定義が同じですので、次のコマンドを実行してコピーできます:

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

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

  1. nano vars.auto.tfvars

次の行を追加し、your_do_tokenをご自身のDigitalOcean APIトークンに置き換えます:

vars.auto.tfvars
do_token = "your_do_token"

編集が完了したら、ファイルを保存して閉じます。Terraformは、操作を計画する際に自動的にこのファイルを読み取ります。

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

構成の適用

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

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

  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 が作成されます + 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 のウェブサイト上のワークスペースに移動できます。

  1. terraform destroy

次のコマンドを実行することで、デプロイされたリソースを破棄できます:

このセクションでは、プロジェクトを Terraform Cloud に接続し、プロジェクトの状態をチーム全体で中央の場所からアクセス可能にしました。これにより、プロジェクトへのアクセス権を持つすべての人にとって、状態を共有して同期することができ、よりスムーズなエクスペリエンスが可能になります。

このチュートリアルでは、Terraform Cloud(Hashicorp が提供する Terraform の管理されたクラウドオファリング)と pg(プロジェクトの状態を PostgreSQL データベースに保存することができる)という、2つの異なるバックエンドを使用しました。DigitalOcean の管理された PostgreSQL データベースを使用し、数分で Terraform でプロビジョニングして使用できるようにしました。

Terraform Cloudの機能に関する詳細情報については、公式ドキュメントを参照してください。

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team