TerraformでGCPの静的IPアドレス(外部IP/内部IP)を予約する

日本語での情報がまとまっていなかったため、TerraformでGCPの静的アドレスを予約する方法をまとめます。本記事では、Terraform v0.12.9を利用しています。最新の情報はTerraform公式ドキュメントを確認してください。

利用するリソース(Resource)

以下のresourceを利用します。

https://www.terraform.io/docs/providers/google/r/compute_address.html

主な変数と変数についての説明を以下にまとめます。

変数名 記載 説明
name 必須 リソースの名前を指定します。名前は1〜63文字で、RFC1035に準拠する必要があります。具体的には、名前は1〜63文字で、正規表現[a-z]([-a-z0-9] * [a-z0-9])?と一致する必要があります。つまり、最初の文字は小文字でなければならず、後続のすべての文字はダッシュ、小文字、または数字でなければなりません。ただし、最後の文字はダッシュにすることはできません
address このリソースによって作成される静的外部アドレスが入ります。リソース作成時には、内部アドレスタイプにのみ指定できます。IPv4のみがサポートされており、IPアドレスは、指定されたサブネットワーク内に存在する必要があります。
address_type 予約するアドレスのタイプ、内部(INTERNAL)または外部(EXTERNAL)を指定します。指定しない場合、デフォルトはEXTERNALになります。
network_tier このアドレスの構成に使用されるネットワーク層を指定します。PREMIUM か STANDARDを指定できます。デフォルトでは、PREMIUMが設定されます。
subnetwork アドレスを予約するサブネットワークのURLを指定します。IPアドレスを指定する場合、サブネットワークのIP範囲内にある必要があります。このフィールドは、address_typeがINTERNALで、GCE_ENDPOINT/DNS_RESOLVER用途でのみ使用できます。
region 作成されたアドレスが存在するリージョンを指定します。指定されていない場合、プロバイダーで指定したリージョンが使用されます。

静的外部(リージョン)IPの予約方法

以下にTerraformコードの記載例を示します。

resource "google_compute_address" "static_region_ip" {
  name         = "static_region_ip"
  region       = "asia-northeast1"
  network_tier = "STANDARD"
}
  • 名前(name)は、任意のものを指定します。
  • 静的リージョンIPを作成を作成したいため、作成したいリージョン(region)を指定しています。
  • ネットワークサービス階層(network_tier)は、STANDARDを指定しています。

Terraformで上記を実行することで、静的リージョンIPが予約(払い出し)されます。
グローバルネットワークの静的IPアドレスを予約する場合は、nameだけ指定します。

静的内部IPアドレスの予約方法

以下にTerraformコードの記載例を示します。

resource "google_compute_address" "static_internal_ip" {
  name          = "static_internal_ip"
  region        = "asia-northeast1"
  subnetwork    = "default"
  address_type  = "INTERNAL"
  address       = "xxx.xxx.xxx.xxx"
}
  • リージョンIPと異なり、サブネットを指定しています。
    • GCP公式ドキュメントに記載されているように、内部IPアドレスは、VPCネットワーク配下で予約されるためです。
  • アドレスタイプ(address_type)には、必ずINTERNALを指定します。
  • アドレス(address)には、設定したいアドレスを記載します。指定したサブネットワークに含まれるIPアドレスを指定します。

まとめ

今回、Terraformを利用して、静的IPアドレス(外部IP/内部IP)を予約する方法を説明しました。静的アドレスには、3種類(外部グローバル/外部リージョン/内部)あるため、変数指定の有無で予約されるIPアドレスが異なることに注意する必要がありそうです。