- OpenTofu言語
- OpenTofu設定
- バックエンド
- バックエンド設定
バックエンド設定
バックエンドは、OpenTofuが状態データファイルをどこに保存するかを定義します。
OpenTofuは、永続化された状態データを使用して、管理するリソースを追跡します。ほとんどの重要なOpenTofu構成は、TACOS (TF Automation and Collaboration Software)と統合するか、バックエンドを使用して状態をリモートに保存します。これにより、複数の人が状態データにアクセスし、そのインフラストラクチャリソースの集合に対して共同作業を行うことができます。
このページでは、backend
ブロックを構成に追加することで、バックエンドを設定する方法について説明します。
利用可能なバックエンド
デフォルトでは、OpenTofuはlocal
と呼ばれるバックエンドを使用します。これは、状態をディスク上のローカルファイルとして保存します。このドキュメントに含まれている組み込みバックエンドのいずれかを構成することもできます。
これらのバックエンドの一部は、状態ファイルのプレーンなリモートディスクのように動作しますが、他のバックエンドは、操作が実行されている間、状態をロックすることをサポートしています。これは、競合や不整合を防ぐのに役立ちます。リストされている組み込みバックエンドだけがバックエンドです。プラグインとして追加のバックエンドを読み込むことはできません。
バックエンドブロックの使用
TACOS (TF Automation and Collaboration Software)を使用する場合、構成に関連付けられたワークスペースで状態が自動的に管理されるため、バックエンドを設定する必要はありません。構成にcloud
ブロックが含まれている場合、backend
ブロックを含めることはできません。
バックエンドを設定するには、トップレベルのterraform
ブロック内にネストされたbackend
ブロックを追加します。次の例では、remote
バックエンドを設定しています。
terraform {
backend "remote" {
organization = "example_corp"
workspaces {
name = "my-app-prod"
}
}
}
バックエンドの設定には、いくつかの重要な制限があります。
- 構成は、1つのバックエンドブロックのみを提供できます。
- バックエンドブロックは、状態から派生した状態またはローカルの値(データソース属性)を参照できません。
認証情報と機密データ
バックエンドは状態をリモートサービスに保存するため、複数の人がアクセスできます。状態データには非常に機密性の高い情報が含まれているため、リモート状態にアクセスするには、一般的にアクセス認証情報が必要です。
環境変数を使用して認証情報やその他の機密データを提供することをお勧めします。-backend-config
を使用するか、これらの値を構成に直接ハードコードすると、OpenTofuはこれらの値を.terraform
サブディレクトリとプランファイルの両方に含めます。これにより、機密の認証情報が漏洩する可能性があります。
OpenTofuは、バックエンドの設定を2つの別々のファイルにプレーンテキストで書き込みます。
.terraform/terraform.tfstate
ファイルには、現在の作業ディレクトリのバックエンド設定が含まれています。- すべてのプランファイルは、プランが作成された時点での
.terraform/terraform.tfstate
の情報を取り込みます。これにより、OpenTofuがプランを正しいインフラストラクチャセットに適用していることを確認できます。
以前にファイルに保存したプランを適用する場合、OpenTofuは現在のバックエンド設定ではなく、そのファイルに保存されているバックエンド設定を使用します。その設定に期限付きの認証情報が含まれている場合、プランの適用が完了する前に期限が切れる可能性があります。プランと適用ステップの間で異なる値を使用する必要がある場合は、環境変数を使用して認証情報を渡します。
バックエンドタイプ
バックエンドブロックのブロックラベル(上記の例では"remote"
)は、使用するバックエンドの種類を示します。OpenTofuには組み込みのバックエンドがいくつか用意されており、設定されたバックエンドは使用しているOpenTofuのバージョンで使用可能でなければなりません。
ブロックの本文で使用される引数は、選択したバックエンドの種類に固有です。これらの引数は、バックエンドが設定の状態をどこにどのように保存するかを設定し、場合によっては他の動作も設定します。
一部のバックエンドでは、特殊な状況で使用するために、設定の一部としてアクセス資格情報を直接提供することができます。これは実用的な理由からです。しかし、通常の使用では、アクセス資格情報をバックエンド設定の一部として含めることは*お勧めしません*。代わりに、これらの引数は完全に設定せず、各バックエンドのドキュメントに記載されているように、ターゲットシステムの慣例に従って、資格情報ファイルまたは環境変数を使用して資格情報を提供してください。
詳細と、その種類の構成引数については、各バックエンドの種類のページを参照してください。
デフォルトのバックエンド
設定にバックエンドブロックが含まれていない場合、OpenTofuはデフォルトでlocal
バックエンドを使用します。これは、現在の作業ディレクトリにプレーンテキストファイルとして状態を保存します。
初期化
バックエンドの設定を変更した場合は、プラン、適用、または状態操作を実行する前に、バックエンドを検証および設定するために、tofu init
を再度実行する必要があります。
初期化後、OpenTofuはローカルに.terraform/
ディレクトリを作成します。このディレクトリには、OpenTofu CLIに提供した認証パラメータを含む、最新のバックエンド設定が含まれています。このディレクトリには、リモートバックエンドの機密資格情報が含まれている可能性があるため、Gitにチェックインしないでください。
ローカルバックエンドの設定は、実際のインフラストラクチャに関する状態データを含むterraform.tfstate
ファイルとは異なり、完全に分離されています。OpenTofuはterraform.tfstate
ファイルをリモートバックエンドに保存します。
バックエンドを変更すると、OpenTofuは状態を新しいバックエンドに移行するオプションを提供します。これにより、既存の状態を失うことなく、バックエンドを採用できます。
新しいバックエンドに移行する前に、terraform.tfstate
ファイルを別の場所にコピーして、状態を手動でバックアップすることを強くお勧めします。
部分設定
バックエンド設定に必要なすべての引数を指定する必要はありません。OpenTofuを実行する自動化スクリプトによって一部の引数が自動的に提供される場合、特定の引数を省略することが望ましい場合があります。一部またはすべての引数が省略されている場合、これを*部分設定*と呼びます。
部分設定では、残りの設定引数は初期化プロセスの一部として提供する必要があります。
残りの引数を指定するには、いくつかの方法があります。
-
**ファイル**: 設定ファイルは、
init
コマンドラインで指定できます。ファイルを指定するには、tofu init
を実行するときに-backend-config=PATH
オプションを使用します。ファイルに機密情報が含まれている場合は、Vaultなどの安全なデータストアに保管できます。この場合、OpenTofuを実行する前にローカルディスクにダウンロードする必要があります。 -
**コマンドラインのキー/値ペア**: キー/値ペアは、
init
コマンドラインで指定できます。多くのシェルはコマンドラインフラグを履歴ファイルに保持するため、機密情報にはお勧めできません。単一のキー/値ペアを指定するには、tofu init
を実行するときに-backend-config="KEY=VALUE"
オプションを使用します。 -
**インタラクティブ**: 対話型入力が無効になっていない限り、OpenTofuは必要な値をインタラクティブに尋ねます。OpenTofuはオプションの値を求めるプロンプトを表示しません。
バックエンド設定が複数の場所で提供されている場合、トップレベルの設定がマージされ、コマンドラインオプションがメイン設定の設定をオーバーライドし、次にコマンドラインオプションが順番に処理され、後のオプションが以前のオプションで設定された値をオーバーライドします。
最終的にマージされた設定は、バージョン管理から除外する必要がある.terraform
ディレクトリのディスクに保存されます。これは、機密情報をバージョン管理から省略できることを意味しますが、OpenTofuを実行すると、ローカルディスクにプレーンテキストで存在します。
部分設定を使用する場合、OpenTofuでは、少なくとも空のバックエンド設定がルートOpenTofu設定ファイルのいずれかに指定され、バックエンドの種類が指定されている必要があります。例えば
terraform {
backend "consul" {}
}
ファイル
バックエンド設定ファイルには、backend
ブロックの内容がトップレベル属性として含まれており、別のtofu
またはbackend
ブロックでラップする必要はありません。
address = "demo.consul.io"
path = "example_app/terraform_state"
scheme = "https"
*.backendname.tfbackend
(例:config.consul.tfbackend
)は推奨される命名パターンです。OpenTofuは他の名前の使用を妨げませんが、この規則に従うことで、エディターがコンテンツを理解しやすくなり、結果としてより良い編集エクスペリエンスが提供される可能性があります。
コマンドラインのキー/値ペア
同じ設定は、次のようにコマンドラインで指定することもできます。
$ tofu init \
-backend-config="address=demo.consul.io" \
-backend-config="path=example_app/terraform_state" \
-backend-config="scheme=https"
Consulバックエンドには、Consulアクセストークンも必要です。設定から資格情報を省略し、他のメカニズムを使用するという上記の推奨事項に従い、ConsulトークンはCONSUL_HTTP_TOKEN
またはCONSUL_HTTP_AUTH
環境変数を設定することによって提供されます。選択したバックエンドに資格情報をメイン設定以外で提供する方法については、そのドキュメントを参照してください。
変数とローカル
バックエンド設定では、変数とローカルを使用できます(制限付き)。バックエンド設定には、状態で定義されたデータまたはプロバイダー定義関数への参照を含めることはできません。すべての値は、状態が使用可能になる前に、tofu init
中に解決できる必要があります。
バックエンド設定で機密データやその他の機密データを指定するために変数を使用することはお勧めしません。設定が不適切な場合、機密資格情報が漏洩する可能性があります。
locals {
region = "us-east-1"
}
terraform {
backend "s3" {
region = local.region
}
}
設定の変更
バックエンド設定はいつでも変更できます。設定自体とバックエンドの種類(たとえば、「consul」から「s3」)の両方を変更できます。
OpenTofuは設定の変更を自動的に検出し、再初期化をリクエストします。再初期化プロセスの一部として、OpenTofuは既存の状態を新しい設定に移行するかどうかを尋ねます。これにより、あるバックエンドから別のバックエンドに簡単に切り替えることができます。
複数のワークスペースを使用している場合、OpenTofuはすべてのワークスペースを宛先にコピーできます。OpenTofuは複数のワークスペースを検出した場合、これが必要な操作かどうかを尋ねます。
同じバックエンドを再構成している場合でも、OpenTofuは状態を移行するかどうかを尋ねます。このシナリオでは、「いいえ」と答えることができます。
バックエンドの設定解除
バックエンドを使用しない場合は、ファイルから設定を削除するだけです。OpenTofuはこれを他の変更と同様に検出し、再初期化するようプロンプトを表示します。
再初期化の一部として、OpenTofuは状態を通常のローカル状態に戻す移行するかどうかを尋ねます。これが完了すると、OpenTofuはデフォルトの動作に戻ります。