Назад | Перейти на главную страницу

Создание шлюза NAT с Terraform завершается неудачно с ошибкой

Я использую частный кластер GKE и хочу добавить шлюз NAT, чтобы я мог создавать правила брандмауэра из запросов, поступающих из кластера (по умолчанию общедоступные IP-адреса для всех узлов являются эфемерными, поэтому их трудно отслеживать).

Я пытаюсь следовать описанным инструкциям Вот, и Вот (чтобы создать высокодоступный NAT, вариант первой ссылки).

Я могу установить terraform, Создайте terraform.tfvars в моем рабочем каталоге и запустите terraform init. Когда я бегу terraform plan, Я получаю много ошибок, например:

Error: Unsupported attribute

  on ../../main.tf line 51, in module "nat-gateway":
  51:   module_enabled        = "${var.module_enabled}"

An attribute named "module_enabled" is not expected here.


Error: Unsupported attribute

  on ../../main.tf line 52, in module "nat-gateway":
  52:   project               = "${var.project}"

An attribute named "project" is not expected here.


Error: Unsupported attribute

  on ../../main.tf line 53, in module "nat-gateway":
  53:   region                = "${var.region}"

An attribute named "region" is not expected here.


Error: Unsupported attribute

  on ../../main.tf line 54, in module "nat-gateway":
  54:   zone                  = "${local.zone}"

An attribute named "zone" is not expected here.
...

Я получаю сообщение об ошибке почти при каждом вводе в этот модуль (Это то, что ../../main.tf указывает на).

module "nat-gateway" {
  source                = "GoogleCloudPlatform/managed-instance-group/google"
  version               = "1.1.14"
  module_enabled        = "${var.module_enabled}"
  project               = "${var.project}"
  region                = "${var.region}"
  zone                  = "${local.zone}"
  network               = "${var.network}"
  subnetwork            = "${var.subnetwork}"
  target_tags           = ["${local.instance_tags}"]
  instance_labels       = "${var.instance_labels}"
  service_account_email = "${var.service_account_email}"
  machine_type          = "${var.machine_type}"
  name                  = "${local.name}"
  compute_image         = "${var.compute_image}"
  size                  = 1
  network_ip            = "${var.ip}"
  can_ip_forward        = "true"
  service_port          = "80"
  service_port_name     = "http"
  startup_script        = "${data.template_file.nat-startup-script.rendered}"
  wait_for_instances    = true
  metadata              = "${var.metadata}"
  ssh_fw_rule           = "${var.ssh_fw_rule}"
  ssh_source_ranges     = "${var.ssh_source_ranges}"
  http_health_check     = "${var.autohealing_enabled}"

  update_strategy = "ROLLING_UPDATE"

  rolling_update_policy = [
    {
      type                  = "PROACTIVE"
      minimal_action        = "REPLACE"
      max_surge_fixed       = 0
      max_unavailable_fixed = 1
      min_ready_sec         = 30
    },
  ]

  access_config = [
    {
      nat_ip = "${element(concat(google_compute_address.default.*.address, data.google_compute_address.default.*.address, list("")), 0)}"
    },
  ]
}

Я также заметил, что ошибки, которые я получаю, - это поля, которые объявлены Вот но нет Вот, так что похоже, что это какое-то несовпадение версии.

Я пытался изменить этот строку, как показано ниже, чтобы получить последнюю версию из github вместо реестра terraform, но это не решило проблему.

// before:
module "nat-gateway" {
  source                = "GoogleCloudPlatform/managed-instance-group/google"
  version               = "1.1.14"

// after:
module "nat-gateway" {
  source                = "github.com/GoogleCloudPlatform/terraform-google-managed-instance-group" 

Мой рабочий каталог examples/gke-ha-nat-gateway/, если это важно. Вся среда такая же, как только что клонированная с github, за исключением terraform.tfvars.

К сожалению, у меня нет опыта работы с Terraform, поэтому я действительно не знаю, как отлаживать эти ошибки.

Спасибо за помощь!

Поскольку вы используете GCP, вы можете рассмотреть Облачный NAT конфигурации, а не создание собственного шлюза NAT.

Похоже, что адреса 'fda3: e722: ac3 :: / 48' используются, когда виртуальные машины обращаются к службам, размещенным в Google. Если вы обращаетесь к любой службе за пределами Google, он увидит ваши IP-адреса NAT. Что касается того, что исходный IP-адрес является случайным IPv6 (когда узлы подключаются к сайту) вместо созданного статического IPv4, вы можете добавить 'fda3: e722: ac3: 10: 30: dXXX: aXX: 0/96' в правила брандмауэра.