【GCP】既存プロジェクトをTerraform形式で出力する
この記事では、Google Cloud Shellを利用して、Google Cloudの既存プロジェクトをTerraform形式で出力する手順について共有しています。
普段、個人開発でFirebaseを使っているものの、毎回同じ作業でプロジェクトを作成していることもあり、少々面倒くささを感じています。
今回は既存プロジェクトのリソースをTerraform形式で出力する方法について共有したいと思います。
下準備
Google Cloud Shellは、Google Cloud Platform(GCP)より提供されている、オンラインの開発環境です。ブラウザから直接アクセスでき、さまざまなツールがプリインストールされています。
こちらからコンソールに入り作業していきます。
Config ConnectorのCLIをインストール
通常のgcloud CLI
では、リソースの一括エクスポートができません。まずはConfig ConnectorのCLIを使えるようにしておく必要があります。
Config Connector は、Kubernetes を使用して Google Cloud リソースを管理できるオープンソースの Kubernetes アドオンです。
https://cloud.google.com/config-connector/docs/overview?hl=ja
まず、次のコマンドを実行してConfig Connector CLIをインストールします
gcloud components install config-connector
何らかの理由で上記のコマンドが失敗する場合は、以下のコマンドを使用して、必要なパッケージを直接インストールすることができます
sudo apt-get install google-cloud-sdk-config-connector
Cloud Asset API
Cloud Asset APIは、Google Cloudリソースの情報を取得、分析、エクスポートするためのAPIです。
IAMの設定をするため有効にしておきます。
Cloud Asset API では、プロジェクト レベルまたは組織レベルでアクセス制御を構成できます。 たとえば、プロジェクト内のすべての Cloud Asset Inventory リソースへのアクセス権をデベロッパーのグループに付与することができます。
https://cloud.google.com/asset-inventory/docs/access-control?hl=ja
以下のコマンドを使用して、Cloud Asset APIを有効にします
gcloud services enable cloudasset.googleapis.com
IAMの設定
Firebaseなどでプロジェクトを作成している場合、特定のサービスアカウント(gcp-sa-cloudasset.iam.gserviceaccount.com)が存在しないことがあります。
その場合は以下のコマンドで予め作成しておきましょう。
gcloud beta services identity create --service=cloudasset.googleapis.com --project=YOUR_PROJECT_ID
次に、以下のコマンドで各種権限を付与していきます。
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member=serviceAccount:service-YOUR_PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
--role=roles/servicenetworking.serviceAgent
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member=serviceAccount:service-YOUR_PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
--role=roles/storage.objectAdmin
Terraform形式で出力
最後に、outputsディレクトリを作成しTerraform形式でリソースを出力していきます。
以下のコマンドで出力用のディレクトリを作成します
mkdir outputs
次に、以下のコマンドでリソースを出力します
gcloud beta resource-config bulk-export \
--path=./outputs \
--project=YOUR_PROJECT_ID \
--resource-format=terraform
以上です。ここからterragruntで使えるように整形する予定なので、機会があれば共有してみようと思います。