---
title: "TerraformでFirewallのIPアドレスをまとめて定義しておくと便利だとなぜ早く気が付かなかった・・・ | grasys blog"
url: "https://blog.grasys.io/post/kyouhei/tips-of-terraform_ipaddress-in-firewall-rules"
description: "grasys加藤です。 今回はTerraformを使ってFirewallルールのIPアドレスを定義する時にキレイに整理できる小ネタです。 それなりにTerraformを使ってきましたが、IPアドレスの列記に不便を感じていたわけですよ、あちこちのルールに同じIPアドレスが出現するわけですから。 なぜ今までIPアドレスを…"
---

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

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[kyouhei](/authors/kyouhei/)
-   公開日：2018年9月20日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Terraform](/tags/terraform/)[#tips](/tags/tips/)

![TerraformでFirewallのIPアドレスをまとめて定義しておくと便利だとなぜ早く気が付かなかった・・・](/_astro/og-image.DDSiu2Ny_XHpDd.webp)

grasys加藤です。

今回はTerraformを使ってFirewallルールのIPアドレスを定義する時にキレイに整理できる小ネタです。

それなりにTerraformを使ってきましたが、IPアドレスの列記に不便を感じていたわけですよ、あちこちのルールに同じIPアドレスが出現するわけですから。

なぜ今までIPアドレスを変数定義しなかったのか・・・可読性が大きく異なります。Firewallの指定ミスは場合によってはサービスの存亡がかかってしまう事態にも発展しかねないのです！

* * *

## Before

一般的なFirewallルールはこのような形式になるかと思います。

Plain textcontent\_copy

```
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社大阪支社は許可しないとか。

Plain textcontent\_copy

```
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アドレスをまとめて変数に登録してしまいましょう。

Plain textcontent\_copy

```
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ルールはこんなにスッキリ

Plain textcontent\_copy

```
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"]
}
```

Plain textcontent\_copy

```
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](https://www.hashicorp.com/) さんのパートナーになりましたからっ！

[「Vault」「Terrafrom」「Consul」などのミドルウェアを提供する 米HashiCorp社とgrasysがパートナー契約を締結](https://www.grasys.io/news/hashicorp/)

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/kyouhei/)

### [kyouhei](/authors/kyouhei/)

kyouheiのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/kyouhei/)