Vultr Kubernetes Engine に firewall 機能が追加されたのでTerraformで設定してみた

はじめに

VultrのKubernetes(VKE)のクラスタに対してfirewallを設定できるようになっていました。
Terraformにも対応されていたのでTerraformにてfirewallの設定を行ってみました。

VKE Firewall 機能について

VKEのFirewall機能はノード(インスタンス)に対して、Firewallが自動でリンクする機能のようです。
なので、Firewall 機能を有効にしてノードを増やすと設定したFirewallのルールがノードに適用されていました。

※ ドキュメントを見つけれなかったですが、管理画面を見ている限りFirewallインスタンスに設定されているようでした。

Terraformで設定してみる(管理画面も必要)

Vultrのプロバイダ 2.18 以上で Kubrenetes のArgument Reference のオプションに enable_firewall が追加されます。

registry.terraform.io

したがって enable_firewall = true を設定すると有効化されます。

resource "vultr_kubernetes" "main" {
  region   = <リージョン>
  version  = <バージョン>
  enable_firewall = true
}

しかし、plan してみるとわかるのですが現在(2023/12/21)クラスタが再作成されてしまいます。 新しくクラスタを作る場合は問題ないのですが既存クラスタで設定する場合は不都合がありました。

+ enable_firewall        = true # forces replacement

そこでライフサイクルを設定して管理画面から有効化します。

resource "vultr_kubernetes" "main" {
  region   = <リージョン>
  version  = <バージョン>
  enable_firewall = true
  lifecycle {
    ignore_changes = [enable_firewall]
  }
}

terraform plan して apply してみるとステートファイルが書き換わっていると思います。
(planやらapplyやらしていたら、ステートファイルがいつの間にか変わっていたので、多分applyが必要?)

"firewall_group_id": "<firewallのid>",

firewallのルール設定してみる

先ほど設定したFirewallはTerraform内で参照することができるので下記のようにルールを追加することが可能です。

resource "vultr_firewall_rule" "main" {
    firewall_group_id = vultr_kubernetes.main.firewall_group_id
    protocol = "tcp"
    ip_type = "v4"
    subnet = "0.0.0.0"
    subnet_size = 0
    port = "22"
    notes = "ssh"
}

さいごに

いつの間にかVKEにFirewallを設定できるようになって、インスタンスに対して自動でIP制限を設定できるようになっていました。今までインスタンスが外部に公開されてしまう課題に対しては個別にインスタンスに設定する必要がありましたがアップデートにて自動で設定されるようになり管理が簡単になりました。