Terraform: перекрестные ссылки на проекты не допускаются - PullRequest
0 голосов
/ 14 февраля 2019

Я вижу что-то странное с google_compute_firewall, экземпляр вычисления находится в общей подсети.

Я предполагаю, что правило брандмауэра должно быть связано с сетью, к которой принадлежит эта подсеть.Но мы не можем добавить правило брандмауэра в эту сеть, потому что:

google_compute_firewall.intacct-firewall: Error creating Firewall: googleapi: Error 400: Invalid value for field 'resource.network': 'projects/it-production-186816/global/networks/production'. Cross project referencing is not allowed for this resource., invalid

Невозможно найти что-либо задокументированное для правил брандмауэра в общих сетях.Должны ли мы добавить брандмауэр в локальный VPC, а не в общий VPC?

Образ для вычисления имеет следующую сетевую конфигурацию:

  network_interface {
    subnetwork         = "${var.subnetwork}"
    subnetwork_project = "${var.vpc_parent}"
    access_config      = {
      nat_ip = "${google_compute_address.dokku.address}"
    }
  }

Так что, хотя экземпляр вычисления находится в project-1,Используемая сеть находится в project-2

РЕДАКТИРОВАТЬ:

Мой main.tf:

# Backend config
terraform {
  backend "gcs" {
    bucket      = "intacct-staging-remote-backend"
    project     = "fr-intacct-staging"
    credentials = "./creds/serviceaccount.json"
  }
}
#
# Provider config
provider "google" {
  region      = "${var.gcp_region}"
  project     = "${var.gcp_project}"
  credentials = "${file("./creds/serviceaccount.json")}"
}
#
# Static IP Address for the app
resource "google_compute_address" "dokku" {
  name = "fr-intacct-staging-ip"
  address_type = "EXTERNAL"
}
#
# Compute Instance Config
resource "google_compute_instance" "dokku" {
  project                   = "${var.gcp_project}"
  name                      = "dokku-host1"
  machine_type              = "${var.comp_type}"
  zone                      = "${var.gcp_zone}"
  allow_stopping_for_update = "true"

  tags = ["intacct"]

  # Install Dokku
  metadata_startup_script   = <<SCRIPT
sudo yum install -y wget
wget https://raw.githubusercontent.com/dokku/dokku/v0.14.5/bootstrap.sh
sudo DOKKU_TAG=${var.dokku_version} bash bootstrap.sh
sudo dokku apps:create fr-intacct-staging
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo systemctl restart network
setenforce 0
SCRIPT

  boot_disk {
    initialize_params {
      image = "${var.compute_image}"
    }
  }
  network_interface {
    subnetwork         = "${var.subnetwork}"
    subnetwork_project = "${var.vpc_parent}"
    access_config      = {
      nat_ip = "${google_compute_address.dokku.address}"
    }
  }
}
#
# Firewall rule for app access
resource "google_compute_firewall" "intacct-firewall" {
  name    = "intacct-firewall"
  network = "projects/it-production-186816/global/networks/production"
  allow {
    protocol = "tcp"
    ports    = [ "80" ]
  }
  source_ranges = [ "0.0.0.0/0" ]
  target_tags   = [ "intacct" ]
}

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

Если это так, то так и будет ... но поскольку используемая учетная запись службы имеет разрешение на другой проект, кажется неправильным, что нам придется использовать другойпровайдер для другого проекта?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Правильный ответ - создать еще один локальный модуль для создания правила брандмауэра в хост-проекте.

0 голосов
/ 14 февраля 2019

Нет ошибок с ошибкой, вы должны выполнить вашу terraform в проекте, где объявлена ​​сеть.

Если это проект-2 (как в env с несколькими проектами), вы должны выполнитьваша terraform в проекте-2 и не объявлять вашу terraform для использования проекта-1 для настройки в другом проекте.Это именно то, что говорит вам ошибка:)

ОБНОВЛЕНИЕ

Давайте будем еще точнее.

Таким образом, вы можете объявить другого поставщика, это то, чтоЯ бы предпочел сделать так, как точно знал бы, где выполняется код и проект, но вы также можете попытаться указать проект внутри ресурса, как вы делали это в экземпляре compute, для правила брандмауэра:

resource "google_compute_firewall" "intacct-firewall" {
  project = "projcet-2"
  name    = "intacct-firewall"
  network = "projects/it-production-186816/global/networks/production"
  allow {
    protocol = "tcp"
    ports    = [ "80" ]
  }
  source_ranges = [ "0.0.0.0/0" ]
  target_tags   = [ "intacct" ]
}

В этом есть одна загвоздка: используемая учетная запись службы должна иметь права на действия в обоих проектах.

...