terraform/modules/autoscaler-base/main.tf (105 lines of code) (raw):

/** * Copyright 2024 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 * * https://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. */ resource "random_id" "role_suffix" { byte_length = 4 } # Limited role for Poller resource "google_project_iam_custom_role" "metrics_viewer_iam_role" { project = var.project_id role_id = "memorystoreClusterAutoscalerMetricsViewer_${random_id.role_suffix.hex}" title = "Memorystore Cluster Autoscaler Metrics Viewer Role" description = "Allows a principal to get Memorystore Cluster instances and view time series metrics" permissions = [ "memorystore.instances.get", "memorystore.instances.list", "monitoring.timeSeries.list", "redis.clusters.get", "redis.clusters.list" ] } # Assign custom role to Poller resource "google_project_iam_member" "poller_metrics_viewer_iam" { role = google_project_iam_custom_role.metrics_viewer_iam_role.name project = var.project_id member = "serviceAccount:${var.poller_sa_email}" } # Limited role for Scaler resource "google_project_iam_custom_role" "capacity_manager_iam_role" { project = var.project_id role_id = "memorystoreClusterAutoscalerCapacityManager_${random_id.role_suffix.hex}" title = "Memorystore Cluster Autoscaler Capacity Manager Role" description = "Allows a principal to scale Memorystore Cluster instances" permissions = [ "memorystore.instances.get", "memorystore.instances.update", "memorystore.operations.get", "redis.clusters.get", "redis.clusters.update", "redis.operations.get" ] } # Assign custom role to Scaler resource "google_project_iam_member" "scaler_update_capacity_iam" { role = google_project_iam_custom_role.capacity_manager_iam_role.name project = var.project_id member = "serviceAccount:${var.scaler_sa_email}" } resource "google_pubsub_topic_iam_member" "scaler_downstream_pub_iam" { project = var.project_id topic = google_pubsub_topic.downstream_topic.name role = "roles/pubsub.publisher" member = "serviceAccount:${var.scaler_sa_email}" } resource "google_pubsub_schema" "scaler_downstream_pubsub_schema" { name = "downstream-schema" type = "PROTOCOL_BUFFER" definition = file("${path.module}/../../../src/scaler/scaler-core/downstream.schema.proto") } resource "google_project_iam_member" "metrics_publisher_iam_poller" { project = var.project_id role = "roles/monitoring.metricWriter" member = "serviceAccount:${var.poller_sa_email}" } resource "google_project_iam_member" "metrics_publisher_iam_scaler" { project = var.project_id role = "roles/monitoring.metricWriter" member = "serviceAccount:${var.scaler_sa_email}" } resource "google_service_account" "build_sa" { account_id = "build-sa" display_name = "Autoscaler - Cloud Build Builder Service Account" } resource "google_project_iam_member" "build_iam" { for_each = toset([ "roles/artifactregistry.writer", "roles/logging.logWriter", "roles/storage.objectViewer", ]) project = var.project_id role = each.value member = "serviceAccount:${google_service_account.build_sa.email}" } resource "time_sleep" "wait_for_iam" { depends_on = [google_project_iam_member.build_iam] create_duration = "90s" } resource "google_pubsub_topic" "downstream_topic" { name = "downstream-topic" depends_on = [google_pubsub_schema.scaler_downstream_pubsub_schema] schema_settings { schema = google_pubsub_schema.scaler_downstream_pubsub_schema.id encoding = "JSON" } lifecycle { replace_triggered_by = [google_pubsub_schema.scaler_downstream_pubsub_schema] } }