hacks/genai-intro/artifacts/main.tf (175 lines of code) (raw):

# Copyright 2023 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 "google_project_service" "serviceusage_api" { service = "serviceusage.googleapis.com" disable_on_destroy = false } resource "google_project_service" "compute_api" { service = "compute.googleapis.com" disable_on_destroy = false } resource "google_project_service" "resource_manager_api" { service = "cloudresourcemanager.googleapis.com" disable_on_destroy = false } resource "google_project_service" "iam_api" { service = "iam.googleapis.com" disable_on_destroy = false } resource "google_project_service" "pubsub_api" { service = "pubsub.googleapis.com" disable_on_destroy = false depends_on = [ google_project_service.resource_manager_api ] } resource "google_project_service" "eventarc_api" { service = "eventarc.googleapis.com" disable_on_destroy = false } resource "google_project_service" "build_api" { service = "cloudbuild.googleapis.com" disable_on_destroy = false } resource "google_project_service" "artifacts_api" { service = "artifactregistry.googleapis.com" disable_on_destroy = false } resource "google_project_service" "functions_api" { service = "cloudfunctions.googleapis.com" disable_on_destroy = false } resource "google_project_service" "run_api" { service = "run.googleapis.com" disable_on_destroy = false } resource "google_project_service" "logging_api" { service = "logging.googleapis.com" disable_on_destroy = false } resource "google_project_service" "vision_api" { service = "vision.googleapis.com" disable_on_destroy = false depends_on = [google_project_service.resource_manager_api] } resource "google_project_service" "vertex_api" { service = "aiplatform.googleapis.com" disable_on_destroy = false } resource "google_project_service" "bigquery_api" { service = "bigquery.googleapis.com" disable_on_destroy = false } resource "google_project_service" "bigquery_conn_api" { service = "bigqueryconnection.googleapis.com" disable_on_destroy = false } data "google_project" "project" { depends_on = [ google_project_service.resource_manager_api ] } data "google_compute_default_service_account" "gce_default" { depends_on = [ google_project_service.compute_api ] } data "google_storage_project_service_account" "gcs_default" { } resource "google_project_service_identity" "functions_default_sa" { provider = google-beta project = data.google_project.project.project_id service = "run.googleapis.com" } resource "google_project_iam_member" "functions_default_iam" { project = var.gcp_project_id for_each = toset([ "roles/run.serviceAgent" ]) role = each.key member = "serviceAccount:${google_project_service_identity.functions_default_sa.email}" depends_on = [ google_project_service.functions_api, google_project_service.build_api, google_project_service.artifacts_api, google_project_service.run_api, google_project_service.iam_api ] } resource "time_sleep" "wait_until_functions_sa_ready" { create_duration = "90s" depends_on = [ google_project_iam_member.functions_default_iam ] } resource "google_pubsub_topic" "pubsub_topic" { name = "documents" depends_on = [ google_project_service.pubsub_api ] } resource "google_project_iam_member" "gce_default_iam" { project = var.gcp_project_id for_each = toset([ "roles/aiplatform.user", "roles/artifactregistry.writer", "roles/bigquery.dataEditor", "roles/bigquery.user", "roles/cloudbuild.builds.builder", "roles/logging.logWriter", "roles/run.invoker", "roles/storage.objectAdmin", "roles/storage.insightsCollectorService" ]) role = each.key member = "serviceAccount:${data.google_compute_default_service_account.gce_default.email}" depends_on = [ google_project_service.iam_api ] } data "archive_file" "source" { type = "zip" source_dir = "function" output_path = "function.zip" } resource "google_storage_bucket" "bucket" { name = "${var.gcp_project_id}-functions" location = var.gcp_region uniform_bucket_level_access = true } resource "google_storage_bucket_object" "zip" { source = data.archive_file.source.output_path content_type = "application/zip" # Append to the MD5 checksum of the files's content # to force the zip to be updated as soon as a change occurs name = "src-${data.archive_file.source.output_md5}.zip" bucket = google_storage_bucket.bucket.name } resource "google_cloudfunctions2_function" "function" { name = "process-document" location = var.gcp_region build_config { runtime = "python312" entry_point = "on_document_added" source { storage_source { bucket = google_storage_bucket.bucket.name object = google_storage_bucket_object.zip.name } } } service_config { available_memory = "512M" timeout_seconds = "300" ingress_settings = "ALLOW_INTERNAL_AND_GCLB" max_instance_count = 4 environment_variables = { GCP_REGION = var.gcp_region GCP_PROJECT_ID = var.gcp_project_id } service_account_email = data.google_compute_default_service_account.gce_default.email } event_trigger { event_type = "google.cloud.pubsub.topic.v1.messagePublished" pubsub_topic = google_pubsub_topic.pubsub_topic.id } depends_on = [ time_sleep.wait_until_functions_sa_ready ] }