メインコンテンツへスキップ

バックエンドタイプ: gcs

Google Cloud Storage (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ロールを持っている必要があります。

暗号化

顧客提供の暗号化キー

開始するには、次のガイドに従ってください: 顧客提供の暗号化キーの使用

バックエンド構成から顧客提供のキーを削除したり、別の顧客提供のキーに変更したりする場合、OpenTofu は自動的に状態の移行を実行できず、代わりに手動での介入が必要になります。この介入が必要な理由は、Google が顧客提供の暗号化キーを保存しておらず、Cloud Storage API に送信されるリクエストには代わりにキーを提供する必要があるためです(顧客提供の暗号化キーを参照)。状態の移行時、バックエンド構成は古いキーの詳細を失うため、OpenTofu は移行プロセス中にキーを使用できません。

顧客管理の暗号化キー(Cloud KMS)

開始するには、次のガイドに従ってください: 顧客管理の暗号化キーの使用

バックエンド構成から顧客管理のキーを削除したり、別の顧客管理のキーに変更したりする場合、OpenTofu は手動での介入なしに状態の移行を管理できます。この機能は、GCP が顧客管理の暗号化キーを保存しており、状態の移行プロセス中にアクセスできるためです。ただし、これらの変更は、状態の移行後、状態ファイルで最初の書き込み操作が発生するまで完全には有効になりません。状態の移行後の最初の書き込み操作では、ファイルは古いキーで復号化され、新しい暗号化方式で書き込まれます。この方法は、顧客提供の暗号化キーのセクションで説明されている rewrite 操作と同等です。状態の移行後の最初の書き込みが重要であるため、古いKMSキーは、そのキーで暗号化されたすべての状態ファイルが更新されるまで削除しないでください。

復号化は GCS 内で自動的に行われるため、GCS バケットからファイルを読み取るリクエストで顧客管理のキーを送信する必要はありません。つまり、KMS で暗号化された状態にアクセスするために terraform_remote_state データソース を使用する場合、データソースの config オブジェクトで KMS キーを指定する必要はありません。

構成変数

次の構成オプションがサポートされています

  • 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 エンドポイントを作成する方法については、このガイドを参照してください。