跨 Terraform 工作区共享 Google 个 Cloud Platform 项目
Share Google Cloud Platform project across terraform workspaces
我正在尝试使用远程存储 (Terraform Cloud) 设置一个 Terraform 项目,该项目将主要提供 Google 云平台资源。作为基础设施的一部分,我需要 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}
命令不知道要查找目录树。
我考虑过使用模块,但考虑到上面的代码使用了随机 ID,这不会导致为每个环境创建一次项目,但使用不同的 ID 吗?
Edit:另一个想法是创建一个 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
}
这是一个可以接受的解决方案吗?
使用下面的项目目录
| - 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" 基础设施部分。这称为 core
,其唯一目的(至少目前)是创建 Google Cloud Platform 项目。然后它输出项目 ID 以供其他工作区使用。最终的目录结构如下所示:
|- terraform-project
|- environments
| |- core
| | |- main.tf
| | |- outputs.tf
| | |- variables.tf
| |- staging
| | |- main.tf
| | |- outputs.tf
| |- production
| |- main.tf
| |- outputs.tf
|- backend.tf
其中 environments/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
}
和每个其他环境 main.tf
文件具有以下配置:
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
}
这当然会在我使用的工作区之间产生依赖性,但我认为这不一定是缺点。
我正在尝试使用远程存储 (Terraform Cloud) 设置一个 Terraform 项目,该项目将主要提供 Google 云平台资源。作为基础设施的一部分,我需要 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}
命令不知道要查找目录树。
我考虑过使用模块,但考虑到上面的代码使用了随机 ID,这不会导致为每个环境创建一次项目,但使用不同的 ID 吗?
Edit:另一个想法是创建一个 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
}
这是一个可以接受的解决方案吗?
使用下面的项目目录
| - 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" 基础设施部分。这称为 core
,其唯一目的(至少目前)是创建 Google Cloud Platform 项目。然后它输出项目 ID 以供其他工作区使用。最终的目录结构如下所示:
|- terraform-project
|- environments
| |- core
| | |- main.tf
| | |- outputs.tf
| | |- variables.tf
| |- staging
| | |- main.tf
| | |- outputs.tf
| |- production
| |- main.tf
| |- outputs.tf
|- backend.tf
其中 environments/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
}
和每个其他环境 main.tf
文件具有以下配置:
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
}
这当然会在我使用的工作区之间产生依赖性,但我认为这不一定是缺点。