terraform/deploy/main.tf (115 lines of code) (raw):

/** * Copyright 2022 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. */ // https://www.terraform.io/language/values/variables#variable-definitions-tfvars-files terraform { required_providers { google = { source = "hashicorp/google" version = "4.15.0" } } backend "gcs" {} } // https://www.terraform.io/language/settings/backends/gcs // https://cloud.google.com/architecture/managing-infrastructure-as-code // https://cloud.google.com/sdk/gcloud/reference/auth/application-default // https://cloud.google.com/blog/topics/developers-practitioners/using-google-cloud-service-account-impersonation-your-terraform-code // gcloud iam service-accounts add-iam-policy-binding ${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com --member user:${ACCOUNT_EMAIL} --role="roles/iam.serviceAccountTokenCreator" provider "google" { alias = "impersonation" scopes = [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/userinfo.email", ] } data "google_service_account_access_token" "default" { count = var.use_impersonation == true ? 1 : 0 provider = google.impersonation target_service_account = var.impersonated_service_account scopes = ["userinfo-email", "cloud-platform"] lifetime = "1200s" } // set GOOGLE_APPLICATION_CREDENTIALS and login // `gcloud auth application-default login` locals { service_account_key = var.install_service_account_key != null ? file(var.install_service_account_key) : null } // Default provider provider "google" { project = var.project_id region = var.region zone = var.zone credentials = var.use_impersonation == false ? local.service_account_key : null access_token = var.use_impersonation == false ? null : data.google_service_account_access_token.default[0].access_token // request_timeout = "60s" } data "google_secret_manager_secret_version" "secret_oauth_client_id" { secret = "${var.secret_name_prefix}_oauth_client_id" } data "google_secret_manager_secret_version" "secret_oauth_client_secret" { secret = "${var.secret_name_prefix}_oauth_client_secret" } locals { oauth_client_id = data.google_secret_manager_secret_version.secret_oauth_client_id.secret_data oauth_client_secret = data.google_secret_manager_secret_version.secret_oauth_client_secret.secret_data } module "datashare-application" { source = "../modules/datashare-application" count = var.deploy_datashare_application ? 1 : 0 oauth_client_id = local.oauth_client_id oauth_client_secret = local.oauth_client_secret project_id = var.project_id region = var.region zone = var.zone tag = var.tag auth_domain = var.auth_domain use_remote_open_api_spec = var.use_remote_open_api_spec use_impersonation = var.use_impersonation marketplace_integration_enabled = var.marketplace_integration_enabled cloud_run_ds_ui_set_no_auth = var.cloud_run_ds_ui_set_no_auth deploy_ds_listener_service = var.deploy_ds_listener_service submit_gcloud_builds = var.submit_gcloud_builds api_domain = var.api_domain ui_domain = var.ui_domain secret_name_prefix = var.secret_name_prefix goog_packaged_solution_key = var.goog_packaged_solution_key goog_packaged_solution_value = var.goog_packaged_solution_value } module "custom-domain" { source = "../modules/custom-domain" count = var.deploy_custom_domains ? 1 : 0 project_id = var.project_id region = var.region dns_zone = var.dns_zone create_static_api_ip_address = var.create_static_api_ip_address api_domain = var.api_domain ui_domain = var.ui_domain cloud_run_ds_ui_name = module.datashare-application[0].cloud_run_ds_ui_name ds_api_gateway_gateway_id = module.datashare-application[0].ds_api_gateway_gateway_id update_cloud_dns = var.update_cloud_dns goog_packaged_solution_key = var.goog_packaged_solution_key goog_packaged_solution_value = var.goog_packaged_solution_value depends_on = [module.datashare-application] } module "cloud-functions" { source = "../modules/ingestion-function" count = var.deploy_ingestion_cloud_function ? 1 : 0 project_id = var.project_id region = var.region tag = var.tag goog_packaged_solution_key = var.goog_packaged_solution_key goog_packaged_solution_value = var.goog_packaged_solution_value }