著者は、フリーおよびオープンソース基金を、寄付のための執筆プログラムの一環として受け取ることを選択しました。
はじめに
複数の人が異なる場所から同時に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
というディレクトリを作成します:
それに移動します:
まずプロバイダを定義し、次にデータベースの接続文字列と digitalocean
モジュールを渡します。編集用に provider.tf
を作成して開きます:
以下の行を追加します:
ここでは、digitalocean
プロバイダが必要であり、pg
バックエンドが定義されています。このバックエンドは接続文字列を受け入れます。その後、do_token
変数を定義し、digitalocean
プロバイダのインスタンスに渡します。
your_db_connection_string
を、DigitalOceanコントロールパネルからの管理されたデータベースの接続文字列に置き換えることを忘れないでください。これは、アクションを押し、接続の詳細を選択し、ドロップダウンメニューから接続文字列を選択することで見つけることができます。その後、ファイルを保存して閉じます。
警告: 続行するには、データベースの設定で、Terraformを実行しているマシンのIPアドレスが許可リストに含まれていることを確認してください。
プロジェクトを初期化するには、次のコマンドを実行します:
出力は次のようになります:
OutputInitializing 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を定義します。これを行うには、次のコマンドを実行してファイルを作成し、開きます:
次の行を追加します:
このコードは、web-1
という名前のDropletをfra1
リージョンに展開し、Ubuntu 20.04を1GB RAMと1つのCPUコアで実行します。これで定義する必要があるすべてですので、ファイルを保存して閉じます。
環境変数にDigitalOceanトークンが必要です。トークンを置き換えて、環境変数を作成してください:
データベースへの接続が機能していることを確認するために、構成を計画してみてください:
出力は次のようになります:
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 アカウントに接続します。
コマンドラインで、次のコマンドを実行します:
次の出力が表示されます:
OutputTerraform 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
という名前のディレクトリを作成します。
それに移動します:
プロジェクトを設定するには、以下の手順が必要です:
cloud
プロバイダを定義して構成します。これは Terraform Cloud とのインタフェースです。digitalocean
リソースをデプロイするために、digitalocean
プロバイダが必要です。- 使用する変数を定義し、初期化します。
プロバイダとモジュールの要件仕様を provider.tf
という名前のファイルに保存します。これを実行して編集モードに入ります:
以下の行を追加します:
ここでは、まず Terraform のバージョンを指定します。次に、必要な digitalocean
プロバイダを指定し、バックエンドを cloud
に設定します。 organization
と workspaces.name
は、指定した名前で置き換えてください。高亮表示されている値です。
次に、do_token
という変数を定義し、それを後で作成する digitalocean
プロバイダに渡します。これでプロジェクトを組織に接続するように設定が完了しましたので、ファイルを保存して閉じます。
次のコマンドでプロジェクトを初期化します:
出力は以下のようになります:
OutputInitializing 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の定義が同じですので、次のコマンドを実行してコピーできます:
最後に、変数の値を定義します。cloud
プロバイダは、コマンドラインを介して変数に値を渡すことをサポートしていないため、変数ファイルを使用して渡すか、Terraform Cloudで設定する必要があります。Terraformは、.auto.tfvars
で終わるファイルから変数値を読み取ります。編集用にvars.auto.tfvars
というファイルを作成し、開きます。このファイルでdo_token
変数を定義します:
次の行を追加し、your_do_token
をご自身のDigitalOcean APIトークンに置き換えます:
編集が完了したら、ファイルを保存して閉じます。Terraformは、操作を計画する際に自動的にこのファイルを読み取ります。
プロジェクトは今、完了しており、Terraform Cloudをバックエンドとして使用するように設定されています。これで、Dropletを計画して適用し、それがクラウドアプリにどのように反映されるかを確認します。
構成の適用
このチュートリアルのステップ1で、terraform plan
コマンドを使用してプロジェクトを計画しました。Terraform Cloudプロジェクトに同じリソースが定義されているため、再度計画することなく、それを直接Terraform Cloudに適用できます。
以下のコマンドを実行してプロジェクトを適用し、更新します:
出力が異なることに気付くでしょう、local
をバックエンドとして使用する場合と比べて:
cloud
バックエンドを使用すると、Terraform はローカルマシンからの設定の計画または適用を行いません。代わりに、これらのタスクを Terraform Cloud に委任し、出力をリアルタイムでコンソールにストリーミングします。
プロンプトが表示されたら、yes
を入力します。Terraform はまもなく構成の適用を完了し、新しいアクションが適用されたことがわかるように、Terraform Cloud のウェブサイト上のワークスペースに移動できます。
次のコマンドを実行することで、デプロイされたリソースを破棄できます:
このセクションでは、プロジェクトを 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