跨terraform工作区共享Google云平台项目
我正在尝试使用远程存储(terraform Cloud)建立一个terraform项目,该项目将主要提供Google云平台资源。作为基础设施的一部分,我需要3个使用terraform工作区管理的环境。每个环境在我的存储库中都有自己的目录,在每个目录中,我将定义特定于环境的资源。目录结构类似于:跨terraform工作区共享Google云平台项目,terraform,terraform-cloud,Terraform,Terraform Cloud,我正在尝试使用远程存储(terraform Cloud)建立一个terraform项目,该项目将主要提供Google云平台资源。作为基础设施的一部分,我需要3个使用terraform工作区管理的环境。每个环境在我的存储库中都有自己的目录,在每个目录中,我将定义特定于环境的资源。目录结构类似于: |- terraform-project |- environments | |- staging | | |- main.tf | | |- outputs.tf
|- 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云平台项目。我通常会在根mostmain.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\u project.project.project\u id
资源。大概是因为地形规划环境/{staging,production}
命令不知道如何查找目录树
我曾想过使用一个模块,但鉴于上面的代码使用了一个随机id,这会不会导致为每个环境创建一次项目,而是使用不同的id
编辑:另一个想法是创建一个核心
工作区,其中包含谷歌云平台项目的设置和任何其他共享资源。然后,每个环境将包括一个指向核心
工作区远程状态的数据
块:
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
}
这是一个可接受的解决方案吗?请使用以下项目目录
| - Terraform Project
|- staging
|- main.tf
|- backend.tf
|- provider.tf
|- vars.tf
|- output.tf
|- production
|- main.tf
|- backend.tf
|- provider.tf
|- vars.tf
|- output.tf
|- modules
|- main.tf
|- vars.tf
|- output.tf
主要业务逻辑将在modules/Main.tf文件中
在为每个环境配置资源时,{{env_type}}/main.tf将调用该模块,例如:-
staging/main.tf:-
module "example" {
source = "../modules/"
}
staging/provider.tf:-
provider "google" {
project = var.PROJECT_NAME
credentials = "xxxxxxxxxxx"
region = "${var.REGION}"
}
生产环境类型也将如此,因此您可以对多个环境类型使用相同的代码和项目示例我最终的想法是创建另一个工作区来容纳共享的“核心”基础结构部件。这被称为core
,其唯一目的(至少目前)是创建谷歌云平台项目。然后,它输出项目id以供其他工作区使用。最终的目录结构如下所示:
|- terraform-project
|- environments
| |- core
| | |- main.tf
| | |- outputs.tf
| | |- variables.tf
| |- staging
| | |- main.tf
| | |- outputs.tf
| |- production
| |- main.tf
| |- outputs.tf
|- backend.tf
其中环境/core/main.tf
具有以下配置:
provider "google" {
project = "admin-project"
version = "~> 3.6.0"
}
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
}
provider "google" {
project = "admin-project"
version = "~> 3.6.0"
}
data "terraform_remote_state" "core" {
backend = "remote"
config = {
organization = "my-org"
workspaces = {
name = "networking-core"
}
}
}
resource "google_compute_network" "vpc_network" {
name = "my-network"
project = terraform_remote_state.core.outputs.project_id
}
其他每个环境main.tf
文件都具有以下配置:
provider "google" {
project = "admin-project"
version = "~> 3.6.0"
}
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
}
provider "google" {
project = "admin-project"
version = "~> 3.6.0"
}
data "terraform_remote_state" "core" {
backend = "remote"
config = {
organization = "my-org"
workspaces = {
name = "networking-core"
}
}
}
resource "google_compute_network" "vpc_network" {
name = "my-network"
project = terraform_remote_state.core.outputs.project_id
}
这当然会在我使用的工作区之间产生依赖性,但我不认为这一定是一个缺点。这对创建单个Google云平台项目并在环境之间共享有什么帮助?虽然我理解模块是基础设施中可重用的“块”,但它们往往被用于启动多个但类似的资源。如果我将模块包括在每个环境中,terraform会尝试为每个环境创建一个项目吗?