はじめに
terraformコード管理のGoogle Cloud環境において、コンソール上で手動構築したリソース、新たにterraformコード管理になったプロジェクトなどなど
既存リソースのTerraformコード化を手間に感じたことはありませんか?
「一からコードを書いてimportするのは大変。。」そこで、
Google Cloud Export機能による、構築済みリソースのTerraformコードを取得する方法をご紹介します。
前提条件
- Cloud Shellを使用します
- roles/serviceusage.serviceUsageConsumerが操作アカウントに付与されていること
- gcloudコマンドラインツールを利用できること
事前準備
以降はCloud Shellで実行します。
1,プロジェクトの設定
以下のコマンドで、Terraform コードを生成するデフォルトの Google Cloud プロジェクトを設定します。
$ export GOOGLE_CLOUD_PROJECT=PROJECT_ID
2,Config Connector のコマンドライン インターフェース(CLI)をインストール
以下のコマンドで、Terraform 一括エクスポート ツールを使用できます。
$ gcloud components install config-connector
「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
3,Cloud Asset API の有効
以下のコマンドで、APIを有効にします。
$ gcloud services enable cloudasset.googleapis.com
(以下のコマンドで、有効化されているAPI一覧を表示できます。)
$ gcloud services list --enabled
4,サービス アカウントの作成
以下のコマンドで、サービスアカウントを作成します。
$ gcloud beta services identity create --service=cloudasset.googleapis.com
(以下のサービスアカウントが作成されます。)
service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
5,権限の確認
以下権限(ロール)がサービスアカウントへ付与されてあることを確認してください。
- roles/servicenetworking.serviceAgent
- roles/storage.objectAdmin
以下コマンドで、権限(ロール)を確認できます。
$ gcloud projects get-iam-policy PROJECT_ID --flatten="bindings[].members" \
--filter="bindings.members:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com" \
--format='value(bindings.role)'
付与されていない場合、以下コマンドで付与できます。
$ 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コードをエクスポート
1,出力するディレクトリの作成
以下コマンドで、ディレクトリを作成します。
エクスポートを複数回実行する予定の場合は日付で作成すると良いかもです。
$ mkdir OUTPUT_DIRECTORY
2,terraformコードをエクスポート
以下コマンドで、プロジェクトの構成全体をディレクトリにエクスポートします。
OUTPUT_DIRECTORYには作成したディレクトリpathを入力してください。
実行から完了まで少し時間がかかります。リソース量にもよりますが、私の場合5分ほどかかりました。
$ gcloud beta resource-config bulk-export \
--path=OUTPUT_DIRECTORY \
--project=PROJECT_ID \
--resource-format=terraform
各リソースの Terraform コードが、4つディレクトリ構造内の別々の .tf ファイルに出力されます。
該当の.tf ファイルを探して、コードを確認してみてください。
OUTPUT_DIRECTORY
├── PROJECT_location_number
└── Project #projectコードのtfファイルが格納
├── PROJECT_number
└── Service #Service(API)コードの各tfファイルが格納
├── PROJECT_id
└── Disk #Compute Diskリソースの各tfファイルが格納
└── Example1 #各Serviceで構築したリソースの各tfファイルが格納
└── Example2 #各Serviceで構築したリソースの各tfファイルが格納
├── projects
└── PROJECT_number #各Serviceで構築したリソースの各tfファイルが格納
└── PROJECT_id #各Serviceで構築したリソースの各tfファイルが格納
単一のリソースタイプをエクスポート
RESOURCE_TYPEをComputeInstance などの文字列を使用して、特定のリソースタイプでエクスポートもできます。
$ gcloud beta resource-config bulk-export \
--resource-types=RESOURCE_TYPE \
--project=PROJECT_ID \
--resource-format=terraform
複数のリソースタイプをエクスポート
複数のリソースタイプでエクスポートもできます。
$ gcloud beta resource-config bulk-export \
--resource-types=ComputeFirewall,ComputeInstance \
--project=PROJECT_ID \
--resource-format=terraform
まとめ
本ブログでは、「Google Cloud Export」機能を活用して、Google Cloud既存リソースのterraformコード取得方法についてご紹介しました。
大量のリソースのコード化をする場合、まずコードの生成が必要になります。本ブログ内容を活用することで一から手動コーディングすることがなくなるので工数の削減に繋がると思います。
ですが、エクスポートしたコードは変数を一切使われていない状態で生成されますので煩雑に感じるかもしれません。tflintなどコーディングルールが決められている場合は見直しと修正が必要になるかと思います。そちらの工数を削減できないことが残念ですが、次回はそれを改善できるツールやAIをご紹介できればと思います。
Google Cloud、Google Workspace に関するご相談はXIMIXへ!
Google Cloud、Google Workspaceに関する お問い合わせはこちら
XIMIX(サイミクス)は商標登録出願中です
- カテゴリ:
- クラウド
- キーワード:
- Google Cloud