infra/main.tf (184 lines of code) (raw):

# Copyright 2023 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 # # http://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. data "google_compute_zones" "available" { depends_on = [ module.project_services ] project = var.project_id region = var.region } locals { zones_base = { default = data.google_compute_zones.available.names user = compact(var.zones) } zones = local.zones_base[length(compact(var.zones)) == 0 ? "default" : "user"] location = { region = var.region zones = local.zones } } module "project_services" { source = "terraform-google-modules/project-factory/google//modules/project_services" version = "~> 14.1" disable_services_on_destroy = false project_id = var.project_id activate_apis = [ "compute.googleapis.com", "sourcerepo.googleapis.com", "cloudbuild.googleapis.com", "storage.googleapis.com", "secretmanager.googleapis.com", "iam.googleapis.com", "cloudresourcemanager.googleapis.com", "container.googleapis.com", "file.googleapis.com", "servicenetworking.googleapis.com", "sqladmin.googleapis.com", "monitoring.googleapis.com" ] } resource "google_compute_network" "xwiki" { depends_on = [ module.project_services ] project = var.project_id name = "xwiki-gke" auto_create_subnetworks = true } resource "random_password" "sql" { length = 20 min_lower = 4 min_numeric = 4 min_upper = 4 override_special = "!#%*()-_=+[]{}:?" } module "database" { depends_on = [ module.project_services ] source = "./modules/database" region = local.location["region"] private_network_id = google_compute_network.xwiki.id availability_type = "REGIONAL" xwiki_sql_user_password = random_password.sql.result } resource "google_filestore_instance" "xwiki" { depends_on = [ module.project_services ] name = "xwiki-filestore" tier = "BASIC_HDD" location = local.location["zones"][0] networks { network = google_compute_network.xwiki.name modes = ["MODE_IPV4"] } file_shares { capacity_gb = 1024 name = "xwiki_file_share" } labels = var.labels } data "google_project" "project" { } resource "google_storage_bucket" "xwiki_jgroup" { depends_on = [ module.project_services ] name = "xwiki-jgroup-${data.google_project.project.number}-gke" project = var.project_id location = local.location["region"] force_destroy = true labels = var.labels } resource "google_service_account" "jgroup" { depends_on = [ module.project_services ] account_id = "xwiki-jgroup-gke" } resource "google_project_iam_member" "jgroup_permission" { project = var.project_id role = "roles/storage.objectAdmin" member = "serviceAccount:${google_service_account.jgroup.email}" } resource "google_storage_hmac_key" "jgroup" { service_account_email = google_service_account.jgroup.email } resource "google_compute_address" "xwiki" { depends_on = [ module.project_services ] name = "xwiki-lb-http-ip" region = local.location["region"] address_type = "EXTERNAL" } module "kubernetes_cluster" { depends_on = [ module.database, module.project_services, google_compute_address.xwiki ] source = "./modules/kubernetes" cluster_name = var.cluster_name region = local.location["region"] zones = local.location["zones"] xwiki_network_self_link = google_compute_network.xwiki.self_link labels = var.labels } module "helm" { depends_on = [ module.kubernetes_cluster, ] source = "./modules/helm" entries = [ { name = "project_id" value = var.project_id }, { name = "region" value = local.location["region"] }, { name = "image" value = var.image }, { name = "loadbalancer_ip" value = google_compute_address.xwiki.address }, { name = "config_maps.db_host" value = module.database.db_ip }, { name = "config_maps.db_user" value = module.database.xwiki_user_name }, { name = "config_maps.nfs_ip_address" value = google_filestore_instance.xwiki.networks[0].ip_addresses[0] }, { name = "config_maps.jgroup_bucket_name" value = google_storage_bucket.xwiki_jgroup.name }, ] secret_entries = [ { name = "secrets.access_key" value = google_storage_hmac_key.jgroup.access_id }, { name = "secrets.secret_key" value = google_storage_hmac_key.jgroup.secret }, { name = "secrets.db_password" value = random_password.sql.result }, ] } resource "google_monitoring_dashboard" "xwiki" { dashboard_json = file("${path.module}/files/xwiki_gke_monitor_dashboard.json") }