IAC/main.tf (115 lines of code) (raw):
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.53.0"
}
shell = {
source = "scottwinkler/shell"
version = "~> 1.0"
}
}
backend "gcs" {
bucket = "{your-gcs-bucket-name}"
prefix = "terraform/state"
credentials = "./svc.json"
}
}
provider "google" {
credentials = file(var.gcp_auth_file)
project = var.project_id
region = var.region
zone = var.main_zone
}
module "google_services" {
source = "./enable-apis"
project_id = var.project_id
for_each = var.destroy_module ? toset(["value"]) : toset([])
}
module "google_cloud_iam" {
source = "./iam"
project_id = var.project_id
email = var.email
depends_on = [module.google_services]
}
resource "null_resource" "gcloud_registry" {
provisioner "local-exec" {
command = <<EOT
gcloud auth activate-service-account ${var.service_account} --key-file=${var.path_svc_iac} --project=${var.project_id}
cd ${var.path_backend}
gcloud builds submit --region=${var.region} --tag southamerica-east1-docker.pkg.dev/${var.project_id}/apps/${var.shared_cloud_run}:latest
EOT
}
depends_on = [module.google_registry, module.google_cloud_iam, module.google_services]
}
resource "null_resource" "gcloud_frontend" {
provisioner "local-exec" {
command = <<EOT
gcloud auth activate-service-account ${var.service_account} --key-file=${var.path_svc_iac} --project=${var.project_id}
cd ${var.path_frontend}
gcloud run deploy frontend --source . --region=${var.region} --project=${var.project_id} --allow-unauthenticated --memory=2Gi --port=8501
EOT
}
depends_on = [module.google_registry, module.google_cloud_iam, module.google_services]
}
module "google_registry" {
source = "./registry"
region = var.region
depends_on = [module.google_services]
}
module "google_networks" {
source = "./db-vpc"
project_id = var.project_id
region = var.region
network_name = var.network_name
subnet_name = var.subnet_name
cloudsql_name = var.cloudsql_name
depends_on = [module.google_services]
}
module "google_storage" {
source = "./storage"
cloud_storage_name = var.cloud_storage_name
region = var.region
depends_on = [module.google_services]
}
module "google_cloud_pub-sub" {
source = "./pub-sub"
pubsub = var.pubsub
depends_on = [module.google_services]
}
module "google_cloud_user" {
source = "./user-database"
name_user_sql = var.name_user_sql
cloudsql_name = var.cloudsql_name
depends_on = [module.google_services, module.google_networks]
}
module "google_compute_engine" {
source = "./compute-engine"
project_id = var.project_id
region = var.region
network_name = var.network_name
subnet_name = var.subnet_name
machine_type = var.machine_type
depends_on = [module.google_services, module.google_networks, module.google_cloud_user]
}
module "google_cloud_run" {
source = "./cloudrun"
project_id = var.project_id
region = var.region
network_name = var.network_name
cloudsql_name = var.cloudsql_name
email_svc = var.email_svc
pubsub = var.pubsub
shared_cloud_run = var.shared_cloud_run
depends_on = [module.google_services, module.google_compute_engine, module.google_networks, module.google_registry]
}
module "google_cloud_function" {
source = "./function"
project_id = var.project_id
network_name = var.network_name
function_name = var.function_name
pubsub = var.pubsub
email_svc = var.email_svc
region = var.region
depends_on = [module.google_services, module.google_cloud_pub-sub, module.google_networks]
}