Terraform Google Cloud Nat使用保留的静态IP



我们保留了需要由Terraform分配给GCP上的CloudNat的静态(白名单(IP地址。IPS已保留并在服务提供商中注册,该服务提供商需要数周才能获得批准并添加到防火墙中,因此动态分配不是一个选择。

对我们来说,主要问题是Google_compute_router_nat部分需要NAT_IP_ALLOCACE_OPTION,但是在这种情况下,IP地址已经分配,因此完全失败了,确切地说明了这一点。分配的唯一选项是auto_only and Manual_only,但似乎可能需要一个现有或保留的选择,除非我缺少明显的东西。

这是失败的配置:

resource "google_compute_address" "static_ip" {
  name    = "whitelisted-static-ip"
  region  = "${var.project_region}"
}
resource "google_compute_router_nat" "cluster-nat" {
  name                               = "cluster-stg-nat"
  router                             = "${google_compute_router.router.name}"
  region                             = "${google_compute_router.router.region}"
  nat_ip_allocate_option             = "MANUAL_ONLY"
  nat_ips                            = ["${google_compute_address.static_ip.self_link}"]
  source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
  subnetwork {
    name                    = "${google_compute_subnetwork.service.self_link}"
    source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
  }
}

导致以下错误:

Error: Error creating Address: googleapi: Error 409: The resource 'projects/staging-cluster/regions/us-central1/addresses/whitelisted-static-ip' already exists, alreadyExists

因为静态IP资源已经保留在GCP外部IP地址中并在服务提供商中注册。

将Google_compute_address资源更改为数据对象是魔术。我将其修改为:

data "google_compute_address" "static_ip" {
  name    = "whitelisted-static-ip"
  region  = "${var.project_region}"
}

当我们创建时,我们分配给了保留的外部IP地址的名称是我们分配给它的名称。然后,更新的路由器NAT资源成为:

resource "google_compute_router_nat" "cluster-nat" {
  name                               = "${var.cluster_name}-nat"
  router                             = "${google_compute_router.router.name}"
  region                             = "${google_compute_router.router.region}"
  nat_ip_allocate_option             = "MANUAL_ONLY"
  nat_ips                            = ["${data.google_compute_address.static_ip.self_link}"]
  source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
  subnetwork {
    name                    = "${google_compute_subnetwork.service.self_link}"
    source_ip_ranges_to_nat = ["PRIMARY_IP_RANGE"]
  }
}

这只是指向数据对象的NAT_IPS字段的mod。简单的两个单词更改,我们很高兴去。好!

看起来的问题是google_compute_address resource而不是NAT。您正在尝试创建已经存在的资源。相反,您应该执行以下操作之一:

  • 如果您希望Terraform为您的Terraform管理此资源,将资源导入Terraform,请参见此处https://www.terraform.io/docs/import/和https://www.terraform.io/docs/providers/google/r/compute_address.html#import
  • 如果您不希望Terraform为您管理IP地址,则可以使用数据对象而不是资源对象。从本质上讲,这是仅读取资源查找的,因此您可以在Terraform中引用它,但可以在其他地方进行管理。请参阅此处https://www.terraform.io/docs/configuration/data-sources.html和这里https://wwwww.terraform.io/docs/providers/google/google/google/dataSource_compute_compute_compute_Address.htress.html

最新更新