| # Copyright 2021 The Go Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| |
| # Config for vuln worker. |
| |
| ################################################################ |
| # Inputs. |
| |
| variable "env" { |
| description = "environment name" |
| type = string |
| } |
| |
| variable "project" { |
| description = "GCP project" |
| type = string |
| } |
| |
| variable "region" { |
| description = "GCP region" |
| type = string |
| } |
| |
| variable "use_profiler" { |
| description = "use Stackdriver Profiler" |
| type = bool |
| } |
| |
| variable "min_frontend_instances" { |
| description = "minimum number of frontend instances" |
| type = number |
| } |
| |
| variable "oauth_client_id" { |
| description = "OAuth 2 client ID (visit APIs & Services > Credentials)" |
| type = string |
| } |
| |
| variable "issue_repo" { |
| description = "name of GitHub repo to post issues on" |
| type = string |
| } |
| |
| |
| ################################################################ |
| # Cloud Run service. |
| |
| resource "google_cloud_run_service" "worker" { |
| provider = google-beta |
| |
| lifecycle { |
| ignore_changes = [ |
| # When we deploy, we may use different clients at different versions. |
| # Ignore those changes. |
| template[0].metadata[0].annotations["run.googleapis.com/client-name"], |
| template[0].metadata[0].annotations["run.googleapis.com/client-version"] |
| ] |
| } |
| |
| name = "${var.env}-vuln-worker" |
| project = var.project |
| location = var.region |
| |
| template { |
| spec { |
| containers { |
| # Get the image from GCP (see the "data" block below). |
| # Exception: when first creating the service, replace this with a hardcoded |
| # image tag. |
| image = data.google_cloud_run_service.worker.template[0].spec[0].containers[0].image |
| env { |
| name = "GOOGLE_CLOUD_PROJECT" |
| value = var.project |
| } |
| env { |
| name = "VULN_WORKER_NAMESPACE" |
| value = var.env |
| } |
| env { |
| name = "VULN_WORKER_REPORT_ERRORS" |
| value = true |
| } |
| env { |
| name = "VULN_WORKER_ISSUE_REPO" |
| value = var.issue_repo |
| } |
| env { |
| name = "VULN_GITHUB_ACCESS_TOKEN" |
| value_from { |
| secret_key_ref { |
| name = google_secret_manager_secret.vuln_github_access_token.secret_id |
| key = "latest" |
| } |
| } |
| } |
| env { |
| name = "VULN_WORKER_USE_PROFILER" |
| value = var.use_profiler |
| } |
| resources { |
| limits = { |
| "cpu" = "4000m" |
| "memory" = "16Gi" |
| } |
| } |
| } |
| |
| service_account_name = data.google_compute_default_service_account.default.email |
| # 60 minutes is the maximum Cloud Run request time. |
| timeout_seconds = 60 * 60 |
| } |
| |
| metadata { |
| annotations = { |
| "autoscaling.knative.dev/minScale" = var.min_frontend_instances |
| "autoscaling.knative.dev/maxScale" = "1" |
| #"client.knative.dev/user-image" = data.google_cloud_run_service.worker.template[0].spec[0].containers[0].image |
| } |
| } |
| } |
| autogenerate_revision_name = true |
| |
| traffic { |
| latest_revision = true |
| percent = 100 |
| } |
| } |
| |
| # We deploy new images with gcloud, not terraform, so we need to |
| # make sure that "terraform apply" doesn't change the deployed image |
| # to whatever is in this file. (The image attribute is required in |
| # a Cloud Run config; it can't be empty.) |
| # |
| # We use this data source is used to determine the deployed image. |
| data "google_cloud_run_service" "worker" { |
| name = "${var.env}-vuln-worker" |
| project = var.project |
| location = var.region |
| } |
| |
| ################################################################ |
| # Other components. |
| |
| locals { |
| tz = "America/New_York" |
| } |
| |
| resource "google_secret_manager_secret" "vuln_github_access_token" { |
| secret_id = "vuln-${var.env}-github-access-token" |
| project = var.project |
| replication { |
| automatic = true |
| } |
| } |
| |
| data "google_compute_default_service_account" "default" { |
| project = var.project |
| } |
| |
| resource "google_cloud_scheduler_job" "vuln_issue_triage" { |
| name = "vuln-${var.env}-issue-triage" |
| description = "Updates the DB and files issues." |
| schedule = "0 * * * *" # every hour |
| time_zone = local.tz |
| project = var.project |
| attempt_deadline = format("%ds", 30 * 60) |
| |
| http_target { |
| http_method = "POST" |
| uri = "${google_cloud_run_service.worker.status[0].url}/update-and-issues" |
| oidc_token { |
| service_account_email = data.google_compute_default_service_account.default.email |
| audience = var.oauth_client_id |
| } |
| } |
| |
| retry_config { |
| max_backoff_duration = "3600s" |
| max_doublings = 5 |
| max_retry_duration = "0s" |
| min_backoff_duration = "5s" |
| retry_count = 0 |
| } |
| } |