terraform - 跨 terraform 工作区共享 Google Cloud Platform 项目
问题描述
我正在尝试使用远程存储(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?
编辑:另一个想法是创建一个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
}
这是一个可接受的解决方案吗?
解决方案
我最终提出的想法是创建另一个工作空间来保存共享的“核心”基础架构部分。这就是所谓core
的,它的唯一目的(至少现在)是创建谷歌云平台项目。然后它输出项目 id 以供其他工作区使用。最终的目录结构如下所示:
|- terraform-project
|- environments
| |- core
| | |- main.tf
| | |- outputs.tf
| | |- variables.tf
| |- staging
| | |- main.tf
| | |- outputs.tf
| |- production
| |- main.tf
| |- outputs.tf
|- backend.tf
whereenvironments/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
}
这当然会在我使用的工作空间之间创建依赖关系,但我并不认为这必然是一个缺点。
推荐阅读
- php - 如何更新数据库中的某些值并设置关系
- python - python - 如何在scrapy中添加`-o`参数,同时在python中以编程方式运行它
- android - Ktor 客户端 MockEngine 未在 android 中解析
- java - 在其构造函数中处理框架
- javascript - 使用Javascript删除sql数据库上的行
- android - 未调用 Layout-sw400dp。多屏支持
- html - 在 Bootstrap 4 中使 3 列宽度为 75% 并居中对齐
- java - Spring Cloud Gateway 使连接过早关闭
- javascript - Three.js 错误 - '无法读取未定义的属性'旋转''
- opencart - 如何将 Aramex Shipping 添加到 opencart