尝试使用Google Cloud的Terraform导出功能
首先
- gcloudコマンドで実機からterraformコードを生成する機能がPreviewで利用可能になっているため試してみました
尝试使用
生成terraform代码
预先准备
在该项目中启用Cloud Asset Inventory API。
- 複数プロジェクトを利用している場合、gcloud config set project ${PROJECT_ID} で設定したプロジェクトで有効化されていれば出力対象のプロジェクトで有効化する必要はありません
输出代码
请在${output_path}中设置要输出的文件夹路径,${project_id}中设置要生成terraform代码的项目ID。
% gcloud beta resource-config bulk-export --project=${project_id} --resource-format=terraform --path=${output_path}
Exporting resource configurations to [./]...done.
Exported 206 resource configuration(s) to [./].
当涉及到206种资源配置时,大约需要7分钟完成输出。
通过将项目(–project)更改为文件夹(–folder)或组织(–organization),也可以按文件夹或组织单位进行输出。
确认一下产出
以下是tf文件按照资源类型、地域和区域分文件夹进行分类并生成的状态
※输出内容会根据创建的资源而有所变化
-
- ディレクトリ構成
- ※プロジェクトID/プロジェクト番号/フォルダ番号は編集しています
% tree -d
.
├── ${PROJECT_NUMBER}
│ ├── ${PROJECT_NUMBER}
│ │ └── Project
│ │ └── LoggingLogSink
│ └── Service
├── ${FOLDER_NUMBER}
│ └── Project
├── projects
│ ├── ${PROJECT_NUMBER}
│ │ └── SecretManagerSecret
│ └── ${PROJECT_ID}
│ ├── ArtifactRegistryRepository
│ │ ├── asia
│ │ └── asia-northeast1
│ ├── BigQueryTable
│ ├── ComputeAddress
│ │ ├── asia-northeast1
│ │ └── global
│ ├── ComputeBackendBucket
│ ├── ComputeBackendService
│ │ └── global
│ ├── ComputeFirewall
│ ├── ComputeForwardingRule
│ │ └── global
│ ├── ComputeHealthCheck
│ │ └── global
│ ├── ComputeInstance
│ │ ├── asia-northeast1-a
│ │ └── asia-northeast1-b
│ ├── ComputeInstanceGroup
│ │ └── asia-northeast1-a
│ ├── ComputeInstanceTemplate
│ │ └── asia-northeast1
│ ├── ComputeNetwork
│ ├── ComputeNetworkEndpointGroup
│ │ └── asia-northeast1-a
│ ├── ComputeRoute
│ ├── ComputeRouter
│ │ └── asia-northeast1
│ ├── ComputeSSLCertificate
│ │ └── global
│ ├── ComputeSecurityPolicy
│ ├── ComputeSubnetwork
│ │ └── asia-northeast1
│ ├── ComputeTargetHTTPProxy
│ │ └── global
│ ├── ComputeTargetHTTPSProxy
│ │ └── global
│ ├── ComputeURLMap
│ │ └── global
│ ├── ContainerCluster
│ │ ├── asia-northeast1-a
│ │ └── tmp-cluster
│ │ └── ContainerNodePool
│ │ └── asia-northeast1-a
│ ├── DNSManagedZone
│ ├── IAMServiceAccount
│ ├── KMSKeyRing
│ │ ├── asia-northeast1
│ │ └── locations
│ │ └── asia-northeast1
│ │ └── keyRings
│ │ └── tmp
│ │ └── KMSCryptoKey
│ ├── MonitoringAlertPolicy
│ ├── PubSubSubscription
│ ├── PubSubTopic
│ ├── SQLInstance
│ │ └── asia-northeast1
│ └── StorageBucket
│ ├── ASIA
│ ├── ASIA-NORTHEAST1
│ └── US
└── ${PROJECT_ID}
├── BigQueryDataset
│ ├── US
│ └── asia-northeast1
└── ComputeDisk
├── asia-northeast1-a
├── asia-northeast1-b
└── asia-northeast1-c
81 directories
-
- ファイルの中身
1リソース1ファイル作成されます
プロジェクトID修正しています
# 例(VPC)
% cat ./projects/${PROJECT_ID}/ComputeNetwork/tmp-vpc.tf
resource "google_compute_network" "tmp_vpc" {
auto_create_subnetworks = false
mtu = 1460
name = "tmp-vpc"
project = "${PROJECT_ID}"
routing_mode = "REGIONAL"
}
# terraform import google_compute_network.tmp_vpc projects/${PROJECT_ID}/global/networks/tmp-vpc
- デフォルト設定ではリソース種別やリージョン・ゾーンごとにtfファイルがフォルダ分けされますが、以下のように1つのtfファイルにまとめて出力することもできます
$ gcloud beta resource-config bulk-export --resource-format=terraform >> gcp_resources.tf
- 個別のリソース(GCEなど)に絞って出力することもできます
# Firewallのみ出力したい場合
$ gcloud beta resource-config bulk-export --resource-types=ComputeFirewall --project=${PROJECT_ID} --resource-format=terraform
# resource-typesは以下のKRM KINDの名前を指定します
% gcloud beta resource-config list-resource-types
┌──────────────────────────────────────┬──────────────┬─────────┬──────┐
│ KRM KIND │ BULK EXPORT? │ EXPORT? │ IAM? │
├──────────────────────────────────────┼──────────────┼─────────┼──────┤
│ AccessContextManagerAccessLevel │ │ │ │
│ AccessContextManagerAccessPolicy │ │ │ x │
│ AccessContextManagerServicePerimeter │ │ │ │
〜中略〜
│ StorageDefaultObjectAccessControl │ │ │ │
│ StorageNotification │ │ │ │
│ StorageTransferJob │ │ │ │
└──────────────────────────────────────┴──────────────┴─────────┴──────┘
# resource-typesは複数指定することもできます
$ gcloud beta resource-config bulk-export --resource-types=ComputeFirewall,ComputeInstance --project=${PROJECT_ID} --resource-format=terraform
# resource-typesはテキストから読み込むこともできます
$ cat types.txt
ComputeFirewall
ComputeInstance
$ gcloud beta resource-config bulk-export --resource-types-file=types.tx --path=tf-output --project=${PROJECT_ID} --resource-format=terraform
创建import命令
- コードを生成しただけではtfstateが空の状態であるため、importを行う必要がありますがこちらもgcloudコマンドで簡単に生成することができます。便利!
% gcloud beta resource-config terraform generate-import --output-script-file=import.sh --output-module-file=modules.tf ${output_path}
Generating import script....done.
Successfully generated
/tmp/import.sh with imports for 199 resources.
Generating terraform modules....done.
-
- 上記のコマンドを実行すると、importコマンドを実行するshell(例の場合、import.sh)とmodules.tfが生成されます
modules.tfを利用すると一括でterraform plan/applyができるようにもなります
如果生成的每个terraform资源上都写着import命令的注释,并且资源数量较少的情况下,您可以直接使用注释中的import命令,无需特意生成。
使用GCS来管理tfstate文件。
-
- 生成したterraformコードではbackendに関しては記載されないため、ローカルにtfstateファイルが保存されます
- 複数人で利用するケースなどではtfstateをリモートで管理したい場合はこちらを参考にGCSでバックエンドを作成することができます
最后
GoogleCloudをIaCで管理する際は、TerraformかDeployment Managerが利用できるため、Terraformを利用している方が多いのではないかと思います
実際にリソースを作成する際はいきなりIaCで記載するよりもConsole上でお試ししてからIaCを記載する流れで実施するケースも多くこのようなケースではコードを記載する時間を大幅に短縮できる便利な機能だと感じました
「類似リソースの作成はcountやfor_eachでやりたい」「リソース名等を変数化したい」といった場合には生成されたコードを修正する必要がありますが1からterraformコードをするよりコーディングが楽にできる印象です
類似機能でConfig Connectorにexportする機能もあるのでこちらも試してみたいと思います
余談ですが、TerraformにはTerraform Associateという資格があり、先日取得しました。こちらの受験記も後日書こうと思います
