modules/tfc-agent-mig-vm/main.tf (160 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. */ locals { network_name = var.create_network ? google_compute_network.tfc_agent_network[0].self_link : var.network_name service_account_email = var.create_service_account ? google_service_account.tfc_agent_service_account[0].email : var.service_account_email startup_script = var.startup_script == "" ? file("${path.module}/scripts/startup.sh") : var.startup_script instance_name = "${var.tfc_agent_name_prefix}-${random_string.suffix.result}" tfc_agent_secret = "${var.tfc_agent_secret}-${random_string.suffix.result}" } resource "random_string" "suffix" { length = 4 special = false upper = false } /***************************************** Optional Terraform agent Networking *****************************************/ resource "google_compute_network" "tfc_agent_network" { count = var.create_network ? 1 : 0 name = var.network_name project = var.project_id auto_create_subnetworks = false } resource "google_compute_subnetwork" "tfc_agent_subnetwork" { count = var.create_network ? 1 : 0 project = var.project_id name = var.subnet_name ip_cidr_range = var.subnet_ip region = var.region network = local.network_name } resource "google_compute_router" "tfc_agent_router" { count = var.create_network ? 1 : 0 name = "${var.network_name}-router" network = google_compute_network.tfc_agent_network[0].self_link region = var.region project = var.project_id } resource "google_compute_router_nat" "tfc_agent_nat" { count = var.create_network ? 1 : 0 project = var.project_id name = "${var.network_name}-nat" router = google_compute_router.tfc_agent_router[0].name region = google_compute_router.tfc_agent_router[0].region nat_ip_allocate_option = "AUTO_ONLY" source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES" } /***************************************** IAM Bindings GCE SVC *****************************************/ resource "google_service_account" "tfc_agent_service_account" { count = var.create_service_account ? 1 : 0 project = var.project_id account_id = "tfc-agent-mig-vm-sa" display_name = "Terraform Cloud agent GCE Service Account" } /***************************************** Terraform agent Secrets *****************************************/ resource "google_secret_manager_secret" "tfc_agent_secret" { provider = google-beta project = var.project_id secret_id = local.tfc_agent_secret labels = { label = local.tfc_agent_secret } replication { user_managed { replicas { location = var.region } } } } resource "google_secret_manager_secret_version" "tfc_agent_secret_version" { provider = google-beta secret = google_secret_manager_secret.tfc_agent_secret.id secret_data = jsonencode({ "TFC_AGENT_NAME" = local.instance_name "TFC_ADDRESS" = var.tfc_agent_address "TFC_AGENT_TOKEN" = var.tfc_agent_token "TFC_AGENT_SINGLE" = var.tfc_agent_single "TFC_AGENT_AUTO_UPDATE" = var.tfc_agent_auto_update "AGENT_VERSION" = var.tfc_agent_version "LABELS" = join(",", var.tfc_agent_labels) }) } resource "google_secret_manager_secret_iam_member" "tfc_agent_secret_member" { provider = google-beta project = var.project_id secret_id = google_secret_manager_secret.tfc_agent_secret.id role = "roles/secretmanager.secretAccessor" member = "serviceAccount:${local.service_account_email}" } /***************************************** Terraform agent GCE Instance Template *****************************************/ module "mig_template" { source = "terraform-google-modules/vm/google//modules/instance_template" version = "~> 12.0" project_id = var.project_id machine_type = var.machine_type network = local.network_name subnetwork = var.subnet_name region = var.region subnetwork_project = var.network_project != "" ? var.network_project : var.project_id service_account = { email = local.service_account_email scopes = [ "https://www.googleapis.com/auth/cloud-platform", ] } disk_size_gb = 100 disk_type = "pd-ssd" auto_delete = true source_image = var.source_image source_image_family = var.source_image_family source_image_project = var.source_image_project name_prefix = var.tfc_agent_name_prefix startup_script = local.startup_script metadata = merge({ "secret-id" = google_secret_manager_secret_version.tfc_agent_secret_version.name }, var.custom_metadata) tags = [ local.instance_name ] depends_on = [ google_compute_network.tfc_agent_network, google_compute_subnetwork.tfc_agent_subnetwork, ] } /***************************************** Terraform agent MIG *****************************************/ module "mig" { source = "terraform-google-modules/vm/google//modules/mig" version = "~> 12.0" project_id = var.project_id region = var.region hostname = local.instance_name instance_template = module.mig_template.self_link /* autoscaler */ autoscaling_enabled = true min_replicas = var.min_replicas max_replicas = var.max_replicas cooldown_period = var.cooldown_period }