Terraform 使用保留静态ip对google云nat进行地形化
我们保留了静态(白名单)IP地址,需要通过terraform分配给GCP上的CloudNAT。IP是在服务提供商处保留和注册的,需要数周时间才能获得批准并添加到其防火墙中,因此动态分配不是一个选项 我们面临的主要问题是,google_compute_router_nat部分需要nat_ip_allocate_选项,但在这种情况下,ip地址已经分配,因此它失败,并出现一个错误。分配的唯一选项是AUTO_only和MANUAL_only,但似乎可能需要现有的或保留的,除非我遗漏了一些明显的东西 以下是失败的配置:Terraform 使用保留静态ip对google云nat进行地形化,terraform,Terraform,我们保留了静态(白名单)IP地址,需要通过terraform分配给GCP上的CloudNAT。IP是在服务提供商处保留和注册的,需要数周时间才能获得批准并添加到其防火墙中,因此动态分配不是一个选项 我们面临的主要问题是,google_compute_router_nat部分需要nat_ip_allocate_选项,但在这种情况下,ip地址已经分配,因此它失败,并出现一个错误。分配的唯一选项是AUTO_only和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地址中,并已向服务提供商注册。问题似乎出在
谷歌计算地址资源上,而不是NAT。您正在尝试创建一个已存在的资源。相反,您应该执行以下操作之一:
- 如果希望Terraform为您管理此资源,请将资源导入Terraform,请参见此处和此处
- 如果您不希望Terraform为您管理IP地址,那么您可以使用数据对象而不是资源对象。这本质上是一个只读资源查找,因此您可以在Terraform中引用它,但可以在其他地方管理它。看看这里和这里
问题似乎出在谷歌计算地址资源上,而不是NAT。您正在尝试创建一个已存在的资源。相反,您应该执行以下操作之一:
- 如果希望Terraform为您管理此资源,请将资源导入Terraform,请参见此处和此处
- 如果您不希望Terraform为您管理IP地址,那么您可以使用数据对象而不是资源对象。这本质上是一个只读资源查找,因此您可以在Terraform中引用它,但可以在其他地方管理它。看看这里和这里
将google\u compute\u address资源更改为数据对象是一种神奇的方法。我将其修改为:
data "google_compute_address" "static_ip" {
name = "whitelisted-static-ip"
region = "${var.project_region}"
}
其中,“白名单静态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。简单的两个字的改变,我们就可以开始了。好极了 将google\u compute\u address资源更改为数据对象是一种神奇。我将其修改为:
data "google_compute_address" "static_ip" {
name = "whitelisted-static-ip"
region = "${var.project_region}"
}
其中,“白名单静态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。简单的两个字的改变,我们就可以开始了。好极了 我不完全清楚你在描述什么错误。你能粘贴你正在运行的确切地形和完整的错误输出吗?编辑以删除配置中注释掉的部分。希望这更清楚一点。我不完全清楚你在描述什么错误。你能粘贴你正在运行的确切地形和完整的错误输出吗?编辑以删除配置中注释掉的部分。希望这更清楚一点。