我正在尝试使用远程存储(Terraform Cloud)设置terraform项目,该项目主要是提供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}
命令不知道要查找目录树。
我考虑过使用模块,但是鉴于上面的代码使用了随机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}"
}
与生产环境类型相同,因此对于多个环境类型示例,您可以使用相同的代码和项目