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

时间:2019-06-26 13:14:15

标签: terraform

我们保留了静态(白名单)IP地址,需要通过terraform将其分配给GCP上的CloudNAT。这些IP是保留的,并已在服务提供商处注册,这需要数周的时间才能被批准并添加到其防火墙中,因此不能进行动态分配。

对我们来说,主要问题是google_compute_router_nat部分需要nat_ip_allocate_option,但是在这种情况下,该IP地址已经分配完毕,因此会失败,并显示错误消息。分配的唯一选项是AUTO_ONLY和MANUAL_ONLY,但似乎可能需要EXISTING或RESERVED,除非我遗漏了一些明显的东西。

这是失败的配置:

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地址中保留并已在服务提供商中注册。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

将google_compute_address资源更改为数据对象是神奇的事情。我将其修改为:

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

“ whitelisted-static-ip”的名称是我们在创建保留的外部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,以指向数据对象。简单的两个单词更改,我们就很好了。 太好了!