modules/secure-cloud-run-core/main.tf (97 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 { annotations_for_template = { "autoscaling.knative.dev/maxScale" = var.max_scale_instances, "autoscaling.knative.dev/minScale" = var.min_scale_instances, "run.googleapis.com/vpc-access-connector" = var.vpc_connector_id, "run.googleapis.com/vpc-access-egress" = var.vpc_egress_value } conditional_annotations = { secret = length(local.secrets_alias) == 0 ? {} : { "run.googleapis.com/secrets" = join(", ", toset(local.secrets_alias)) } } secrets = distinct(flatten([ for secret in var.volumes : [ for secret_name in secret.secret : [ { "name" : secret.name, "secret_name" : secret_name.secret_name, "path" : secret_name.items.path } ] ] ])) secrets_alias = [ for secret in local.secrets : "${secret.name}:${secret.path}${secret.secret_name}" ] } module "cloud_run" { source = "../.." service_name = var.service_name project_id = var.project_id location = var.location image = var.image service_account_email = var.cloud_run_sa encryption_key = var.encryption_key members = var.members env_vars = var.env_vars generate_revision_name = var.generate_revision_name traffic_split = var.traffic_split service_labels = var.service_labels template_labels = var.template_labels container_concurrency = var.container_concurrency timeout_seconds = var.timeout_seconds volumes = var.volumes limits = var.limits requests = var.requests ports = var.ports argument = var.argument container_command = var.container_command volume_mounts = var.volume_mounts force_override = var.force_override certificate_mode = var.certificate_mode domain_map_labels = var.domain_map_labels domain_map_annotations = var.domain_map_annotations verified_domain_name = var.verified_domain_name service_annotations = { "run.googleapis.com/ingress" = "internal-and-cloud-load-balancing" } template_annotations = merge( local.annotations_for_template, local.conditional_annotations["secret"] ) depends_on = [ time_sleep.wait_30_seconds ] } resource "google_project_service_identity" "serverless_sa" { provider = google-beta project = var.project_id service = "run.googleapis.com" } resource "time_sleep" "wait_30_seconds" { create_duration = "30s" depends_on = [ google_secret_manager_secret_iam_member.member ] } resource "google_secret_manager_secret_iam_member" "member" { for_each = { for secret in local.secrets : secret.name => secret } secret_id = "${each.value.path}${each.value.secret_name}" role = "roles/secretmanager.secretAccessor" member = "serviceAccount:${var.cloud_run_sa}" }