modules/gcve-monitoring/main.tf (143 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. */ locals { base_gcve_agent_endpoint = "https://storage.googleapis.com/gcve-observability-agent/latest/vmware-linux-amd64" base_gcloud_secret_manager = "gcloud secrets versions access latest --secret=" sa_gcve_monitoring_roles = toset([ "roles/secretmanager.secretAccessor", "roles/monitoring.admin", "roles/logging.logWriter", ]) } resource "google_project_service" "enable_destination_api" { project = var.project service = "monitoring.googleapis.com" disable_on_destroy = false } resource "google_service_account" "sa_gcve_monitoring" { project = var.project account_id = var.sa_gcve_monitoring } resource "google_project_iam_member" "gcve_monitoring_permissions" { for_each = local.sa_gcve_monitoring_roles role = each.key project = var.project member = "serviceAccount:${google_service_account.sa_gcve_monitoring.email}" } #tfsec:ignore:vm-disk-encryption-customer-key # provide single Monitoring instance with healing capabilities. resource "google_compute_region_instance_group_manager" "mig_monitoring_gcve" { base_instance_name = var.vm_mon_name project = var.project target_size = 1 version { name = "${var.vm_mon_name}-mig-version-0" instance_template = google_compute_instance_template.vm_mon_tpl.self_link } name = "${var.vm_mon_name}-mig" region = var.gcve_region distribution_policy_zones = [var.vm_mon_zone] auto_healing_policies { health_check = google_compute_health_check.tcp_healthcheck.self_link initial_delay_sec = var.initial_delay_sec } update_policy { max_surge_fixed = 0 max_unavailable_fixed = 1 replacement_method = "RECREATE" minimal_action = "REPLACE" type = "PROACTIVE" instance_redistribution_type = "NONE" } stateful_internal_ip { delete_rule = "NEVER" interface_name = "nic0" } } # check if the bpagent is up by checking the syslog port. resource "google_compute_health_check" "tcp_healthcheck" { project = var.project name = "gcve-mon-tcp-healthcheck" check_interval_sec = var.hc_interval_sec timeout_sec = var.hc_timeout_sec healthy_threshold = var.hc_healthy_threshold unhealthy_threshold = var.hc_unhealthy_threshold tcp_health_check { port = 5142 } } # firewall for the healthcheck # get network id from subnetwork data "google_compute_subnetwork" "gcve-subnetwork" { name = var.subnetwork region = var.gcve_region project = var.project } #tfsec:ignore:google-compute-no-public-ingress resource "google_compute_firewall" "healthcheck" { project = var.project name = "gcve-mon-hc-rule" network = data.google_compute_subnetwork.gcve-subnetwork.network allow { protocol = "tcp" ports = ["5142"] } source_ranges = ["35.191.0.0/16", "130.211.0.0/22"] target_service_accounts = [google_service_account.sa_gcve_monitoring.email] } #################### # Instance Template #################### # get the latest image data "google_compute_image" "gcve_mon_image" { family = "debian-11" project = "debian-cloud" } #tfsec:ignore:vm-disk-encryption-customer-key resource "google_compute_instance_template" "vm_mon_tpl" { name_prefix = "${var.vm_mon_name}-template1" machine_type = var.vm_mon_type region = var.gcve_region project = var.project metadata = { block-project-ssh-keys = true } metadata_startup_script = templatefile("${path.module}/scripts/installer.sh", { endpoint_agent = "${local.base_gcve_agent_endpoint}/artifacts/bpagent-headless-vmware.tar.gz" endpoint_install = "${local.base_gcve_agent_endpoint}/installer/install.sh" gcloud_secret_vsphere_server = "${local.base_gcloud_secret_manager}${var.secret_vsphere_server}" gcloud_secret_vsphere_user = "${local.base_gcloud_secret_manager}${var.secret_vsphere_user}" gcloud_secret_vsphere_password = "${local.base_gcloud_secret_manager}${var.secret_vsphere_password}" gcve_region = var.gcve_region project_id = var.project }) disk { source_image = data.google_compute_image.gcve_mon_image.self_link auto_delete = true disk_size_gb = 100 boot = true } service_account { email = google_service_account.sa_gcve_monitoring.email scopes = ["cloud-platform"] } network_interface { subnetwork = var.subnetwork subnetwork_project = var.project } lifecycle { create_before_destroy = "true" } shielded_instance_config { enable_vtpm = true enable_integrity_monitoring = true } } resource "google_monitoring_dashboard" "gcve_mon_dashboards" { for_each = var.create_dashboards ? fileset("${path.module}/dashboards", "*.json") : [] dashboard_json = file("${path.module}/dashboards/${each.value}") project = var.project }