grasys blog

TerraformでFirewallのIPアドレスをまとめて定義しておくと便利だとなぜ早く気が付かなかった・・・

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にはあります。
お気軽にご連絡ください。

株式会社grasys | 採用情報


採用情報
お問い合わせ