こんにちは。SCSKの森戸です。
初の投稿です。皆様温かい目でご覧いただけると幸いです。
初回は「Google CloudリソースのTerraform形式へのエクスポート方法」について紹介します。
コンソール画面から手動で構築した環境をTerraformの設定ファイルにエクスポートしてみたいと思います。
Terraformとは

Terraformは、HashiCorp社が提供する Infrastructure as Code(IaC) ツールです。Infrastructure as Codeとは、サーバーやネットワーク、データベースなどのクラウドリソースをコードで定義し、自動的に構築・管理する考え方です。
従来はGoogle Cloudコンソールを操作してリソースを作成していましたが、Terraformを利用すると設定内容をコードとして管理できます。そのため、同じ環境を何度でも再現でき、手作業による設定ミスを防ぐことができます。
Terraformでは、「どのような環境を作りたいか」という最終状態をコードで記述します。そのコードをもとにTerraformがGoogle Cloud APIを実行し、必要なリソースの作成や更新を自動で行います。
利用するメリット
Terraformを利用するメリットは主に以下の点があります。
- インフラ構成をコードで管理できる
- 開発環境、検証環境、本番環境を同じ構成で作成できる
- 設定変更の履歴をGitなどで管理できる
- 手作業による設定ミスを削減できる
- 構築作業を自動化できる
基本的な流れ
Terraformは主に以下の流れで利用します。
.tfファイルに作りたいリソースなどを記述するterraform initでTerraformの実行環境を準備するterraform planで変更内容を確認するterraform applyで実際にリソースを作成する- Terraformで状態ファイル(State)を管理する
Terraform形式へのエクスポートとは
Terraform形式へのエクスポートとは、Google Cloud上に存在するリソース構成をTerraformの設定ファイル(.tf)として出力する機能です。これにより、コンソール画面から手動で構築した環境をコードとして管理できるようになります。
例えば、VPCやCompute Engine、Cloud Storageなどの既存リソースが存在する場合、それらの設定情報をTerraform形式で出力できます。そのため、運用中の環境をTerraform管理へ移行する際に、一からコードを書き直す手間を削減できます。
エクスポートするメリット
Terraformへエクスポートするメリットは主に以下の点があります。
- 既存環境のTerraform管理への移行が容易にできる
- Infrastructure as Code(IaC)導入の第一歩として利用できる
エクスポートの基本的な流れ
Terraform形式へのエクスポートは主に以下の流れで利用します。
- Config Connector CLIのインストール
- Cloud Asset APIによるリソース情報取得の準備
- Terraformへのエクスポートを実行
- 必要に応じてTerraform管理へ移行
実践:Terraformを利用したGoogle Cloudリソースのエクスポート
ここでは、実際にGoogle Cloudを使用して、VPCネットワーク内に作成したCompute Engine、Cloud StorageをTerraform形式(.tf)へのエクスポートを実際にやってみます。
Google Cloud上へのリソース作成
今回はTerraform形式へのエクスポートを確認することが目的のため、各リソースはできるだけ低スペックかつ低コストな設定で作成しました。以下がコンソールを用いて、作成したリソースの一覧です。
| リソース | 用途 | 主な設定 |
|---|---|---|
| VPC | ネットワーク環境の作成 | asia-northeast1(東京)/ asia-northeast1-a |
| Cloud Storage | オブジェクトストレージ | asia-northeast1 |
| Compute Engine | 仮想マシン | e2-meduim / asia-northeast1-a |
Cloud Shellの起動と事前設定
・Cloud Shellを起動する
・プロジェクトを設定する(どのプロジェクトのリソースをTerraformコードに変換するか?)
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
・出力先ディレクトリを作成する
mkdir OUTPUT_DIRECTORY
PROJECT_ID ⇒ scsksdv-dev-jisu1
OUTPUT_DIRECTORY ⇒ test-output-directory
Config Connector CLIのインストール
Terraform形式へのエクスポートの最大のメリットは、コンソールから作成したリソース構成をTerraformコードとして出力できる点です。Config Connectorは、そのコード生成を支える重要なコンポーネントとなっています。
※Config ConnectorにはKubernetesからGoogle Cloudリソースを管理する機能もありますが、本記事ではTerraform形式へのエクスポートで利用するCLI機能を対象としています。
gcloud components install config-connector
※Cloud Shell環境ではgcloud componets install config-connector が利用できないため、APTパッケージとして google-cloud-cli-config-connector をインストールしました。
Cloud Asset APIによるリソース情報取得の準備
・Cloud Asset APIを有効化する
Terraformへのエクスポートでは、まずプロジェクト内のリソースを調査し、その設定情報を取得したうえでTerraformコードを生成します。
Cloud Asset APIは、Google Cloudプロジェクト内に存在するリソース情報を取得するためのAPIです。「リソースの調査・情報取得」を行うためにCloud Asset APIが利用されます。
gcloud services enable cloudasset.googleapis.com
・Cloud Asset APIが動くためのサービスアカウントを作る
Cloud Asset APIがGoogle Cloudリソースの情報を取得できるようにするためのサービスアカウントを作成します。Terraform形式へのエクスポートでは、Cloud Asset APIがプロジェクト内のリソースを参照する必要があります。そのため、Cloud Asset API専用のサービスアカウント(サービスエージェント)を作成し、後続の手順で必要な権限を付与します。
gcloud beta services identity create --service=cloudasset.googleapis.com
・サービスエージェントにIAMロールを付与する
Cloud Asset API用のサービスアカウントを作成しただけでは、Google Cloudのリソース情報を取得できません。そのため、Cloud Assetサービスエージェントに必要な以下のIAMロールを付与します。
| IAMロール | 用途 | Terraform Exportでの役割 |
|---|---|---|
roles/servicenetworking.serviceAgent |
Service Networkingに関連する情報へのアクセス権限 | Cloud Asset APIがVPCやService Networkingに関連するリソース情報を取得できるようにする |
roles/storage.objectAdmin |
Cloud Storageオブジェクトの管理権限 | Cloud Asset APIが取得した情報やTerraformコードをCloud Storageへ出力・管理できるようにする |
Service Networkingは、Cloud SQLなどのGoogleマネージドサービスがVPCネットワークと連携する際に利用される仕組みです。Terraform形式へのエクスポートでは、対象プロジェクト内のネットワーク構成も含めてリソース情報を取得するため、この権限が必要になります。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/servicenetworking.serviceAgent
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/storage.objectAdmin
Terraformへのエクスポート実行
ここまでの準備が完了したら、いよいよTerraform形式へのエクスポートを実行します。Terraformへのエクスポート実行には以下に示す2つの実行方法があります。
①プロジェクト構成全体をTerraform HCLコードにエクスポートする
②任意のリソースタイプをTerraform HCLコードにエクスポートする
③リストファイルを用いてTerraform HCLコードにエクスポートする
プロジェクト構成全体をTerraform HCLコードにエクスポートする
プロジェクトの構成全体をディレクトリにエクスポートします。
gcloud beta resource-config bulk-export \ --path=OUTPUT_DIRECTORY \ --project=PROJECT_ID \ --resource-format=terraform
画像のように作成したリソースすべてがディレクトリ(test-output-directory)にエクスポートされたことが確認できました。加えて、gcloud beta resource-config bulk-export による一括エクスポートでは、自身で作成したリソースだけでなく、プロジェクト内に存在する関連リソースも出力されるため、注意が必要です。
また、catコマンドでエクスポートされたVMインスタンス(test-instance-morito)を確認すると、Terraform形式でコードが記載されていることが確認できます。
任意のリソースタイプをTerraform HCLコードにエクスポートする
Terraform形式へのエクスポートは、プロジェクト全体だけでなく特定のリソースタイプに限定して実行することもできます。大規模なプロジェクトでは数百〜数千のリソースが存在することがあるため、必要なリソースだけをエクスポートしたい場合に便利です。
今回は、ComputeInstanceとStorageBucketの2種類のリソースをエクスポートしてみたいと思います。
gcloud beta resource-config bulk-export \
--path=OUTPUT_DIRECTORY \
--resource-types=<RESOURCE_NAME>,<RESOURCE_NAME>… \
--project=PROJECT_ID \
--resource-format=terraform
画像のように作成したリソースの中で指定したComputeInstanceとStorageBucketだけが、エクスポートされたことが確認できました。
※一部のリソースタイプは、Terraform Googleプロバイダでサポートされていますが、Terraform形式へのエクスポートではサポートされていません。Terraform形式へのエクスポートでサポートされているリソースタイプを一覧表示するには、以下のコマンドを実行します。
gcloud beta resource-config list-resource-types
リストファイルを用いてTerraform HCLコードにエクスポートする
Terraform形式へのエクスポートでは、リストファイルで指定したリソースのみを出力することもできます。これは、大規模なプロジェクトの一部だけをTerraform管理したい場合に便利な機能です。
例えば、本番環境に多数のリソースが存在する場合、プロジェクト全体をエクスポートすると大量のTerraformファイルが生成されます。そのような場合に、対象リソースのみをリストファイルへ記載することで、必要な構成だけをTerraformコードとして出力できます。
今回は、リストファイルにリソースタイプのリスト(ComputeInstance, StorageBucket)を追加し、エクスポートしてみたいと思います。
・リストファイルを作成し、リソースタイプのリストを追加する
nano TYPES_FILE.txt <RESOURCE_NAME_1> <RESOURCE_NAME_2> ...
・--resource-types-file フラグを指定して以下のコマンドを実行する
gcloud beta resource-config bulk-export \
--resource-types-file=TYPES_FILE.txt \
--path=OUTPUT_DIRECTORY \
--project=PROJECT_ID \
--resource-format=terraform
TYPES_FILE.txt ⇒ test-resource-list.txt
画像のように作成したリソースの中でリストファイルに指定したComputeInstanceとStorageBucketだけがtf形式にエクスポートされたことが確認できました。
※指定したリソースタイプがプロジェクトに含まれていない場合、エラーではなく、コマンドは成功しますが、そのリソースタイプに関する出力はありません。
必要に応じてTerraform管理へ移行
ここまでは、Google Cloud上のリソースをTerraform形式(HCL)としてエクスポートし、生成されたコードを確認を行うことを実施しました。Terraform形式へ変換しただけでは、Terraformがそのリソースを管理しているわけではありません。Terraform管理へ移行するためには、Terraformの状態ファイル(State)へ既存リソースを取り込む必要があります。
・エクスポートしたディレクトリへ移動し、生成されたファイル(.tf)を確認する
・Terraformを初期化する(terraform init)
Terraformの実行環境を初期化するためのコマンドです。Terraform設定ファイルを解析し、Google Cloudと連携するためのGoogle Providerや必要なモジュールをダウンロードします。
Terraform形式へのエクスポートで生成された .tf ファイルが存在していても、そのままではTerraformは実行できません。terraform init を実行することで、Terraformで構成管理を行うための準備が完了します。
・Terraform Stateへ既存リソースを登録する
terraform import \ <TERRAFORM_RESOURCE_NAME> \ <RESOURCE_ID>
・Stateファイル作成を確認する(terraform state list)
stateファイルが作成されていれば、成功です。
・差分を確認する(terraform plan)
理想的な状態では、以下のように表示されます。
No changes.
画像では、VPCをTerraform管理に移行してみました。差分がなく、stateファイルが作成されていることが確認できます。一方で、画像には載せていませんが、Compute EngineとCloud Storageに差分が検出されました。これは Import の失敗ではなく、エクスポートにより生成された構成と実際のGoogle Cloudリソースの状態が完全一致していなかったためだと考えられます。Google Cloud が自動付与するラベルや内部的な設定値が差分として検出される場合があるようです。
まとめ
今回は、コンソールで作成したGoogle CloudリソースをTerraform形式へエクスポートしてみました。
参考URL












