それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

Terraform + GCP をもう少しやってみる #3

前回と前々回の続き

VPCネットワークとサブネット

VPCネットワークとサブネットのモジュールを作成をしてみた。 ドキュメントで下記を参照

resource "google_compute_network" "default-vpc-network" {
  name = "${terraform.workspace}-networks"
  auto_create_subnetworks = "false"
  routing_mode = "REGIONAL"
}

resource "google_compute_subnetwork" "default-subnetwork" {
  name          = "${terraform.workspace}-network"
  ip_cidr_range = "192.168.2.0/24"
  network       = "${google_compute_network.default-vpc-network.self_link}"
  region        = "asia-northeast1"
}

作成したネットワークを output.tf で他のモジュールで使えるようにし、インスタンス・テンプレートに適用した。 カスタムネットワークの場合は network ではなく、subnetwork で渡す必要があった。

output "asia-northeast1-network" {
    value = "${google_compute_network.default-vpc-network.self_link}"
}
resource "google_compute_instance_template" "instance_template" {
  ...
   network_interface {
    #network = "default"
    subnetwork = "${var.vpc_network}"     #<-カスタム・ネットワークの場合は subnetwork で指定しろと怒られた
  }
  ...
}

ファイアウォールルール

上記で作成したネットワークはカスタムで、GCPでプロジェクトを作成した際の "Default (Auto)" と違い、既定のファイアウォール・ルールが存在しない。なので別途作成する。 また既定のルールと名前が重複できないので頭に prefix つけてみた。

resource "google_compute_firewall" "default-allow-ssh" {
  name    = "${var.prefix}-allow-ssh"
  network = "${var.vpc_network}"

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = "${var.allow_ip_list}"

  target_tags = ["${var.prefix}-allow-ssh"]
}

http, https のポートをファイアウォールで制限する場合には ヘルスチェックのIP許可 に注意がいる。

HTTPS Proxy

とりあえずオレオレ証明書を作る

$ openssl req -new -x509 -sha256 -days 365 -nodes -out certificate.crt -keyout private.key
  #->質問に答える。 エンター連打でも良いけど Common Name は入れよう。

で、次をやろうと思ったけど・・・

  • HTTP/HTTPS を別々の負荷分散として設定することは出来た
  • 1つの google_compute_url_map に HTTP/HTTPS 両方のバックエンドを適用する方法がわからない。

というところでつまずいた(´Д⊂ヽ GitHub 見たり検索したけど、そもそも出来なさそう?? 仕方がないので HTTPS Proxy のみで設定を書き直し。 で、terraform plan, terraform apply で適用、実際にブラウザで見れることを確認した。

resource "google_compute_target_https_proxy" "compute_target_https_proxy" {
  name              = "${var.https_proxy_name}"
  url_map           = "${google_compute_url_map.compute_url_map.self_link}"
  ssl_certificates  = ["${google_compute_ssl_certificate.default.self_link}"]
}

resource "google_compute_ssl_certificate" "default" {
  name        = "${var.https_proxy_name}-certificate"
  private_key = "${file("private.key")}"
  certificate = "${file("certificate.crt")}"
}

...

resource "google_compute_global_forwarding_rule" "https_glocal_forwarding_rule" {
  name       = "${var.fowarding-rule}"
  target     = "${google_compute_target_https_proxy.compute_target_https_proxy.self_link}"
  port_range = "443"
}

その他

この段階で・・・

  • (Packer + Ansible を利用したイメージの作成)
  • VPCネットワークとサブネットの作成
  • ファイアウォール・ルールの作成
  • イメージからインスタンス・テンプレートの作成
  • インスタンス・テンプレートから、インスタンス・グループの作成
  • HTTP Proxy の作成 (HTTPSと別の負荷分散としての設定)
  • HTTPS Proxy の作成 (HTTPと〜〃)
  • CloudSQL の作成 (HA構成)

まで出来た。 ただ小規模なら無理にモジュール化するよりも、シンプルに main.tf, variable.tf だけで作ってしまったほうがぶっちゃけ楽な気がしなくもない(;´∀`)

次にやること

  • Terraform
    • ベストプラクティスTerraform Module RegistoryHashiCorp BestPractice に沿った構成・変数使うように修正
    • dev, std, prod で分ける #<-GCPだとプロジェクト毎に分けられるんだけど、この辺アプリ屋さんにも話を聞かないとわからない。
    • 新規VPCの作成からやる
      • ネットワークセグメントの設定
      • ファイアウォールルールの作成 (Health Check ほか)
    • HTTPS Proxy対応、証明書の更新とか
    • 整理してから GitHub に上げる
  • 非マネージドなインスタンス・グループの構成
  • その他 Terrafrom / GCP設定の追加・連携
    • Ansible 含む (SendGridの設定とかも)
  • Git, CI/CD と連携したコンテンツの配信・更新
  • Angular の講座の続き
  • PyQ の続き

ざっくりメモしただけなので、あとで適宜追記修正すると思う(;^ω^)

以上