目次
grasys加藤です。
今回はTerraformを使ってFirewallルールのIPアドレスを定義する時にキレイに整理できる小ネタです。
それなりにTerraformを使ってきましたが、IPアドレスの列記に不便を感じていたわけですよ、あちこちのルールに同じIPアドレスが出現するわけですから。
なぜ今までIPアドレスを変数定義しなかったのか・・・可読性が大きく異なります。Firewallの指定ミスは場合によってはサービスの存亡がかかってしまう事態にも発展しかねないのです!
Before
一般的なFirewallルールはこのような形式になるかと思います。
resource "google_compute_firewall" "http" {
name = "http"
network = "${google_compute_network.default.name}"
allow {
protocol = "tcp"
ports = ["80", "443"]
}
source_ranges = [
"10.123.0.123/32", # A社
"10.123.0.124/32", # A社
"10.123.0.131/32", # A社
"10.123.0.144/32", # A社
"10.123.0.172/32", # A社大阪支社
"10.123.0.191/32", # A社大阪支社
"10.123.0.201/32", # A社大阪支社
"10.123.0.202/32", # A社大阪支社
"10.146.0.123/32", # C社
"10.146.0.124/32", # C社
"10.146.0.131/32", # C社
"10.146.0.144/32", # C社
"10.146.0.172/32", # C社
"10.146.0.191/32", # C社
"209.85.152.0/22", # lb-google
"209.85.204.0/22", # lb-google
"35.191.0.0/16", # lb-google
]
source_tags = ["web"]
}
上記は例えばHTTPコンテンツの公開用ですが、この他にSSHのルールがあったりしますよね。
SSHはA社大阪支社は許可しないとか。
resource "google_compute_firewall" "ssh" {
name = "ssh"
network = "${google_compute_network.default.name}"
allow {
protocol = "tcp"
ports = ["22"]
}
source_ranges = [
"10.123.0.123/32", # A社
"10.123.0.124/32", # A社
"10.123.0.131/32", # A社
"10.123.0.144/32", # A社
"10.146.0.123/32", # C社
"10.146.0.124/32", # C社
"10.146.0.131/32", # C社
"10.146.0.144/32", # C社
"10.146.0.172/32", # C社
"10.146.0.191/32", # C社
]
source_tags = ["web"]
}
こんなルールがたくさんと並んでいることかと思います。
もちろんプロジェクトによるかと思いますが、Firewallルールの変更が頻繁にあるプロジェクトもありますよね、 開発段階に合わせて開発会社、デバッグ会社が入ってきたり、IPアドレスが変更になったり、 デモをするから特定の会場のIPを数日だけ開放して欲しい。
となると、たくさんのルールを書き換え漏れるわけですよ!!
After
そこでIPアドレスをまとめて定義しておくと、あらスッキリ!
各単位でIPアドレスをまとめて変数に登録してしまいましょう。
variable "ip-A" {
type = "list"
default = [
"10.123.0.123/32", # A社
"10.123.0.124/32", # A社
"10.123.0.131/32", # A社
"10.123.0.144/32", # A社
]
}
variable "ip-A-osaka" {
type = "list"
default = [
"10.123.0.172/32", # A社大阪支社
"10.123.0.191/32", # A社大阪支社
"10.123.0.201/32", # A社大阪支社
"10.123.0.202/32", # A社大阪支社
]
}
variable "ip-C" {
type = "list"
default = [
"10.146.0.123/32", # C社
"10.146.0.124/32", # C社
"10.146.0.131/32", # C社
"10.146.0.144/32", # C社
"10.146.0.172/32", # C社
"10.146.0.191/32", # C社
]
}
variable "ip-lb-google" {
type = "list"
default = [
"209.85.152.0/22", # lb-google
"209.85.204.0/22", # lb-google
"35.191.0.0/16", # lb-google
]
}
変数があればhttpルールはこんなにスッキリ
resource "google_compute_firewall" "http" {
name = "http"
network = "${google_compute_network.default.name}"
allow {
protocol = "tcp"
ports = ["80", "443"]
}
source_ranges = [
"${var.ip-A}",
"${var.ip-A-osaka}",
"${var.ip-C}",
"${var.ip-lb-google}",
]
source_tags = ["web"]
}
resource "google_compute_firewall" "ssh" {
name = "ssh"
network = "${google_compute_network.default.name}"
allow {
protocol = "tcp"
ports = ["22"]
}
source_ranges = [
"${var.ip-A}",
"${var.ip-C}",
]
source_tags = ["web"]
}
ルール本体はすっきりしましたよね!
まとめ
今回も 他のネタが浮かばなかったので Terraformのtipsを紹介させていただきました。
なんと言っても当社は HashiCorp さんのパートナーになりましたからっ!
「Vault」「Terrafrom」「Consul」などのミドルウェアを提供する 米HashiCorp社とgrasysがパートナー契約を締結
株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。
grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。