GCP, terraform установлен в экземпляре «тестового экземпляра» проекта GCP-A с использованием кода terraform, как развернуть/создать экземпляр в проекте-B?

GCP, terraform установлен в экземпляре «тестового экземпляра» проекта GCP-A, используя terraform, как развернуть экземпляр в проекте-B?

Я смог сделать это с помощью команды gcloud, кто-нибудь знает, как это сделать?

provider "google" {
  project = "project-b"
  region = "us-central1"
  zone = "us-central1-c"
}

resource "google_compute_instance" "vm_instance" {
  name = "terraform-instance"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    # A default network is created for all GCP projects 
    network = "default"
    access_config {}
  }
}

person Janardhan    schedule 21.11.2019    source источник
comment
Я получал следующее сообщение об ошибке: - google_compute_instance.vm_instance: Создание... Ошибка: Ошибка загрузки зоны "us-central1-c": googleapi: Ошибка 403: Требуется разрешение "compute.zones.get" для "projects/jana-project" -b/zones/us-central1-c', запрещено в main.tf, строка 7, в ресурсе google_compute_instance vm_instance: 7: resource google_compute_instance vm_instance {   -  person Janardhan    schedule 21.11.2019
comment
пожалуйста, найдите код terraform:- провайдер google {проект = проект-b регион = us-central1 zone = us-central1-c } ресурс google_compute_instance vm_instance { name = terraform-instance machine_type = f1-micro boot_disk { initialize_params { image = debian-cloud /debian-9 } } network_interface { # Сеть по умолчанию создается для всех проектов GCP network = default access_config { } } }   -  person Janardhan    schedule 21.11.2019
comment
Пожалуйста, отредактируйте свой код в своем вопросе и используйте для него правильные блоки форматирования.   -  person ydaetskcoR    schedule 21.11.2019


Ответы (2)


Проблема, с которой вы столкнулись, связана с контролем доступа. Вы пытаетесь запустить terraform из виртуальной машины, находящейся в Project-A, а код terraform хочет создать новую виртуальную машину (или другой ресурс) в Project-B.

По умолчанию учетная запись службы, прикрепленная к виртуальной машине Project-A, не имеет достаточных прав для создания какого-либо ресурса в Project-B. Чтобы решить эту проблему, вы можете создать учетную запись службы на уровне папки (или уровня организации), которая имеет разрешения на создание виртуальной машины в необходимых проектах, а затем вы можете прикрепить эту учетную запись службы к виртуальной машине, на которой работает terraform.

Надеюсь это поможет.

person pradeep    schedule 21.11.2019
comment
да, спасибо Pradeep, но Project-A и Project-B находятся в разных организациях, есть ли способ добиться этого? - person Janardhan; 25.11.2019
comment
@Janardhan - Какой вариант использования вы пытаетесь решить? Почему вы хотите, чтобы какая-то другая организация создавала/управляла ресурсами в вашей организации? - person pradeep; 25.11.2019
comment
Я работаю над развертыванием нескольких учетных записей (проектов) в GCP, поэтому мне нужен доступ к другим ресурсам проекта организации, мы используем инструмент terraform для развертывания экземпляров в другом проекте. - person Janardhan; 25.11.2019
comment
У вас может быть несколько проектов или папок в одной организации, так зачем вам создавать несколько организаций? - person pradeep; 25.11.2019
comment
Как правило, у вас есть одна организация для одной компании, а затем у вас может быть несколько папок для разных отделов, и в них вы можете иметь несколько проектов для разных команд. - person pradeep; 25.11.2019
comment
спасибо Pradeep, но мой вариант использования — развертывание экземпляров в проектах других организаций. - person Janardhan; 26.11.2019

Я предлагаю вам использовать переменные Terraform, используя .tfvars файлы и несколько Рабочие пространства Terraform. Затем вы можете переключаться между рабочими пространствами и применять tfvars для каждого конкретного проекта отдельно.

e.g.

# variables.tf

variable "project_id" {
  type        = string
}

А затем используйте переменную в вашей конфигурации terraform:

# main.tf

provider "google" {
  project = var.project_id
  region = "us-central1"
  zone = "us-central1-c"
}

Тогда tfvars будут выглядеть так:

# vars/dev.tfvars

project_id = "my-dev-project"

Полный вызов в вашей рабочей области (см. документы) может быть выполнен с помощью plan/apply, как вы обычно это делаете:

terraform workspace select dev

terraform plan -var-file vars/dev.tfvars
person petomalina    schedule 21.11.2019
comment
Спасибо petomalina, попробую этот подход. - person Janardhan; 25.11.2019