DM 変換の使用に関するベスト プラクティス

Terraform の変換に関するベスト プラクティス

状態

状態ファイルには、Terraform が管理するリソースに関する情報が保存されます。デフォルトでは、Terraform は状態をディスク上にローカルに保存します。リモートで状態を保存すると、分散コラボレーションのために、機密情報の保護、Terraform の継続的インテグレーション(CI)の実行が可能になります。

Deployment Manager テンプレートを Terraform に変換し、必要に応じてリソースをインポートしたら、Cloud Storage に状態をリモートで保存する手順に従うことをおすすめします。

モジュール

複雑さを軽減し、整合性を適用し、構成の再利用性を促進するには、Terraform モジュールを使用してリソースのコレクションをカプセル化します。

モジュールを使用するには、次のいずれかを行います。

ほとんどのユースケースでは、公開モジュールを使用することをおすすめします。

カスタム モジュールの作成

  1. 構成を変換したら、モジュールに移動するリソースを特定します。

  2. これらのリソースの構成をモジュール ディレクトリに移動し、必要な変数をパラメータに変換します。

    次の例は、google_bigquery_datasetgoogle_bigquery_table をモジュールに移動する方法を示しています。

    # bq-module/main.tf
    resource "google_bigquery_dataset" "bigquerydataset" {
      provider = google-beta
    
      default_table_expiration_ms = 36000000
      location = "us-west1"
      dataset_id = var.dataset_id
      project = var.project_id
    }
    
    resource "google_bigquery_table" "bigquerytable" {
      provider = google-beta
    
      labels = {
        data-source = "external"
        schema-type = "auto-junk"
      }
      dataset_id = var.dataset_id
      project = var.project_id
      table_id = var.table_id
    
      depends_on = [
        google_bigquery_dataset.bigquerydataset
      ]
    }
    
    # bq-module/variables.tf
    variable "project_id" {
      description = "Project ID"
      type = string
    }
    
    variable "dataset_id" {
      description = "Dataset ID"
      type = string
    }
    
    variable "table_id" {
      description = "Table ID"
      type = string
    }
    
  3. エクスポートされた main.tf ファイルで、元の構成を、作成したモジュールに置き換えます。

    次の例は、前の手順の例で作成したモジュールを使用してこの置換を行う方法を示しています。

    # main.tf
    module "bq" {
      source = "./bq-module"
    
      project_id = "PROJECT_ID"
      dataset_id = "bigquerydataset"
      table_id   = "bigquerytable"
    }
    
  4. ローカル モジュールを初期化するには、次のコマンドを実行します。

    terraform init
    
  5. リソースに関連付けられた Terraform の状態をモジュール インスタンスに移動します。

    モジュールを前のステップの例から移動するには、次のコマンドを実行します。

    terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.bigquerydataset
    terraform state mv google_bigquery_table.bigquerytable module.bq.google_bigquery_table.bigquerytable
    

    この例では、移動の出力は次のようになります。

    Move "google_bigquery_dataset.bigquerydataset" to "module.bq.google_bigquery_dataset.bigquerydataset"
    Successfully moved 1 object(s).
    Move "google_bigquery_table.bigquerytable" to "module.bq.google_bigquery_table.bigquerytable"
    Successfully moved 1 object(s).
    
  6. 次のコマンドを実行して、リソースが変更されていないことを確認します。

    terraform plan
    

    コマンドの実行後に受け取る出力の例を次に示します。

    No changes. Your infrastructure matches the configuration.
    

公開済みモジュールを使用する

  1. 構成を変換したら、公開済みモジュールと、そのモジュールに移動するリソースを特定します。

  2. モジュールのドキュメントを確認し、モジュールの構成オプションを確認してください。

  3. 現在のリソース構成に、構成済みのモジュールのインスタンスを作成します。

    たとえば、google_bigquery_datasetgoogle_bigquery_table を公式の BigQuery モジュールに移動する場合、モジュールは次の例のようになります。

    module "bq" {
      source  = "terraform-google-modules/bigquery/google"
      version = "~> 5.0"
    
      project_id          = "PROJECT_ID"
      dataset_id          = "bigquerydataset"
      location            = "us-west1"
      deletion_protection = true
    
      tables = [
        {
          table_id           = "bigquerytable",
          friendly_name      = "bigquerytable"
          time_partitioning  = null,
          range_partitioning = null,
          expiration_time    = null,
          clustering         = [],
          schema             = null,
          labels = {
            data-source = "external"
            schema-type = "auto-junk"
          },
        }
      ]
    }
    
  4. ローカル モジュールを初期化するには、次のコマンドを実行します。

    terraform init
    
  5. モジュールのソースコードを読み取り、アップストリーム モジュール内のリソース アドレスを特定し、move コマンドを作成します。

    terraform state mv google_bigquery_dataset.bigquerydataset  module.bq.google_bigquery_dataset.main
    terraform state mv google_bigquery_table.bigquerytable 'module.bq.google_bigquery_table.main["bigquerytable"]'
    
  6. 構成の変更を表示するには、次のコマンドを実行します。

    terraform plan
    

選択した公開モジュールのデフォルト設定が異なるか、構成が異なる場合は、コマンドの実行による出力に違いが見られる場合があります。

作動

Cloud Build、Jenkins、GitHub Actions などの継続的インテグレーション(CI)システムを使用して、Terraform の大規模な実行を自動化することをおすすめします。詳細については、Terraform、Cloud Build、GitOps を使用してインフラストラクチャをコードとして管理するをご覧ください。

トリガーの作成をブートストラップして認証を簡素化するには、Cloud Build Workspace ブループリントを使用できます。

構造

DM Convert から変換された各構成は、単一の状態ファイルにマッピングされた単一ルート構成です。大量のリソースを保持するために 1 つの状態ファイルを設定することはおすすめしません。構成を変換したら、新しい構成がルート モジュールのベスト プラクティスに従っているのを確認することをおすすめします。