components/webui/terraform/cloudrun.tf (137 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.
locals {
eks_label = {
goog-packaged-solution : "eks-solution"
}
}
module "cloud_run_web_account" {
source = "github.com/terraform-google-modules/terraform-google-service-accounts?ref=a11d4127eab9b51ec9c9afdaf51b902cd2c240d9" #commit hash of version 4.0.0
project_id = var.project_id
names = ["cloud-run-web"]
project_roles = [
"${var.project_id}=>roles/aiplatform.user",
"${var.project_id}=>roles/discoveryengine.viewer",
"${var.project_id}=>roles/storage.objectUser",
]
display_name = "EKS Cloud Run WebUI Service Account"
description = "specific custom service account for Web APP"
}
resource "null_resource" "deployment_trigger" {
triggers = {
source_contents_hash = local.cloud_build_content_hash
}
}
resource "google_cloud_run_v2_service" "eks_webui" {
name = var.webui_service_name
location = var.region
deletion_protection = false
ingress = "INGRESS_TRAFFIC_INTERNAL_LOAD_BALANCER"
template {
scaling {
max_instance_count = 2
}
containers {
image = "${var.region}-docker.pkg.dev/${var.project_id}/${var.artifact_repo}/${var.webui_service_name}:latest"
ports {
container_port = 8080
}
env {
name = "PROJECT_ID"
value = module.project_services.project_id
}
env {
name = "AGENT_BUILDER_LOCATION"
value = var.vertex_ai_data_store_region
}
env {
name = "AGENT_BUILDER_DATA_STORE_ID"
value = var.agent_builder_data_store_id
}
env {
name = "AGENT_BUILDER_SEARCH_ID"
value = var.agent_builder_search_id
}
resources {
limits = {
cpu = "2"
memory = "1024Mi"
}
}
}
service_account = module.cloud_run_web_account.email
vpc_access {
network_interfaces {
network = var.vpc_network_name
subnetwork = var.serverless_connector_subnet
}
egress = "ALL_TRAFFIC"
}
}
lifecycle {
replace_triggered_by = [null_resource.deployment_trigger]
}
depends_on = [
module.gcloud_build_app.wait
]
}
resource "google_compute_region_network_endpoint_group" "eks_webui_neg" {
name = "${var.webui_service_name}-neg"
network_endpoint_type = "SERVERLESS"
region = var.region
cloud_run {
service = google_cloud_run_v2_service.eks_webui.name
}
lifecycle {
replace_triggered_by = [google_cloud_run_v2_service.eks_webui]
}
}
resource "google_compute_ssl_policy" "ssl-policy" {
name = "ssl-policy"
profile = "MODERN"
min_tls_version = "TLS_1_2"
}
module "eks_webui_lb" {
source = "github.com/terraform-google-modules/terraform-google-lb-http.git//modules/serverless_negs?ref=99d56bea9a7f561102d2e449852eaf725e8b8d0c" # version 12.0.0
name = "${var.webui_service_name}-lb"
project = var.project_id
managed_ssl_certificate_domains = var.lb_ssl_certificate_domains
ssl = true
ssl_policy = google_compute_ssl_policy.ssl-policy.self_link
https_redirect = true
labels = local.eks_label
backends = {
default = {
description = null
groups = [
{
group = google_compute_region_network_endpoint_group.eks_webui_neg.id
}
]
enable_cdn = false
iap_config = {
enable = true
oauth2_client_id = google_iap_client.project_client.client_id
oauth2_client_secret = google_iap_client.project_client.secret
}
log_config = {
enable = true
}
}
}
}
resource "google_project_service_identity" "iap_sa" {
provider = google-beta
project = module.project_services.project_id
service = "iap.googleapis.com"
}
data "google_iam_policy" "webui_policy" {
binding {
role = "roles/run.invoker"
members = setunion(var.iap_access_domains, [google_project_service_identity.iap_sa.member])
}
}
resource "google_cloud_run_v2_service_iam_policy" "policy" {
project = google_cloud_run_v2_service.eks_webui.project
location = google_cloud_run_v2_service.eks_webui.location
name = google_cloud_run_v2_service.eks_webui.name
policy_data = data.google_iam_policy.webui_policy.policy_data
}