Terraform の変換に関するベスト プラクティス
状態
状態ファイルには、Terraform が管理するリソースに関する情報が保存されます。デフォルトでは、Terraform はローカルの状態をディスクに保存します。リモートで状態を保存すると、分散コラボレーションのために、機密情報の保護、Terraform の継続的インテグレーション(CI)の実行が可能になります。
Deployment Manager テンプレートを Terraform に変換し、必要に応じてリソースをインポートしたら、Cloud Storage にリモートで状態を保存する手順に沿って行うことをおすすめします。
モジュール
複雑さを軽減し、整合性を適用して、構成の再利用性を��めるには、Terraform モジュールを使用してリソースのコレクションをカプセル化します。
モジュールを使用するには、次のいずれかを行います。
DM Convert によってエクスポートされたリソースからカスタム モジュールを作成します。これが最も柔軟性があります。
Google Cloud の公式モジュールまたは Terraform レジストリのコレクションから公開モジュールを使用します。
ほとんどのユースケースでは、公開モジュールを使用することをおすすめします。
カスタム モジュールの作成
構成を変換した後、モジュールに移動するリソースを特定します。
これらのリソースの構成をモジュール ディレクトリに移動し、必要な変数をパラメータに変換します。
次の例は、
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 ワークスペース ブループリントの使用を選択できます。
構造
DM Convert から変換された各構成は、単一の状態ファイルにマッピングされた単一のルート構成です。多数のリソースを保持するために単一の状態ファイルを設定することはおすすめしません。構成を変換したら、新しい構成��ルート モジュールのベスト プラクティスに従っているのを確認することをおすすめします。