Terraform を構成する

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

始める前に

  • HashiCorp が提供するドキュメント(https://developer.hashicorp.com/terraform/install)に沿って、ワークステーションに Terraform をダウンロードします。

  • 既存の GDC ストレージ バケットがあることを確認します。ストレージ バケットがない場合は、作成します

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

状態ファイルを管理する

Terraform の状態ファイルは、デプロイの現在の状態を記録し、Terraform 構成にマッピングするために使用されます。GDC オブジェクト ストレージは S3 を使用して実装されているため、Terraform S3 API を使用して共有状態ファイルと同期できます。これを行うには、リモート状態と同期するように Terraform を構成する必要があります。

  1. 次の構成を、ローカルに保存されている Terraform ファイル(main.tf ファイルなど)に追加します。

    terraform {
      backend "s3" {
        bucket = "BUCKET_FQN"
        key = "TF_STATE_PATH"
        endpoint = "BUCKET_ENDPOINT"
        skip_credentials_validation = true
        force_path_style = true
        access_key = "ACCESS_KEY"
        secret_key = "SECRET_KEY"
        ...
      }
    }
    

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

    • BUCKET_FQN: Bucket カスタム リソースの完全修飾名。

    • TF_STATE_PATH: ストレージ バケットに保存する Terraform 状態ファイルの場所。

    • BUCKET_ENDPOINT: Bucket カスタム リソースのエンドポイント。

    • ACCESS_KEY: アクセス認証情報を含むシークレットから取得したアクセスキー。バケット アクセス認証情報を取得するの手順に沿って、アクセスキーを取得します。

    • SECRET_KEY: アクセス認証情報を含むシークレットから取得した秘密鍵。バケット アクセス認証情報を取得するに沿って、シークレット キーを取得します。

    GDC は認証情報の検証をサポートしておらず、パススタイルのエンドポイントを使用するため、skip_credentials_validationforce_style_pathtrue に設定する必要があります。

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

    terraform init
    

    Terraform は、必須入力として AWS リージョンを要求する場合がありますが、GDC オブジェクト ストレージを使用しているため、この値は使用されません。要件を満たすために、任意の AWS リージョンを入力します。

権限の設定

Terraform を使用して特定のタスク(GDC プロジェクトの作成など)を実行するために必要な権限に加えて、そのスコープでカスタム リソース定義を表示する権限も必要です。Terraform を使用するために必要な権限を適用します。

  1. 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"]
    EOF
    

    KUBECONFIG は、Terraform で管理するリソースをホストする API サーバーまたはクラスタの kubeconfig ファイルに置き換えます。たとえば、ほとんどのリソースは Management API サーバーで実行されます。コンテナ ワークロードの場合は、Kubernetes クラスタの kubeconfig ファイルを設定します。グローバル リソースを管理する場合は、必ずグローバル API サーバーを設定してください。

  2. 前の手順で定義したクラスタロールをユーザーにバインドします。

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    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
    

Terraform 権限を設定する API サーバーまたはクラスタごとに、上記の手順を繰り返します。

Terraform プロバイダをインストールして構成する

Kubernetes リソースをプロビジョニングして管理するには、Kubernetes プロバイダをインストールする必要があります。

  1. モジュール内の Terraform ファイル(main.tf ファイルなど)に、次の required_providers ブロックを挿入します。

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = "~>2.6.1"
        }
      }
    }
    
  2. Terraform の作業ディレクトリを初期化して、プロバイダをインストールします。

    terraform init