Terraform を使用

Google Distributed Cloud(GDC)エアギャップ環境で Terraform を構成するには、Terraform をダウンロードして、Kubernetes リソースを処理するように構成する必要があります。

このドキュメントは、エアギャップのあるハードウェアとソフトウェアのワークフローを管理するために Terraform を設定する必要があるすべてのオーディエンス グループを対象としています。詳細については、GDC エアギャップ ドキュメントの対象読者をご覧ください。

始める前に

  • HashiCorp が提供するドキュメント(https://developer.hashicorp.com/terraform/install)に沿って、Terraform 1.6.3 以降をワークステーションにダウンロードします。このドキュメントのバックエンド構成では、古い Terraform バージョンでサポートされていない設定を使用しています。

  • 既存の GDC ストレージ バケットがあることを確認します。ストレージ バケットがない場合は、作成します。詳細については、ストレージ バケットを作成するをご覧ください。

  • オブジェクト ストレージで使用される認証局(CA)証明書をシステムが認識できることを確認します。

  • gdcloud CLI をインストールします。詳細については、gdcloud CLI を使用するをご覧ください。

  • Terraform で管理するリソースをホストしている API サーバーまたはクラスタの kubeconfig ファイルを生成します。詳細については、kubeconfig ファイルを取得するをご覧ください。

Terraform の設定

GDC 環境で Terraform を設定するには、次の操作を行います。

  1. Terraform モジュール、またはワークステーション上の Terraform ファイルのコレクション内に main.tf ファイルを作成し、次の構成を追加します。

    terraform {
      backend "s3" {
        bucket = "BUCKET_FQN"
        key = "TF_STATE_PATH"
        region = "ZONE"
        endpoints = {
          s3 = "BUCKET_ENDPOINT"
        }
        use_path_style = true
        access_key = "ACCESS_KEY"
        secret_key = "SECRET_KEY"
        skip_credentials_validation = true
        skip_requesting_account_id = true
        skip_metadata_api_check = true
        skip_region_validation = true
        skip_s3_checksum = true
      }
    }
    

    次のように置き換えます。

    • BUCKET_FQN: Bucket カスタム リソースの status.fullyQualifiedName 値。例: aabc2z8-platform-terraform-state

    • TF_STATE_PATH: ストレージ バケットに保存する Terraform 状態ファイルのパス。例: main.tfstate

    • ZONE: Bucket カスタム リソース(status.region)のゾーン。例: zone1。Terraform にはリージョン値が必要ですが、GDC オブジェクト ストレージはそれをチェックしません。

    • BUCKET_ENDPOINT: Bucket カスタム リソースの status.endpoint 値。例: https://objectstorage.org-1.zone1.google.gdch.test

    • ACCESS_KEY: アクセス認証情報を含むシークレットから取得したアクセスキー。アクセスキーの取得の詳細については、バケットのアクセス認証情報を取得するをご覧ください。Secret の値は Base64 でエンコードされています。使用する前にデコードします。

    • SECRET_KEY: アクセス認証情報を含むシークレットから取得した秘密鍵。秘密鍵の取得の詳細については、バケット アクセス認証情報を取得するをご覧ください。Secret の値は Base64 でエンコードされています。使用する前にデコードします。

    GDC オブジェクト ストレージは S3 互換ですが、AWS ではありません。残りの設定では、AWS 以外の S3 ストレージのバックエンドを構成します。

    • use_path_style: GDC オブジェクト ストレージにパススタイルのバケット アドレス指定を使用します。

    • skip_credentials_validation と skip_requesting_account_id: Terraform が AWS STS と AWS IAM を呼び出さないようにします。GDC はこれらのサービスを提供しません。

    • skip_metadata_api_check: Terraform が AWS EC2 メタデータ サービスにクエリを実行しないようにします。

    • skip_region_validation: ゾーン名をリージョンとして使用できます。

    • skip_s3_checksum: 状態ファイルのアップロード時に Terraform が SHA-256 チェックサムを要求しないようにします。

  2. 前の手順で指定したストレージ バケットで Terraform 状態ファイルを初期化します。

    terraform init
    
  3. crd-viewer クラスタロール リソースをデプロイし、ユーザー アカウントにバインドします。

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: crd-viewer
    rules:
    - apiGroups: ["apiextensions.k8s.io"]
      resources: ["customresourcedefinitions"]
      verbs: ["get", "list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: crd-viewer-binding
    subjects:
    - kind: User
      name: USER_EMAIL
    roleRef:
      kind: ClusterRole
      name: crd-viewer
      apiGroup: rbac.authorization.k8s.io
    EOF
    

    次のように置き換えます。

    • KUBECONFIG: Terraform で管理しているリソースをホストする API サーバーまたはクラスタの kubeconfig ファイル。

    • USER_EMAIL: ロールをバインドするユーザーのメールアドレス。

    Terraform を使用する各 API サーバーまたはクラスタに crd-viewer ロールをデプロイします。

  4. main.tf ファイルに、次の required_providers ブロックを挿入します。

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    

    この構成では、Kubernetes プロバイダをインストールして、GDC 環境で Kubernetes リソースをプロビジョニングして管理します。

  5. Terraform 作業ディレクトリを初期化して、プロバイダをインストールします。

    terraform init
    

次のステップ