Google Cloud リソースを Terraform 状態にインポートする

Terraform は既存のインフラストラクチャをインポートできます。インポートすると、他の方法で作成したリソースを Terraform の管理下に置くことができます。

どのような状態の Google Cloud リソースでもインポートできます。

Terraform では次の方法でリソースをインポートできます。

リソースをひとつずつインポートする

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 コードを生成する

  1. プロジェクトの構成を出力するディレクトリをまだ作成していない場合は、作成します。

    mkdir OUTPUT_DIRECTORY
    
  2. 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 の状態にインポートする

  1. 次のように初期化します。

    terraform init
    
  2. スクリプトを実行します。

    ./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.
    

次のステップ