- OpenTofu言語
- OpenTofu設定
- バックエンド
- gcs
バックエンドタイプ: gcs
Google Cloud Storage (GCS) の既存のバケット内の設定可能なプレフィックスとしてステートをオブジェクトとして保存します。バックエンドを設定する前に、バケットが存在している必要があります。
このバックエンドはステートロッキングをサポートしています。
誤った削除や人的エラーの場合にステートを復旧できるように、GCSバケットでオブジェクトのバージョニングを有効にすることを強くお勧めします。
構成例
terraform {
backend "gcs" {
bucket = "tf-state-prod"
prefix = "tofu/state"
}
}
データソースの構成
data "terraform_remote_state" "foo" {
backend = "gcs"
config = {
bucket = "tofu-state"
prefix = "prod"
}
}
resource "local_file" "foo" {
content = data.terraform_remote_state.foo.outputs.greeting
filename = "${path.module}/outputs.txt"
}
認証
バケットへのIAMの変更は最終的な整合性であり、有効になるまでに数分かかる場合があります。OpenTofuは、最終的な整合性が取れるまで403エラーを返します。
ワークステーションでOpenTofuを実行する。
ワークステーションでOpenTofuを使用している場合は、Google Cloud SDKをインストールし、ユーザーアプリケーションのデフォルト認証情報を使用して認証する必要があります。
ユーザーADCは期限切れになるため、gcloud auth application-default login
を実行して更新できます。
Google CloudでOpenTofuを実行する
Google CloudでOpenTofuを実行している場合は、そのインスタンスまたはクラスターでGoogleサービスアカウントを使用するように構成できます。これにより、OpenTofuは、個別の認証情報/認証ファイルを組み込むことなく、Google Cloudに対して認証できます。VM/クラスターのスコープがcloud-platformに設定されていることを確認してください。
Google Cloud外部でOpenTofuを実行する
Google Cloud外部でOpenTofuを実行している場合は、サービスアカウントキーを生成し、GOOGLE_APPLICATION_CREDENTIALS
環境変数をサービスアカウントキーのパスに設定します。OpenTofuはそのキーを認証に使用します。
サービスアカウントの偽装
OpenTofuは、こちらで説明されているように、Googleサービスアカウントを偽装できます。前のセクションで説明したように、有効な認証情報を提供する必要があり、そのIDは偽装しているサービスアカウントに対してroles/iam.serviceAccountTokenCreator
ロールを持っている必要があります。
暗号化
暗号化キーは慎重に管理してください。紛失または削除されたキーで暗号化されたステートデータは復元できません。顧客提供の暗号化キーを使用する場合は、キーを安全に管理し、紛失しないようにする必要があります。ステートの暗号化に使用した Cloud KMS の顧客管理の暗号化キーを削除してはいけません。ただし、誤ってキーを削除した場合でも、復元できる時間枠があります。
顧客提供の暗号化キー
開始するには、次のガイドに従ってください: 顧客提供の暗号化キーの使用
バックエンド構成から顧客提供のキーを削除したり、別の顧客提供のキーに変更したりする場合、OpenTofu は自動的に状態の移行を実行できず、代わりに手動での介入が必要になります。この介入が必要な理由は、Google が顧客提供の暗号化キーを保存しておらず、Cloud Storage API に送信されるリクエストには代わりにキーを提供する必要があるためです(顧客提供の暗号化キーを参照)。状態の移行時、バックエンド構成は古いキーの詳細を失うため、OpenTofu は移行プロセス中にキーを使用できません。
顧客提供の暗号化キーの使用から状態を移行したり、バックエンドで使用するキーを変更したりするには、状態ファイルで古い顧客提供の暗号化キーの使用を削除するために、rewrite (gsutil CLI) または cp (gcloud CLI) 操作を実行する必要があります。暗号化を削除すると、新しいバックエンド構成で tofu init -migrate-state
を正常に実行できます。
顧客管理の暗号化キー(Cloud KMS)
開始するには、次のガイドに従ってください: 顧客管理の暗号化キーの使用
バックエンド構成から顧客管理のキーを削除したり、別の顧客管理のキーに変更したりする場合、OpenTofu は手動での介入なしに状態の移行を管理できます。この機能は、GCP が顧客管理の暗号化キーを保存しており、状態の移行プロセス中にアクセスできるためです。ただし、これらの変更は、状態の移行後、状態ファイルで最初の書き込み操作が発生するまで完全には有効になりません。状態の移行後の最初の書き込み操作では、ファイルは古いキーで復号化され、新しい暗号化方式で書き込まれます。この方法は、顧客提供の暗号化キーのセクションで説明されている rewrite 操作と同等です。状態の移行後の最初の書き込みが重要であるため、古いKMSキーは、そのキーで暗号化されたすべての状態ファイルが更新されるまで削除しないでください。
復号化は GCS 内で自動的に行われるため、GCS バケットからファイルを読み取るリクエストで顧客管理のキーを送信する必要はありません。つまり、KMS で暗号化された状態にアクセスするために terraform_remote_state
データソース を使用する場合、データソースの config
オブジェクトで KMS キーを指定する必要はありません。
顧客管理の暗号化キーを使用するには、キーを作成し、プロジェクトの GCS サービス エージェントに Cloud KMS CryptoKey Encrypter/Decrypter 事前定義ロールを使用してキーを使用する権限を付与する必要があります。
構成変数
認証情報やその他の機密データを提供するには、環境変数を使用することをお勧めします。-backend-config
を使用したり、これらの値を構成に直接ハードコードしたりすると、OpenTofu は .terraform
サブディレクトリとプランファイルの両方にこれらの値を含めます。詳細については、認証情報と機密データを参照してください。
次の構成オプションがサポートされています
bucket
- (必須) GCS バケットの名前。この名前はグローバルに一意である必要があります。詳細については、バケット命名ガイドラインを参照してください。credentials
/GOOGLE_BACKEND_CREDENTIALS
/GOOGLE_CREDENTIALS
- (オプション) Google Cloud Platform アカウントの認証情報の JSON 形式のローカルパス。設定されていない場合、パスは Google アプリケーションのデフォルト認証情報を使用します。提供される認証情報には、バケットに対する Storage Object Admin ロールが必要です。警告: Google Cloud Platform プロバイダーも使用している場合、GOOGLE_CREDENTIALS
環境変数も取得します。impersonate_service_account
/GOOGLE_BACKEND_IMPERSONATE_SERVICE_ACCOUNT
/GOOGLE_IMPERSONATE_SERVICE_ACCOUNT
- (オプション) 状態バケットへのアクセスに使用するサービスアカウントを偽装します。偽装を成功させるには、そのアカウントに対するroles/iam.serviceAccountTokenCreator
ロールが必要です。委任チェーンを使用している場合は、impersonate_service_account_delegates
フィールドを使用して指定できます。impersonate_service_account_delegates
- (オプション) こちらで説明されている、サービスアカウントを偽装するための委任チェーン。access_token
- (オプション) Google 認証サーバーから取得した一時的な [OAuth 2.0 アクセストークン]、つまり、GCP API への HTTP リクエストを認証するために使用されるAuthorization: Bearer
トークン。これはcredentials
の代替です。両方が指定されている場合、credentials
フィールドよりもaccess_token
が使用されます。prefix
- (オプション) バケット内の GCS プレフィックス。ワークスペースの名前付き状態は、<prefix>/<name>.tfstate
というオブジェクトに格納されます。encryption_key
/GOOGLE_ENCRYPTION_KEY
- (オプション) バケット内の状態ファイルの読み書き時に使用される、32 バイトの base64 エンコードされた「顧客提供の暗号化キー」。詳細については、顧客提供の暗号化キーを参照してください。kms_encryption_key
/GOOGLE_KMS_ENCRYPTION_KEY
- (オプション) バケット内の状態ファイルの読み書き時に使用される Cloud KMS キー(「顧客管理の暗号化キー」)。形式はprojects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}/cryptoKeys/{{name}}
である必要があります。IAM の要件を含む詳細については、顧客管理の暗号化キーを参照してください。storage_custom_endpoint
/GOOGLE_BACKEND_STORAGE_CUSTOM_ENDPOINT
/GOOGLE_STORAGE_CUSTOM_ENDPOINT
- (オプション) プロトコル、Private Service Connect エンドポイントを指す DNS 名、および Cloud Storage API のパス(/storage/v1/b
、こちらを参照)の 3 つの部分を含む URL。 Service Directory によって自動的に作成された DNS 名、または自分で作成した カスタム DNS 名のいずれかを使用できます。たとえば、xyz
というエンドポイントを作成し、自動的に作成された DNS 名を使用する場合は、フィールド値をhttps://storage-xyz.p.googleapis.com/storage/v1/b
として設定する必要があります。OpenTofu を使用して Private Service Connect エンドポイントを作成する方法については、このガイドを参照してください。