Terraform: создание проекта GCP с использованием Shared VPC - PullRequest
0 голосов
/ 26 февраля 2019

Я работал над этим уже целую вечность ... так что хост-проект уже существует ... и имеет все настройки VPN и сети.Я стремлюсь создать новый проект через Terraform и позволить ему использовать хост-проекты с общим VPC.

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

Прямо сейчас я вижу:

google_compute_shared_vpc_service_project.project: googleapi: Error 404: The resource 'projects/intacct-staging-db3b7e7a' was not found, notFound
* google_compute_instance.dokku: 1 error(s) occurred:

А также:

 google_compute_instance.dokku: Error loading zone 'europe-west2-a': googleapi: Error 404: Failed to find project intacct-staging, notFound

Первоначально я был убежден, что это заказ, поэтому я играл вокругс depends_on конфигурациями, чтобы попытаться разобраться в порядке.Это, казалось, не решило это.

Если читать просто, google_compute_shared_vpc_service_project не существует, если рассматривать google_compute_shared_vpc_service_project.Несмотря на то, что я добавил следующее к google_compute_shared_vpc_service_project:

depends_on = ["google_project.project",
    "google_compute_shared_vpc_host_project.host_project",
  ]

Возможно, поскольку хост-проект уже существует, я должен использовать data для ссылки на него вместо resource?

Мой полный файл TF находится здесь:

provider "google" {
 region = "${var.gcp_region}"
 credentials = "${file("./creds/serviceaccount.json")}"
}
resource "random_id" "id" {
 byte_length = 4
 prefix      = "${var.project_name}-"
}
resource "google_project" "project" {
 name            = "${var.project_name}"
 project_id      = "${random_id.id.hex}"
 billing_account = "${var.billing_account}"
 org_id          = "${var.org_id}"
}
resource "google_project_services" "project" {
  project = "${google_project.project.project_id}"
  services = [
    "compute.googleapis.com"
  ]
  depends_on = [ "google_project.project" ]
}
# resource "google_service_account" "service-account" {
#   account_id   = "intacct-staging-service"
#   display_name = "Service Account for the intacct staging app"
# }
resource "google_compute_shared_vpc_host_project" "host_project" {
  project    = "${var.vpc_parent}"
}
resource "google_compute_shared_vpc_service_project" "project" {
  host_project    = "${google_compute_shared_vpc_host_project.host_project.project}"
  service_project = "${google_project.project.project_id}"

  depends_on = ["google_project.project",
    "google_compute_shared_vpc_host_project.host_project",
  ]
}

resource "google_compute_address" "dokku" {
  name = "fr-intacct-staging-ip"
  address_type = "EXTERNAL"
  project = "${google_project.project.project_id}"
  depends_on = [ "google_project_services.project" ]
}
resource "google_compute_instance" "dokku" {
  project                   = "${google_project.project.name}"
  name                      = "dokku-host"
  machine_type              = "${var.comp_type}"
  zone                      = "${var.gcp_zone}"
  allow_stopping_for_update = "true"

  tags = ["intacct"]

  # Install Dokku
  metadata_startup_script   = <<SCRIPT
sed -i 's/PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config && service sshd restart
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}"
    }
  }
  metadata {
    sshKeys = "root:${file("./id_rsa.pub")}"
  }
}

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

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

Теперь я также вижу другую ошибку, относящуюся к статическому IP.Сетевой интерфейс настроен на использование подсети с хоста VPC ...

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

Здесь настраивается IP:

resource "google_compute_address" "dokku" {
  name = "fr-intacct-staging-ip"
  address_type = "EXTERNAL"
  project = "${google_project.project.project_id}"
}

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

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

Я попытаюсь разрешить вызовы сетевого API и посмотрю, работает ли это, но я думаю, что внешний IP должен быть в общем VPC хост-проекта?

...