我们保留了静态(白名单)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地址中保留并已在服务提供商中注册。
答案 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,以指向数据对象。简单的两个单词更改,我们就很好了。 太好了!