🕌

TerraformでGCPのLoadBalancerを立ててみた

2021/05/09に公開

検証環境

macOS Bigsur
terraform 0.15.3.
Google Cloud SDK 321.0.0

試すこと

googleが提供しているLBとcloud runの環境をterraformで整える以下の記事を土台にしてcloud runを二台建てて指定したkeyリストのHeaderのみ別のにプロキシする.
https://cloud.google.com/blog/ja/products/serverless/serverless-load-balancing-terraform-hard-way

全体のコード

全体のコードはこちら
https://github.com/harukitosa/external-lb/tree/main

やってみる

上の記事の完成の状態からもう一台、cloud_runをgcr.io/cloudrun/helloイメージを使用して立てる.

# default2
resource "google_cloud_run_service" "default2" {
  name     = var.cloud_run_service2
  location = var.region
  project  = var.project_id

  template {
    spec {
      containers {
        image = "gcr.io/cloudrun/hello"
      }
    }
  }
}

リクエストを振り分けているurl_mapを記述していく.
priorityは同一の値を取ると怒られるのでterraformのvariablesのlistを使用してindexを割り振るようにしました.

match_rulesは全ての条件が当てはまったらserviceで指定したbackendサービスにリクエストを割り当てる.

route_rulesをdynamicで定義しvariablesに指定したkeysの数分複製する.

resource "google_compute_url_map" "default" {
  name            = "${var.name}-urlmap"
  default_service = google_compute_backend_service.default.id

  host_rule {
    hosts        = ["*"]
    path_matcher = "default"
  }

  path_matcher {
    name            = "default"
    default_service = google_compute_backend_service.default.self_link

    dynamic "route_rules" {
      for_each = var.keys
      content {
        priority = 1 + index(var.keys, route_rules.value) 
        service  = google_compute_backend_service.default2.id
        match_rules {
          header_matches {
            header_name = "X-ABTEST"
            exact_match = route_rules.value
          }
        }
      }
    }
  }
}

varablesでkeysを指定することにより割り振り先を変えるHeaderの値を指定する.

vars.tfvars

keys = [
  "hello",
  "world",
  "hoge",
]

ローカル上で

terraform plan -var-file=vars.tfvars
terraform apply -var-file=vars.tfvars

で反映させて

curl -H 'X-ABTEST:hello' http://ip_addr

curlでHeaderに値を打ち込んでリクエストを送ってみると割り振られていることが確認できる.
簡単なABテストなどに使用できそう

全体としてすこし複雑なような気がするのでより良い改善案をさがしたい.

Discussion