Я пытаюсь настроить проект terraform, используя удаленное хранилище (Terraform Cloud), который в первую очередь будет предоставлять ресурсы Google Cloud Platform. В рамках инфраструктуры мне требуются 3 среды, управление которыми будет осуществляться с использованием рабочих пространств terraform. Каждая среда будет иметь свой собственный каталог в моем репозитории, в каждом я определю ресурсы, специфичные для среды. Структура каталогов выглядит примерно так:
|- terraform-project
|- environments
| |- staging
| | |- main.tf
| | |- outputs.tf
| | |- variables.tf
| |- production
| |- main.tf
| |- outputs.tf
| |- variables.tf
|- backend.tf
|- main.tf
|- outputs.tf
|- variables.tf
Однако в каждой среде должен использоваться один и тот же проект Google Cloud Platform. Обычно я создаю проект, используя следующее внутри корневого main.tf
файла:
resource "random_id" "project_id" {
byte_length = 4
prefix = "${var.project_name}-"
}
resource "google_project" "project" {
name = var.project_name
project_id = random_id.project_id.hex
billing_account = var.billing_account
org_id = var.org_id
}
Итак, мой вопрос: как мне создать проект только один раз и поделиться им между средами? Выполнение следующих действий внутри каждой среды main.tf
не работает:
resource "google_compute_network" "vpc_network" {
name = "staging-network"
project = google_project.project.project_id
}
Ресурс google_project.project.project_id
не может быть найден. Предположительно потому, что команда terraform plan environments/{staging,production}
не знает, что нужно искать в дереве каталогов.
Я думал об использовании модуля, но, учитывая, что в приведенном выше коде используется случайный идентификатор, не приведет ли это к тому, что проект будет создаваться один раз для каждой среды, но с другим идентификатором?
Изменить. Еще одна идея - создать core
рабочее пространство, которое будет содержать настройки проекта Google Cloud Platform и любых других общих ресурсов. Затем каждая среда будет включать блок data
, указывающий на удаленное состояние рабочего пространства core
:
data "terraform_remote_state" "core" {
backend = "remote"
...
}
resource "google_compute_network" "vpc_network" {
name = "staging-network"
project = data.terraform_remote_state.core.outputs.project_id
}
Это приемлемое решение?