Terraform は既存のインフラストラクチャをインポートできます。インポートすると、他の方法で作成したリソースを Terraform の管理下に置くことができます。
どのような状態の Google Cloud リソースでもインポートできます。
Terraform では次の方法でリソースをインポートできます。
- 一度にひとつずつ。
terraform import
サブコマンドを使用してインポートします。 - 一括。
import
構成にブロックを含めてインポートします(Terraform バージョン 1.5 以降が必要です)。 - 一括で行う場合は、一括エクスポート後にリソースをインポートできる Google Cloud 機能を使用します。
リソースをひとつずつインポートする
import
コマンドは、リソース アドレスと ID の 2 つの引数を取ります。リソース アドレスは、構成内のリソース インスタンスを指す識別子です。ID は、インポートされる Google Cloud のリソースを識別する識別子です。ID の形式はリソースタイプによって異なり、プロバイダでサポートされているリソースについては、ドキュメントに記載されています。完全な識別子(サポートされている場合はプロジェクト ID を含む)を使用することをおすすめします。
インポートするリソース アドレスを指定します。
resource "google_storage_bucket" "sample" { name = "my-bucket" project = "sample-project" location = "US" force_destroy = true }
前に定義した Cloud Storage バケットなどのサンプル リソースの場合、これは
google_storage_bucket.sample
です。リソース ID の形式を確認するには、
google_storage_bucket
リソースのプロバイダ インポートに関するドキュメントをご覧ください。この場合、project/name
の形式であるため、前のサンプルのリソース ID はsample-project/my-bucket
になります。次のようにリソース アドレスと ID を使用して
import
ステートメントを作成します。terraform import google_storage_bucket.sample sample-project/my-bucket
出力:
terraform import google_storage_bucket.sample sample-project/my-bucket google_storage_bucket.sample: Importing from ID "sample-project/my-bucket"... google_storage_bucket.sample: Import prepared! Prepared google_storage_bucket for import google_storage_bucket.sample: Refreshing state... [id=sample-project/my-bucket] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.
モジュール内のリソースをインポートする
モジュールは、Terraform 構成内に 1 つ以上のリソースをカプセル化しています。インポートにはリソース アドレスが必要なため、モジュール内の各リソースは個別にインポートする必要があります。
インポートするモジュール内のリソースを特定します。
module "gcs_bucket" { source = "terraform-google-modules/cloud-storage/google//modules/simple_bucket" version = "~> 3.4" name = "my-bucket" project_id = "sample-project" location = "us-east1" }
リソース アドレスを特定するには、モジュールのコンテンツを調べます。または、構成を適用して、プロバイダから提示されたエラーを使用します。次に例を示します。
terraform apply module.gcs_bucket.google_storage_bucket.bucket: Creating... ╷ │ Error: googleapi: Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict │ │ with module.gcs_bucket.google_storage_bucket.bucket,
上記のログを使用して、
module.gcs_bucket.google_storage_bucket.bucket
としてインポートする必要があるリソース アドレスを特定できます。リソース ID の形式を確認するには、
google_storage_bucket
リソースのプロバイダ インポートに関するドキュメントをご覧ください。この場合、project/name
の形式になります。名前はプランの出力で確認できます。出力:
module.gcs_bucket.google_storage_bucket.bucket will be created + resource "google_storage_bucket" "bucket" { + name = "my-bucket" + project = "sample-project" ... }
上記のサンプルでは、リソース ID は
sample-project/my-bucket
です。次のようにリソース アドレスと ID を使用して
import
ステートメントを作成します。terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
出力:
terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket module.gcs_bucket.google_storage_bucket.bucket: Importing from ID "sample-project/my-bucket"... module.gcs_bucket.google_storage_bucket.bucket: Import prepared! Prepared google_storage_bucket for import module.gcs_bucket.google_storage_bucket.bucket: Refreshing state... [id=sample-project/my-bucket] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.
構成に基づく import
ブロックを使用してリソースを一括でインポートする
Terraform バージョン 1.5 では、Terraform 構成に import
ブロックを追加できます。これにより、インポート オペレーションを plan
オペレーション中にプレビューすることができ、apply
オペレーションを使用して実行できます。
コードを手動で記述する代わりに、インポートしたリソースに対してコードを自動的に生成できます。
import
ブロックは次の 2 つのパラメータを受け取ります。
id
: インポートされるクラウド リソースのプロバイダ定義のリソース ID。有効なプロバイダ定義のリソース ID については、Hashicorp の Google プロバイダのドキュメントでリソースのインポートに関するセクションをご覧ください。たとえば、
google_compute_network
リファレンス ページに示すように、projects/{project}/global/networks/{name}
は VPC ネットワークのリソース ID です。to
: 作成する Terraform のリソース アドレス。通常は RESOURCE TYPE.NAME の形式です。
Virtual Private Cloud ネットワークの import
ブロックの例を次に示します。
import { # Provider-defined resource ID of the cloud resource to be imported id = "projects/PROJECT_ID/global/networks/my-network" # Terraform resource address to be created to = google_compute_network.my_network }
リソース ブロックを手動で作成した場合は、terraform plan
を実行してインポート オペレーションをプレビューします。
Terraform でリソース ブロックを生成する場合は、-generate-config-out
フラグを使用して構成を生成するファイルを指定します。
次に例を示します。
terraform plan -generate-config-out=generated_resources.tf
生成されたコードを確認したら、terraform apply
オペレーションを実行して構成を Terraform の状態にインポートします。
一括エクスポートの後に作成されたリソースをインポートする
一括エクスポートを使用すると、Google Cloud リソースを Terraform 構成としてエクスポートし、それらのリソースの Terraform の状態をインポートして Terraform でデプロイを管理できます。
始める前に
Cloud Shell を準備します。
Cloud Shell を起動し、デプロイ対象のリソースの Terraform コードを生成するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
Cloud Shell で、Config Connector のコマンドライン インターフェース(CLI)をインストールします。
gcloud components install config-connector
Config Connector を使用すると、Google Cloud の Terraform 一括エクスポート ツールを使用できます。
ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation
が表示された場合は、代わりに次のコマンドを実行します。sudo apt-get install google-cloud-sdk-config-connector
Cloud Asset API を有効にします。
gcloud services enable cloudasset.googleapis.com
リソースの Terraform コードを生成する
プロジェクトの構成を出力するディレクトリをまだ作成していない場合は、作成します。
mkdir OUTPUT_DIRECTORY
gcloud beta resource-config bulk-export
コマンドを実行して、プロジェクトの構成全体をパスOUTPUT_DIRECTORY
に出力します。gcloud beta resource-config bulk-export \ --path=OUTPUT_DIRECTORY \ --project=PROJECT_ID \ --resource-format=terraform
生成されたコードから Terraform モジュールを作成する
出力ディレクトリの内容を指定して gcloud beta resource-config terraform
generate-import
コマンドを実行します。
gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY
このコマンドにより、Terraform モジュールとインポート スクリプトが生成されます。
gcloud-export-modules.tf
ファイル。このファイルは、サブリソースのすべてのモジュールを指します。このファイルの内容は次のようになります。provider "google" { project = "PROJECT_ID" } module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall" { source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeFirewall" } module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeBackendService-global" { source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeBackendService/global" }
... このような内容が続きます。
terraform_import_20220331-19-12-33.sh
などの実行可能なシェル スクリプト。シェル スクリプトにはterraform import
コマンドのリストが含まれます。#!/bin/sh # Terraform Import Script generated by gcloud cli terraform import module.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
... このような内容が続きます。
terraform import
コマンドは、generate-import
コマンドで作成したモジュールを Terraform の状態にインポートするためのものです。
モジュールを Terraform の状態にインポートする
次のように初期化します。
terraform init
スクリプトを実行します。
./terraform_import_20220331-19-12-33.sh
出力:
module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1: Importing from ID "projects/PROJECT_ID/zones/us-central1-a/instances/instance-1"... module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1: Import prepared! Prepared google_compute_instance for import module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1: Refreshing state... [id=projects/PROJECT_ID/zones/us-central1-a/instances/instance-1] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.