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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

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

リソースを手動でインポートする

Terraform では、terraform import サブコマンドを使用してリソースをインポートできます。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 です。

  • google_storage_bucket リソースについては、プロバイダのインポートのドキュメントでリソース ID の形式を確認してください。この場合、project/name の形式であるため、前のサンプルのリソース ID は sample-project/my-bucket になります。

  • リソース アドレスと ID を terraform import google_storage_bucket.sample sample-project/my-bucket として使用して import ステートメントを作成して、実行します。

    出力:

    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 としてインポートする必要があるリソース アドレスを特定できます。

  • google_storage_bucket リソースについては、プロバイダのインポートのドキュメントでリソース ID の形式を確認してください。この場合、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 を terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket として使用して import ステートメントを作成して、実行します。

    出力:

    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.
    

一括エクスポートを使用して作成されるリソースをインポートする

Google では、Google Cloud リソースを Terraform 構成としてエクスポートし、それらのリソースの Terraform の状態をインポートして Terraform でデプロイを管理できるツールを提供しています。

始める前に

  • Config Connector の gcloud CLI をインストールします。

    gcloud components install config-connector
    

    Config Connector を使用すると、Google Cloud の Terraform 一括エクスポート ツールを使用できます。

  • Cloud Asset API を有効にします。

    gcloud services enable cloudasset.googleapis.com
    
  • Cloud Asset サービス エージェント gcp-sa-cloudasset.iam.gserviceaccount.comroles/servicenetworking.serviceAgent ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    

リソースの Terraform コードを生成する

gcloud beta resource-config bulk-export コマンドを実行して、プロジェクトの構成全体をパス entire-tf-output に出力します。

gcloud beta resource-config bulk-export \
  --path=entire-tf-output \
  --project=PROJECT_ID \
  --resource-format=terraform

生成されたコードから Terraform モジュールを作成する

出力ディレクトリの内容を指定して gcloud beta resource-config terraform generate-import コマンドを実行します。

gcloud beta resource-config terraform generate-import entire-tf-output

このコマンドにより、Terraform モジュールとインポート スクリプトが生成されます。

  • gcloud-export-modules.tf ファイル。このファイルは、サブリソースのすべてのモジュールを指します。このファイルの内容は次のようになります。

    provider "google" {
    project = "PROJECT_ID"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeFirewall" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeBackendService-global" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeBackendService/global"
    }
    
    ...and so on
    
  • terraform_import_20220331-19-12-33.sh などの実行可能なシェル スクリプト。シェル スクリプトには terraform import コマンドのリストが含まれます。

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.entire-tf-output-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    
    ...and so on
    

    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.
    

次のステップ