terraform/service.tf (101 lines of code) (raw):

# Copyright 2021 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. # Archival bucket for state dumps resource "google_storage_bucket" "service_bucket" { project = local.project name = "${local.prefix}-${local.project}-service-bucket" uniform_bucket_level_access = true location = "EU" force_destroy = true } # Service Account to read BQ resources and write state dumps resource "google_service_account" "service" { project = local.project account_id = "${local.prefix}-service" display_name = "${local.prefix}-service" } resource "google_project_iam_member" "service_sa_bigquery" { project = local.project role = "roles/bigquery.resourceViewer" member = "serviceAccount:${google_service_account.service.email}" } resource "google_storage_bucket_iam_member" "service_sa_storage" { bucket = google_storage_bucket.service_bucket.name role = "roles/storage.admin" member = "serviceAccount:${google_service_account.service.email}" } # Alerting service on Cloud Run resource "google_cloud_run_service" "service" { project = local.project provider = google-beta name = "${local.prefix}-service" location = local.region template { spec { service_account_name = google_service_account.service.email containers { image = "gcr.io/${local.project}/bq-utilization-alerts" volume_mounts { name = "slack" mount_path = "/slack" } volume_mounts { name = "gchat" mount_path = "/gchat" } env { name = "GOOGLE_CLOUD_PROJECT" value = local.project } env { name = "SLOT_USAGE_THRESHOLD" value = "0.8" } env { name = "STATE_BUCKET" value = google_storage_bucket.service_bucket.name } resources { limits = { memory = "256Mi" cpu = "1000m" } } } volumes { name = "slack" secret { secret_name = google_secret_manager_secret.secret_slack_hook.secret_id items { key = "latest" path = "webhook" } } } volumes { name = "gchat" secret { secret_name = google_secret_manager_secret.secret_gchat_hook.secret_id items { key = "latest" path = "webhook" } } } } } metadata { annotations = { "run.googleapis.com/ingress" = "all" "run.googleapis.com/launch-stage" = "BETA" } } traffic { percent = 100 latest_revision = true } depends_on = [ google_secret_manager_secret_version.secret_slack_hook_data, google_secret_manager_secret_version.secret_gchat_hook_data, google_secret_manager_secret_iam_member.secret_slack_hook_access, google_secret_manager_secret_iam_member.secret_gchat_hook_access, ] } output "service_endpoint" { value = google_cloud_run_service.service.status[0].url }