infra/main.tf (128 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. */ provider "google" { project = var.project_id } provider "google-beta" { project = var.project_id } module "enable_base_google_apis" { source = "terraform-google-modules/project-factory/google//modules/project_services" version = "~> 15.0" disable_services_on_destroy = false activate_apis = [ "cloudresourcemanager.googleapis.com", "container.googleapis.com", "iam.googleapis.com", ] project_id = var.project_id } module "enable_multi_cluster_google_apis" { source = "terraform-google-modules/project-factory/google//modules/project_services" version = "~> 15.0" disable_services_on_destroy = false activate_apis = [ "gkehub.googleapis.com", "multiclusteringress.googleapis.com", "multiclusterservicediscovery.googleapis.com", "trafficdirector.googleapis.com", ] project_id = var.project_id } # Assign a custom service account to the 3 GKE clusters # because some users' projects will not have the default Compute Engine service account enabled. resource "google_service_account" "my_service_account" { account_id = "my-service-account${var.resource_name_suffix}" display_name = "My Service Account" depends_on = [ module.enable_base_google_apis ] } resource "google_project_iam_member" "my_service_account_role_metric_writer" { project = var.project_id role = "roles/monitoring.metricWriter" member = "serviceAccount:${google_service_account.my_service_account.email}" } resource "google_project_iam_member" "my_service_account_role_log_writer" { project = var.project_id role = "roles/logging.logWriter" member = "serviceAccount:${google_service_account.my_service_account.email}" } resource "google_project_iam_member" "my_service_account_role_monitoring_viewer" { project = var.project_id role = "roles/monitoring.viewer" member = "serviceAccount:${google_service_account.my_service_account.email}" } resource "google_project_iam_member" "my_service_account_role_stackdriver_writer" { project = var.project_id role = "roles/stackdriver.resourceMetadata.writer" member = "serviceAccount:${google_service_account.my_service_account.email}" } resource "google_container_cluster" "my_cluster_usa" { name = "my-cluster-usa${var.resource_name_suffix}" location = "us-west1" enable_autopilot = true project = var.project_id resource_labels = var.labels deletion_protection = false depends_on = [ module.enable_base_google_apis ] cluster_autoscaling { auto_provisioning_defaults { service_account = google_service_account.my_service_account.email } } # Need an empty ip_allocation_policy to overcome an error related to autopilot node pool constraints. # Workaround from https://github.com/hashicorp/terraform-provider-google/issues/10782#issuecomment-1024488630 ip_allocation_policy { } provider = google-beta # Needed for the google_gkehub_feature Terraform module. } resource "google_container_cluster" "my_cluster_europe" { name = "my-cluster-europe${var.resource_name_suffix}" location = "europe-west1" enable_autopilot = true project = var.project_id resource_labels = var.labels deletion_protection = false depends_on = [ module.enable_base_google_apis ] cluster_autoscaling { auto_provisioning_defaults { service_account = google_service_account.my_service_account.email } } # Need an empty ip_allocation_policy to overcome an error related to autopilot node pool constraints. # Workaround from https://github.com/hashicorp/terraform-provider-google/issues/10782#issuecomment-1024488630 ip_allocation_policy { } provider = google-beta # Needed for the google_gkehub_feature Terraform module. } resource "google_container_cluster" "my_cluster_config" { name = "my-cluster-config${var.resource_name_suffix}" location = "us-west1" enable_autopilot = true project = var.project_id resource_labels = var.labels deletion_protection = false depends_on = [ module.enable_base_google_apis ] cluster_autoscaling { auto_provisioning_defaults { service_account = google_service_account.my_service_account.email } } # Need an empty ip_allocation_policy to overcome an error related to autopilot node pool constraints. # Workaround from https://github.com/hashicorp/terraform-provider-google/issues/10782#issuecomment-1024488630 ip_allocation_policy { } provider = google-beta # Needed for the google_gkehub_feature Terraform module. }