Google Cloud リソースを Terraform 形式にエクスポートする

Google Cloud にリソースをデプロイしたら、Terraform を使用して Infrastructure as Code(IaC)を管理する必要があります。Google では、プロジェクト、フォルダ、組織内のリソースの 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
    
  • Cloud Asset サービス エージェントgcp-sa-cloudasset.iam.gserviceaccount.com)に roles/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
    
  • Cloud Asset サービス エージェントgcp-sa-cloudasset.iam.gserviceaccount.com)に roles/storage.objectAdmin ロールがあることを確認します。

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

制限事項

一部のリソースタイプは、Terraform Google プロバイダでサポートされていますが、Terraform 形式へのエクスポートではサポートされていません。Terraform 形式へのエクスポートでサポートされているリソースタイプを一覧表示するには、gcloud beta resource-config list-resource-types コマンドを実行します。

プロジェクト構成全体を Terraform HCL コードにエクスポートする

gcloud beta resource-config bulk-export --resource-format=terraform コマンドは、プロジェクト、フォルダ、または組織に構成されているリソースをエクスポートし、HCL コード形式で画面に出力します。

gcloud beta resource-config bulk-export \
  --project=PROJECT_ID \
  --resource-format=terraform

出力をディレクトリ構造に書き込む

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

    mkdir OUTPUT_DIRECTORY
    
  2. プロジェクトの構成全体をディレクトリにエクスポートします。

    gcloud beta resource-config bulk-export \
     --path=OUTPUT_DIRECTORY \
     --project=PROJECT_ID \
     --resource-format=terraform
    

    --path フラグには、HCL コードの出力先を指定します。

コマンドを実行すると、各リソースの HCL コードが、次のディレクトリ構造内の別々の .tf ファイルに出力されます。

OUTPUT_DIRECTORY/projects/PROJECT_ID/RESOURCE_TYPE

出力を 1 つのファイルに書き込む

出力を画面に表示しない場合や、個別の .tf ファイルを作成しない場合は、次の例に示すように、すべての出力を 1 つのファイルに書き込むことができます。

gcloud beta resource-config bulk-export --resource-format=terraform >> gcp_resources.tf

出力をフィルタリングする

一括エクスポート コマンドの出力をフィルタリングするには、リソースタイプを指定します。

フィルタリングするサポート対象のリソースタイプを一覧表示する

Terraform 形式へのエクスポートでサポートされているリソースタイプを一覧表示するには、gcloud beta resource-config list-resource-types コマンドを実行します。

gcloud beta resource-config list-resource-types

必要であれば、出力をファイルに書き込みます。

gcloud beta resource-config list-resource-types >> strings.txt

出力では、Compute Engine VM のリソースタイプが次のように表示されます。

KRM KIND: ComputeInstance

KRM KIND: 接頭辞は無視できます。

単一のリソースタイプをエクスポートする

ComputeInstance などの文字列を使用して、プロジェクトの特定のリソースタイプを HCL コード形式でエクスポートします。

gcloud beta resource-config bulk-export \
  --resource-types=RESOURCE_TYPE \
  --project=PROJECT_ID \
  --resource-format=terraform

--resource-types フラグには、出力するリソースタイプを指定します。

複数のリソースタイプをエクスポートする

VM インスタンスとファイアウォール ルールを HCL コード形式でエクスポートします。

gcloud beta resource-config bulk-export \
  --resource-types=ComputeFirewall,ComputeInstance \
  --project=PROJECT_ID \
  --resource-format=terraform

エクスポートするリソースタイプをファイルに指定する

  1. tf-output という名前のディレクトリを作成します。

    cd && mkdir tf-output && cd tf-output
    
  2. types.txt という名前のファイルを作成し、リソースタイプのリストを追加します。次に例を示します。

    ComputeBackendBucket
    ComputeBackendService
    ComputeForwardingRule
    
  3. --resource-types-file フラグを指定して gcloud beta resource-config bulk-export コマンドを実行します。

    gcloud beta resource-config bulk-export \
     --resource-types-file=types.txt \
     --path=tf-output \
     --project=PROJECT_ID \
     --resource-format=terraform
    

指定したリソースタイプがプロジェクトに含まれていない場合、コマンドは成功しますが、そのリソースタイプに関する出力はありません。

トラブルシューティング

次のエラーが表示された場合:

「Permission denied during export.Please ensure the Cloud Asset Inventory API is enabled.」

始める前にの手順に沿って作業を進めてください。

次のステップ