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