Terraform の変換に関するベスト プラクティス
状態
状態ファイルには、Terraform が管理するリソースに関する情報が保存されます。デフォルトでは、Terraform は状態をディスク上にローカルに保存します。リモートで状態を保存すると、分散コラボレーションのために、機密情報の保護、Terraform の継続的インテグレーション(CI)の実行が可能になります。
Deployment Manager テンプレートを Terraform に変換し、必要に応じてリソースをインポートしたら、Cloud Storage に状態をリモートで保存する手順に従うことをおすすめします。
モジュール
複雑さを軽減し、整合性を適用し、構成の再利用性を促進するには、Terraform モジュールを使用してリソースのコレクションをカプセル化します。
モジュールを使用するには、次のいずれかを行います。
DM Convert によってエクスポートされたリソースからカスタム モジュールを作成する。これにより、最大限の柔軟性を確保できます。
Google Cloud の公式モジュール コレクションまたは Terraform Registry から公開されているモジュールを使用する。
ほとんどのユースケースでは、公開モジュールを使用することをおすすめします。
カスタム モジュールの作成
構成を変換したら、モジュールに移動するリソースを特定します。
これらのリソースの構成をモジュール ディレクトリに移動し、必要な変数をパラメータに変換します。
次の例は、
google_bigquery_dataset
とgoogle_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 }
エクスポートされた
main.tf
ファイルで、元の構成を、作成したモジュールに置き換えます。次の例は、前の手順の例で作成したモジュールを使用してこの置換を行う方法を示しています。
# main.tf module "bq" { source = "./bq-module" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" table_id = "bigquerytable" }
ローカル モジュールを初期化するには、次のコマンドを実行します。
terraform init
リソースに関連付けられた 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).
次のコマンドを実行して、リソースが変更されていないことを確認します。
terraform plan
コマンドの実行後に受け取る出力の例を次に示します。
No changes. Your infrastructure matches the configuration.
公開済みモジュールを使用する
モジュールのドキュメントを確認し、モジュールの構成オプションを確認してください。
現在のリソース構成に、構成済みのモジュールのインスタンスを作成します。
たとえば、
google_bigquery_dataset
とgoogle_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" }, } ] }
ローカル モジュールを初期化するには、次のコマンドを実行します。
terraform init
モジュールのソースコードを読み取り、アップストリーム モジュール内のリソース アドレスを特定し、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"]'
構成の変更を表示するには、次のコマンドを実行します。
terraform plan
選択した公開モジュールのデフォルト設定が異なるか、構成が異なる場合は、コマンドの実行による出力に違いが見られる場合があります。
作動
Cloud Build、Jenkins、GitHub Actions などの継続的インテグレーション(CI)システムを使用して、Terraform の大規模な実行を自動化することをおすすめします。詳細については、Terraform、Cloud Build、GitOps を使用してインフラストラクチャをコードとして管理するをご覧ください。
トリガーの作成をブートストラップして認証を簡素化するには、Cloud Build Workspace ブループリントを使用できます。
構造
DM Convert から変換された各構成は、単一の状態ファイルにマッピングされた単一ルート構成です。大量のリソースを保持するために 1 つの状態ファイルを設定することはおすすめしません。構成を変換したら、新しい構成がルート モジュールのベスト プラクティスに従っているのを確認することをおすすめします。