2020-05-08

5/8

terraformerをGCPで使ってみた

GCPでdefault networkをimportしたいと思った。
ふつうに terraform import を使えばいいのだが、terraformerのことを思い出したので、使ってみることにした。
terraformerを使えばHCLファイルを生成することができる。

terraformerについての一般的な内容はterraformerにメモしている。

作業環境: macOS

Install:

brew install terraformer

準備として、 ~/.terraform.d/plugins/darwin_amd64/terraform-provider-google_v3.20.0_x5 を置く。
今回はterraform実行ディレクトリの .terraform/plugins からコピーした。

terraformer import google --projects=my-project \
  --regions=asia-northeast1 --resources=networks,subnetworks

結果:

% tree generated
generated
└── google
    └── my-project
        ├── networks
        │   └── asia-northeast1
        │       ├── compute_network.tf
        │       ├── outputs.tf
        │       ├── provider.tf
        │       └── terraform.tfstate
        └── subnetworks
            └── asia-northeast1
                ├── compute_subnetwork.tf
                ├── outputs.tf
                ├── provider.tf
                ├── terraform.tfstate
                └── variables.tf

6 directories, 9 files

tfファイルのサンプル:

% cat generated/google/my-project/networks/asia-northeast1/compute_network.tf
resource "google_compute_network" "tfer--default" {
  auto_create_subnetworks         = "true"
  delete_default_routes_on_create = "false"
  description                     = "Default network for the project"
  name                            = "default"
  project                         = "my-project"
  routing_mode                    = "REGIONAL"
}

tfstateのサンプル:

% cat generated/google/my-project/subnetworks/asia-northeast1/terraform.tfstate
{
    "version": 3,
    "terraform_version": "0.12.18",
    "serial": 1,
    "lineage": "XXXXXXXXXXXX",
    "modules": [
        {
            "path": [
                "root"
            ],
            "outputs": {
                "google_compute_subnetwork_tfer--default_self_link": {
                    "sensitive": false,
                    "type": "string",
                    "value": "https://www.googleapis.com/compute/v1/projects/my-project/regions/asia-northeast1/subnetworks/default"
                }
            },
            "resources": {
                "google_compute_subnetwork.tfer--default": {
                    "type": "google_compute_subnetwork",
                    "depends_on": [],
                    "primary": {
                        "id": "default",
                        "attributes": {
                            "creation_timestamp": "2020-05-07T02:07:01.455-07:00",
                            "description": "",
                            "gateway_address": "10.146.0.1",
                            "id": "default",
                            "ip_cidr_range": "10.146.0.0/20",
                            "log_config.#": "0",
                            "name": "default",
                            :

terraform_version がマシンにインストール済みのバージョンと違うのは、terraformerが同梱しているってことなのかな?

KubernetesのマニフェストをVCSで管理して、削除まで正しく同期する方法

※5/9 ブログを書いた: Kubernetesのマニフェストをリポジトリ管理しつつ、リソースの削除も反映したい件 - progrhyme’s tech blog

某所で聞いたりして情報を集めた。
このエントリは後掲の関連リンクの続きである。

  1. 管理対象のリソースに label でバージョン番号を振り、新しいバージョンのリソースを配置した後、古いバージョンのリソースを削除する
  2. kubectl apply 時に --prune オプションを付ける
  3. Argo CDのAutomatic Pruning機能を使う
  4. リソースをTerraformで管理する

関連: