Terraform 使用保留静态ip对google云nat进行地形化

Terraform 使用保留静态ip对google云nat进行地形化,terraform,Terraform,我们保留了静态(白名单)IP地址,需要通过terraform分配给GCP上的CloudNAT。IP是在服务提供商处保留和注册的,需要数周时间才能获得批准并添加到其防火墙中,因此动态分配不是一个选项 我们面临的主要问题是,google_compute_router_nat部分需要nat_ip_allocate_选项,但在这种情况下,ip地址已经分配,因此它失败,并出现一个错误。分配的唯一选项是AUTO_only和MANUAL_only,但似乎可能需要现有的或保留的,除非我遗漏了一些明显的东西 以下

我们保留了静态(白名单)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。简单的两个字的改变,我们就可以开始了。好极了

我不完全清楚你在描述什么错误。你能粘贴你正在运行的确切地形和完整的错误输出吗?编辑以删除配置中注释掉的部分。希望这更清楚一点。我不完全清楚你在描述什么错误。你能粘贴你正在运行的确切地形和完整的错误输出吗?编辑以删除配置中注释掉的部分。希望这更清楚一点。