gemini/use-cases/applying-llms-to-data/using-gemini-with-bigquery-remote-functions/bigquery.tf (137 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 * * 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. */ #Create dataset to host the GCS object table resource "google_bigquery_dataset" "demo_dataset" { project = module.project-services.project_id dataset_id = "gemini_demo" location = var.region depends_on = [time_sleep.wait_after_apis] } #Create BigQuery connection for Cloud Functions and GCS resource "google_bigquery_connection" "function_connection" { connection_id = var.connection_id project = module.project-services.project_id location = var.region friendly_name = "Gemini connection" description = "Connecting to the remote function that analyzes images using Gemini" cloud_resource {} depends_on = [time_sleep.wait_after_apis] } locals { bq_roles = [ "roles/run.invoker", // Service account role to invoke the remote function "roles/cloudfunctions.invoker", // Service account role to invoke the remote function "roles/storage.objectViewer", // View GCS objects to create object tables "roles/iam.serviceAccountUser" ] } #Grant the connection service account necessary permissions resource "google_project_iam_member" "functions_invoke_roles" { count = length(local.bq_roles) project = module.project-services.project_id role = local.bq_roles[count.index] member = format("serviceAccount:%s", google_bigquery_connection.function_connection.cloud_resource[0].service_account_id) depends_on = [google_bigquery_connection.function_connection, google_project_iam_member.function_manage_roles] } #Create GCS object table for your images. This will be the input table for the remote function resource "google_bigquery_table" "object_table" { project = module.project-services.project_id dataset_id = google_bigquery_dataset.demo_dataset.dataset_id table_id = "image_object_table" deletion_protection = var.deletion_protection external_data_configuration { autodetect = false connection_id = google_bigquery_connection.function_connection.id source_uris = ["${google_storage_bucket.demo_images.url}/*"] object_metadata = "Simple" } depends_on = [google_project_iam_member.functions_invoke_roles, google_storage_bucket.demo_images] } # Create a series of stored procedures to connect to the remote function and call it ## Create the image remote function. This stored procedure will be called by the workflow resource "google_bigquery_routine" "image_create_remote_function_sp" { project = module.project-services.project_id dataset_id = google_bigquery_dataset.demo_dataset.dataset_id routine_id = "image_remote_function_sp" routine_type = "PROCEDURE" language = "SQL" definition_body = templatefile("${path.module}/src/sql/image/provision_remote_function.sql", { project_id = module.project-services.project_id, dataset_id = google_bigquery_dataset.demo_dataset.dataset_id, bq_function_name = var.image_function_name, region = var.region, bq_connection_id = var.connection_id, remote_function_url = google_cloudfunctions2_function.image_remote_function.url } ) } #Sample query to call the image remote function resource "google_bigquery_routine" "image_query_remote_function_sp" { project = module.project-services.project_id dataset_id = google_bigquery_dataset.demo_dataset.dataset_id routine_id = "image_query_remote_function_sp" routine_type = "PROCEDURE" language = "SQL" definition_body = templatefile("${path.module}/src/sql/image/query_remote_function.sql", { project_id = module.project-services.project_id, dataset_id = google_bigquery_dataset.demo_dataset.dataset_id, bq_function_name = var.image_function_name, object_table_id = google_bigquery_table.object_table.table_id } ) depends_on = [ google_bigquery_routine.image_create_remote_function_sp ] } ## Create the sample text input table. This stored procedure will be called by the workflow resource "google_bigquery_routine" "provision_text_sample_table_sp" { project = module.project-services.project_id dataset_id = google_bigquery_dataset.demo_dataset.dataset_id routine_id = "provision_text_sample_table_sp" routine_type = "PROCEDURE" language = "SQL" definition_body = templatefile("${path.module}/src/sql/provision_text_sample_table.sql", { project_id = module.project-services.project_id, dataset_id = google_bigquery_dataset.demo_dataset.dataset_id } ) } ## Create the image remote function. This stored procedure will be called by the workflow resource "google_bigquery_routine" "text_create_remote_function_sp" { project = module.project-services.project_id dataset_id = google_bigquery_dataset.demo_dataset.dataset_id routine_id = "text_remote_function_sp" routine_type = "PROCEDURE" language = "SQL" definition_body = templatefile("${path.module}/src/sql/text/provision_remote_function.sql", { project_id = module.project-services.project_id, dataset_id = google_bigquery_dataset.demo_dataset.dataset_id, bq_function_name = var.text_function_name, region = var.region, bq_connection_id = var.connection_id, remote_function_url = google_cloudfunctions2_function.text_remote_function.url } ) } #Sample query to call the image remote function resource "google_bigquery_routine" "text_query_remote_function_sp" { project = module.project-services.project_id dataset_id = google_bigquery_dataset.demo_dataset.dataset_id routine_id = "text_query_remote_function_sp" routine_type = "PROCEDURE" language = "SQL" definition_body = templatefile("${path.module}/src/sql/text/query_remote_function.sql", { project_id = module.project-services.project_id, dataset_id = google_bigquery_dataset.demo_dataset.dataset_id, bq_function_name = var.text_function_name, sample_prompt_table = "sample_text_prompts" } ) depends_on = [ google_bigquery_routine.text_create_remote_function_sp, google_bigquery_routine.provision_text_sample_table_sp ] }