How to use variables from other modules in Terraform: Adding Host Project id to the Service Projects. (GCP)
My infrastructure its composed by a Host Project and several Service Projects that are using its Shared VPC.
I have refactored my .tf
files of my infrustructure as it follows:
├── env
| ├── dev
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
│ ├── pre
│ └── pro
├── host
│ ├── main.tf
│ ├── outputs.tf
│ ├── terraform.tfvars
│ └── variables.tf
└── modules
├── compute
├── network
└── projects
The order of creation of the infrastructure is:
-
terraform apply
in /host -
terraform apply
in /env/dev (for instance)
In the main.tf
of the host directory I have created the VPC and enabled Shared VPC hosting:
# Creation of the hosted network
resource "google_compute_network" "shared_network" {
name = var.network_name
auto_create_subnetworks = false
project = google_compute_shared_vpc_host_project.host_project.project
mtu = "1460"
}
# Enable shared VPC hosting in the host project.
resource "google_compute_shared_vpc_host_project" "host_project" {
project = google_project.host_project.project_id
depends_on = [google_project_service.host_project]
}
The issue comes when I have refer to the Shared VPC Network in the Service Projects.
In the main.tf
from env/dev/
I have set the following:
resource "google_compute_shared_vpc_service_project" "service_project_1" {
host_project = google_project.host_project.project_id
service_project = google_project.service_project_1.project_id
depends_on = [
google_compute_shared_vpc_host_project.host_project,
google_project_service.service_project_1,
]
}
QUESTION
How do I refer to the Host Project ID from another directory in the Service Project?
What I have tried so far
-
I have thought of using Ouput Values and Data Sources:
In the
host/outputs.tf
declared as an output the Project ID as:output "project_id" { value = google_project.host_project.project_id }
But then I end up not knowing how to implement this output in my
env/dev/main.tf
-
I have thought on Data Sources and, in the
env/dev/main.tf
fetch for the Host Project ID. But then, in order to fetch it, I would need its name (which breaks the purpose of providing it in a programatic way if I have to hardcode it).
What should I try next? What I am missing?
Solution 1:
The files under the env/dev
folder can't see anything above it, only any referenced modules.
You could refactor the host
folder into a module to allow access to it's outputs... but that adds a risk that the host will be destroyed whenever you destroy a dev environment.
I would try running terraform output -raw project_id
after creating the host and piping it to a text file or environment variable. Then using that as the input for a new "host_project" or similar variable in the 'env/dev' deployment.