1. はじめに
この Codelab では、GenAI Databases Retrieval Service をデプロイし、デプロイされた環境を使用してインタラクティブなサンプル アプリケーションを作成する方法を学びます。

GenAI Retrieval Service とサンプル アプリケーションについて詳しくは、こちらをご覧ください。
前提条件
- Google Cloud コンソールの基本的な知識
- コマンドライン インターフェースと Google Cloud Shell の基本的なスキル
学習内容
- Cloud SQL インスタンスを作成する方法
- インスタンスに接続する方法
- GenAI Databases Retrieval Service の構成とデプロイ方法
- デプロイされたサービスを使用してサンプル アプリケーションをデプロイする方法
必要なもの
- Google Cloud アカウントと Google Cloud プロジェクト
- ウェブブラウザ(Chrome など)
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell を起動する
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。
3. はじめに
API を有効にする
Cloud Shell で、プロジェクト ID が設定されていることを確認します。
通常、プロジェクト ID は、次の図に示すように、Cloud Shell のコマンド プロンプトのかっこ内に表示されます。

gcloud config set project [YOUR-PROJECT-ID]
次に、PROJECT_ID 環境変数を Google Cloud プロジェクト ID に設定します。
PROJECT_ID=$(gcloud config get-value project)
必要なサービスをすべて有効にします。
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
vpcaccess.googleapis.com \
aiplatform.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
iam.googleapis.com
想定されるコンソール出力:
student@cloudshell:~ (gleb-test-short-004)$ gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
vpcaccess.googleapis.com \
aiplatform.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
iam.googleapis.com
Operation "operations/acf.p2-404051529011-664c71ad-cb2b-4ab4-86c1-1f3157d70ba1" finished successfully.
4. Cloud SQL インスタンスを作成する
ベクトル サポートが有効になっている Cloud SQL インスタンスを作成します。
パスワードを作成する
デフォルトのデータベース ユーザーのパスワードを定義します。独自のパスワードを定義することも、ランダム関数を使用してパスワードを生成することもできます。
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
生成されたパスワードの値をメモします。
echo $CLOUDSQL_PASSWORD
MySQL
cloudsql_vector フラグは、インスタンスの作成時に有効にできます。現在、ベクトル サポートは MySQL 8.0.36 と 8.0.37 で提供されています。
export region=us-central1
gcloud sql instances create my-cloudsql-instance --region=$region --database-version=MYSQL_8_0_36 --database-flags=cloudsql_vector=ON --root-password=$CLOUDSQL_PASSWORD
想定されるコンソール出力(IP アドレスは秘匿化済み):
student@cloudshell:~ export region=us-central1 gcloud sql instances create my-cloudsql-instance --region=$region --database-version=MYSQL_8_0_36 --database-flags=cloudsql_vector=ON --root-password=$CLOUDSQL_PASSWORD Creating Cloud SQL instance for MYSQL_8_0_36...done. Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-project-402417/instances/my-cloudsql-instance]. NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS my-cloudsql-instance MYSQL_8_0_36 us-central1-a db-n1-standard-1 00.000.00.00 - RUNNABLE
PostgreSQL
pgvector 拡張機能は、バージョン 11 以降で提供されています。
export region=us-central1
gcloud sql instances create my-cloudsql-instance --region=$region --database-version=POSTGRES_15 --tier=db-g1-small
想定されるコンソール出力(IP アドレスは秘匿化済み):
student@cloudshell:~ export region=us-central1 gcloud sql instances create my-cloudsql-instance --region=$region --database-version=POSTGRES_15 --tier=db-g1-small Creating Cloud SQL instance for POSTGRES_15...done. Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-project-402417/instances/my-cloudsql-instance]. NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS my-cloudsql-instance POSTGRES_15 us-central1-a db-g1-small 00.000.00.00 - RUNNABLE
インスタンスを作成したら、インスタンスのデフォルト ユーザーのパスワードを定義し、そのパスワードで接続できるかどうかを確認する必要があります。接続の準備ができたら、プロンプトにパスワードを入力します。
gcloud sql users set-password postgres \
--instance=my-cloudsql-instance \
--password=$CLOUDSQL_PASSWORD
gcloud sql connect my-cloudsql-instance --user=postgres
想定されるコンソール出力:
student@cloudshell:~ (test-project-402417)$ gcloud sql users set-password postgres \
--instance=my-cloudsql-instance \
--password=$CLOUDSQL_PASSWORD
gcloud sql connect my-cloudsql-instance --user=postgres
Updating Cloud SQL user...done.
Allowlisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [postgres].Password:
psql (16.3 (Ubuntu 16.3-1.pgdg22.04+1), server 15.7)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
psql セッションを終了します。
exit
5. GCE 仮想マシンを準備する
サービス アカウントを作成する
VM を使用して GenAI Databases Retrieval サービスをデプロイし、サンプル アプリケーションをホストするため、最初のステップとして Google サービス アカウント(GSA)を作成します。GSA は GCE VM で使用されます。他のサービスと連携するために必要な権限を GSA に付与する必要があります。
Cloud Shell で、次のコマンドを実行します。
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create compute-aip --project $PROJECT_ID
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/run.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudsql.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudsql.client"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
GCE VM をデプロイする
Cloud SQL インスタンスと同じリージョンと VPC に GCE VM を作成します。
Cloud Shell で、次のコマンドを実行します。
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--service-account=compute-aip@$PROJECT_ID.iam.gserviceaccount.com
想定されるコンソール出力:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING
Cloud SQL に接続する VM を承認する
VM のパブリック IP を Cloud SQL インスタンスの承認済みネットワークのリストに追加する必要があります。Cloud Shell で、次のコマンドを実行します。
VM_EXTERNAL_IP=$(gcloud compute instances describe instance-1 --zone=us-central1-a --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$VM_EXTERNAL_IP
想定されるコンソール出力:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ VM_EXTERNAL_IP=$(gcloud compute instances describe instance-1 --zone=us-central1-a --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$VM_EXTERNAL_IP
When adding a new IP address to authorized networks, make sure to also include any IP addresses that have already been authorized. Otherwise, they will be overwritten and de-authorized.
Do you want to continue (Y/n)? Y
The following message will be used for the patch API method.
{"name": "my-cloudsql-instance", "project": "test-project-402417", "settings": {"ipConfiguration": {"authorizedNetworks": [{"value": "34.71.252.173"}]}}}
Patching Cloud SQL instance...done.
Updated [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-project-402417/instances/my-cloudsql-instance].
データベース クライアントをインストールする
MySQL
デプロイされた VM に MySQL クライアント ソフトウェアをインストールします。
VM に接続します。
gcloud compute ssh instance-1 --zone=us-central1-a
想定されるコンソール出力:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
VM 内でソフトウェア実行コマンドをインストールします。
sudo apt-get update
sudo apt-get install --yes default-mysql-client
想定されるコンソール出力:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes mysql-client Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: libconfig-inifiles-perl libdbd-mariadb-perl libdbi-perl libgdbm-compat4 libperl5.32 libterm-readkey-perl mariadb-client-10.5 mariadb-client-core-10.5 perl perl-modules-5.32 Suggested packages: libclone-perl libmldbm-perl libnet-daemon-perl libsql-statement-perl perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make libtap-harness-archive-perl The following NEW packages will be installed: default-mysql-client libconfig-inifiles-perl libdbd-mariadb-perl libdbi-perl libgdbm-compat4 libperl5.32 libterm-readkey-perl mariadb-client-10.5 mariadb-client-core-10.5 perl Perl-modules-5.32 ...redacted... Processing triggers for libc-bin (2.31-13+deb11u10) ...
PostgreSQL
デプロイされた VM に PostgreSQL クライアント ソフトウェアをインストールします。
VM に接続します。
gcloud compute ssh instance-1 --zone=us-central1-a
想定されるコンソール出力:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
VM 内でソフトウェア実行コマンドをインストールします。
sudo apt-get update
sudo apt-get install --yes postgresql-client
想定されるコンソール出力:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:4 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Hit:7 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable InRelease Get:8 https://packages.cloud.google.com/apt cloud-sdk-bookworm InRelease [1652 B] Get:2 https://deb.debian.org/debian bookworm InRelease [151 kB] Get:3 https://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] ...redacted... update-alternatives: using /usr/share/postgresql/15/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-client (15+248) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u7) ...
インスタンスに接続する
MySQL
MySQL を使用して VM からプライマリ インスタンスに接続します。
VM への SSH セッションは開いたままにします。接続が切断された場合は、上記と同じコマンドを使用して再度接続します。
先ほどメモした $CLOUDSQL_PASSWORD とインスタンス名を使用して、GCE VM から Cloud SQL に接続します。
export CLOUDSQL_PASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export INSTANCE_NAME=my-cloudsql-instance
export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)")
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD
想定されるコンソール出力:
student@instance-1:~$ export CLOUDSQL_PASSWORD=P9... student@instance-1:~$ export REGION=us-central1 student@instance-1:~$ export INSTANCE_NAME=my-cloud-sql-instance student@instance-1:~$ export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)") student@instance-1:~$ mysql –host=$INSTANCE_IP –user=root –password=$CLOUDSQL_PASSWORD –sslmode=require Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2824706 Server version: 8.0.36-google (Google) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
SSH 接続を維持したまま MySQL セッションを終了します。
exit
想定されるコンソール出力:
MySQL [(none)]> exit Bye student@instance-1:~$
PostgreSQL
psql を使用して VM からプライマリ インスタンスに接続します。
VM への SSH セッションは開いたままにします。接続が切断された場合は、上記と同じコマンドを使用して再度接続します。
先ほどメモした $CLOUDSQL_PASSWORD とインスタンス名を使用して、GCE VM から PostgreSQL に接続します。
export PGPASSWORD=<Noted password (CLOUDSQL_PASSWORD)>
export CLOUDSQL_PASSWORD=$PGPASSWORD
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export INSTANCE_NAME=my-cloudsql-instance
export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
想定されるコンソール出力:
student@instance-1:~$ export CLOUDSQL_PASSWORD=P9...
student@instance-1:~$ export REGION=us-central1
student@instance-1:~$ export INSTANCE_IP=$(gcloud sql instances list --filter=name:$INSTANCE_NAME --format="value(PRIMARY_ADDRESS)")
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=>
SSH 接続を維持したまま psql セッションを終了します。
exit
想定されるコンソール出力:
postgres=> exit student@instance-1:~$
6. データベースを初期化する
クライアント VM をプラットフォームとして使用し、データベースにデータを入力してアプリケーションをホストします。最初のステップは、データベースを作成してデータを入力することです。
データベースを作成する
MySQL
「assistantdemo」という名前のデータベースを作成します。
GCE VM セッションで、次のコマンドを実行します。
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD -e "CREATE DATABASE assistantdemo"
想定されるコンソール出力(出力なし):
student@instance-1:~$ mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD -e "CREATE DATABASE assistantdemo" student@instance-1:~$
PostgreSQL
「assistantdemo」という名前のデータベースを作成します。
GCE VM セッションで、次のコマンドを実行します。
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"
想定されるコンソール出力:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo" CREATE DATABASE student@instance-1:~$
pgvector 拡張機能を有効にします。
psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"
想定されるコンソール出力(出力なし):
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector" CREATE EXTENSION student@instance-1:~$
Python 環境を準備する
次は GitHub リポジトリから準備した Python スクリプトを使用しますが、その前に必要なソフトウェアをインストールする必要があります。
GCE VM で次のコマンドを実行します。
sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
想定されるコンソール出力:
student@instance-1:~$ sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl
Suggested packages:
git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ed diffutils-doc
The following NEW packages will be installed:
git git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl python3.11-venv
0 upgraded, 9 newly installed, 0 to remove and 2 not upgraded.
Need to get 12.4 MB of archives.
After this operation, 52.2 MB of additional disk space will be used.
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B]
...redacted...
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 23.0.1
Uninstalling pip-23.0.1:
Successfully uninstalled pip-23.0.1
Successfully installed pip-24.0
(.venv) student@instance-1:~$
Python のバージョンを確認します。
GCE VM で次のコマンドを実行します。
python -V
想定されるコンソール出力:
(.venv) student@instance-1:~$ python -V Python 3.11.2 (.venv) student@instance-1:~$
構成ファイルを準備する
Retrieval サービスとサンプル アプリケーションのコードを含む GitHub リポジトリのクローンを作成します。
GCE VM で次のコマンドを実行します。
git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git
想定されるコンソール出力:
student@instance-1:~$ git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git Cloning into 'genai-databases-retrieval-app'... remote: Enumerating objects: 525, done. remote: Counting objects: 100% (336/336), done. remote: Compressing objects: 100% (201/201), done. remote: Total 525 (delta 224), reused 179 (delta 135), pack-reused 189 Receiving objects: 100% (525/525), 46.58 MiB | 16.16 MiB/s, done. Resolving deltas: 100% (289/289), done.
MySQL
GCE VM で次のコマンドを実行します。
cd ~/genai-databases-retrieval-app/retrieval_service
cp example-config-cloudsql.yml config.yml
cp example-config-cloudsql.yml config.yml
sed -i s/engine/mysql/g config.yml
sed -i s/my-project/$PROJECT_ID/g config.yml
sed -i s/my-region/$REGION/g config.yml
sed -i s/my-instance/$INSTANCE_NAME/g config.yml
sed -i s/my-password//g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/root/g config.yml
cat config.yml
想定されるコンソール出力:
student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service cp example-config-cloudsql.yml config.yml sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml sed -i s/my-password/$CLOUDSQL_PASSWORD/g config.yml sed -i s/my_database/assistantdemo/g config.yml sed -i s/my-user/postgres/g config.yml cat config.yml host: 0.0.0.0 # port: 8080 datastore: # Example for MySQL kind: "cloudsql-mysql" host: 10.65.0.2 # port: 5432 database: "assistantdemo" user: "root" password: "P9..."
Postgres
GCE VM で次のコマンドを実行します。
cd ~/genai-databases-retrieval-app/retrieval_service
cp example-config-cloudsql.yml config.yml
sed -i s/engine/postgres/g config.yml
sed -i s/my-project/$PROJECT_ID/g config.yml
sed -i s/my-region/$REGION/g config.yml
sed -i s/my-instance/$INSTANCE_NAME/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml
想定されるコンソール出力:
student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service cp example-config-cloudsql.yml config.yml sed -i s/engine/postgres/g config.yml sed -i s/my-project/$PROJECT_ID/g config.yml sed -i s/my-region/$REGION/g config.yml sed -i s/my-instance/$INSTANCE_NAME/g config.yml sed -i s/my-password/$CLOUDSQL_PASSWORD/g config.yml sed -i s/my_database/assistantdemo/g config.yml sed -i s/my-user/postgres/g config.yml cat config.yml host: 0.0.0.0 # port: 8080 datastore: # Example for Postgres kind: "cloudsql-postgres" host: 10.65.0.2 # port: 5432 database: "assistantdemo" user: "postgres" password: "P9..."
データベースにデータを入力する
サンプル データセットをデータベースに入力します。最初のコマンドは、必要なすべてのパッケージを Python 仮想環境に追加し、2 番目のコマンドはデータベースにデータを取り込みます。
GCE VM で次のコマンドを実行します。
cd ~/genai-databases-retrieval-app/retrieval_service
pip install -r requirements.txt
python run_database_init.py
想定されるコンソール出力(秘匿化済み):
student@instance-1:~/genai-databases-retrieval-app/retrieval_service$ pip install -r requirements.txt python run_database_init.py Collecting asyncpg==0.28.0 (from -r requirements.txt (line 1)) Obtaining dependency information for asyncpg==0.28.0 from https://files.pythonhosted.org/packages/77/a4/88069f7935b14c58534442a57be3299179eb46aace2d3c8716be199ff6a6/asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata Downloading asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB) Collecting fastapi==0.101.1 (from -r requirements.txt (line 2)) ... database init done. student@instance-1:~/genai-databases-retrieval-app/retrieval_service$
7. 検索サービスを Cloud Run にデプロイする
これで、検索サービスを Cloud Run にデプロイできるようになりました。このサービスは、データベースを操作し、AI アプリケーションからのリクエストに基づいてデータベースから必要な情報を抽出します。
サービス アカウントを作成する
検索サービス用のサービス アカウントを作成し、必要な権限を付与します。
上部の「+」記号を選択して、別の Cloud Shell タブを開きます。

新しい Cloud Shell タブで、次のコマンドを実行します。
export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create retrieval-identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudsql.client"
想定されるコンソール出力:
student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity Created service account [retrieval-identity].
タブに実行コマンド「exit」を入力して、タブを閉じます。
exit
検索サービスをデプロイする
サービスをデプロイし SSH を使用して VM に接続している最初のタブで続けます。
VM SSH セッションで、次のコマンドを実行します。
cd ~/genai-databases-retrieval-app
gcloud alpha run deploy retrieval-service \
--source=./retrieval_service/\
--no-allow-unauthenticated \
--service-account retrieval-identity \
--region us-central1 \
--network=default \
--quiet
想定されるコンソール出力:
student@instance-1:~/genai-databases-retrieval-app$ gcloud alpha run deploy retrieval-service \
--source=./retrieval_service/\
--no-allow-unauthenticated \
--service-account retrieval-identity \
--region us-central1 \
--network=default
This command is equivalent to running `gcloud builds submit --tag [IMAGE] ./retrieval_service/` and `gcloud run deploy retrieval-service --image [IMAGE]`
Building using Dockerfile and deploying container to Cloud Run service [retrieval-service] in project [gleb-test-short-003] region [us-central1]
X Building and deploying... Done.
✓ Uploading sources...
✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/6ebe74bf-3039-4221-b2e9-7ca8fa8dad8e?project=1012713954588].
✓ Creating Revision...
✓ Routing traffic...
Setting IAM Policy...
Completed with warnings:
Setting IAM policy failed, try "gcloud beta run services remove-iam-policy-binding --region=us-central1 --member=allUsers --role=roles/run.invoker retrieval-service"
Service [retrieval-service] revision [retrieval-service-00002-4pl] has been deployed and is serving 100 percent of traffic.
Service URL: https://retrieval-service-onme64eorq-uc.a.run.app
student@instance-1:~/genai-databases-retrieval-app$
サービスを確認する
これで、サービスが正しく実行され、VM がエンドポイントにアクセスできるかどうかを確認できます。gcloud ユーティリティを使用して、検索サービスのエンドポイントを取得します。または、Cloud コンソールで確認し、curl コマンドの "$(gcloud run services list –filter="(retrieval-service)" をその値に置き換えることもできます。
VM SSH セッションで、次のコマンドを実行します。
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
想定されるコンソール出力:
student@instance-1:~/genai-databases-retrieval-app$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
{"message":"Hello World"}student@instance-1:~/genai-databases-retrieval-app$
「Hello World」というメッセージが表示されたら、サービスが稼働し、リクエストを処理していることを意味します。
8. サンプル アプリケーションをデプロイする
検索サービスが稼働したので、このサービスを利用するサンプル アプリケーションをデプロイできます。アプリケーションは、VM や Cloud Run、Kubernetes などの他のサービス、またはノートパソコン上のローカルにデプロイできます。ここでは、VM にデプロイする方法について説明します。
環境を準備する
同じ SSH セッションを使用して、引き続き VM で作業します。アプリケーションを実行するには、いくつかの Python モジュールを追加する必要があります。コマンドは、同じ Python 仮想環境のアプリケーション ディレクトリから実行されます。
VM SSH セッションで、次のコマンドを実行します。
cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt
想定される出力(秘匿化済み):
student@instance-1:~$ cd ~/genai-databases-retrieval-app/llm_demo pip install -r requirements.txt Collecting fastapi==0.104.0 (from -r requirements.txt (line 1)) Obtaining dependency information for fastapi==0.104.0 from https://files.pythonhosted.org/packages/db/30/b8d323119c37e15b7fa639e65e0eb7d81eb675ba166ac83e695aad3bd321/fastapi-0.104.0-py3-none-any.whl.metadata Downloading fastapi-0.104.0-py3-none-any.whl.metadata (24 kB) ...
クライアント ID を準備する
アプリケーションの予約機能を使用するには、Cloud Console を使用して OAuth 2.0 クライアント ID を準備する必要があります。予約ではクライアント認証情報を使用してデータベースに予約データを記録するため、アプリケーションにログインしたときに発生します。
Cloud コンソールで [API とサービス] に移動し、[OAuth 同意画面] をクリックして、[内部] ユーザーを選択します。

[作成] を押して、次の画面の指示に沿って操作します。

[アプリ名] や [ユーザー サポートのメールアドレス] などの必須項目を入力する必要があります。また、同意画面に表示するドメインを追加したり、[デベロッパーの連絡先情報] を入力したりすることもできます。

次に、ページ下部にある [保存して次へ] ボタンをクリックすると、次のページに進みます。

スコープを指定する場合を除き、変更する必要はありません。最後に、[保存して次へ] ボタンをもう一度押して確定します。これで、アプリケーションの同意画面が設定されます。
次のステップは、クライアント ID の作成です。左側のパネルで [認証情報] をクリックすると、OAuth2 の認証情報が表示されます。

ここで、上部の [認証情報を作成] をクリックし、[OAuth クライアント ID] を選択します。別の画面が開きます。

アプリケーション タイプのプルダウン リストから [ウェブ アプリケーション] を選択し、アプリケーション URI(ポートは省略可)を [承認済みの JavaScript 生成元] として入力します。また、認証ポップアップ画面を使用できるようにするには、アプリケーション ホストの末尾に「/login/google」を追加して、「承認済みのリダイレクト URI」に追加する必要があります。上の図では、ベース アプリケーション URI として http://localhost を使用していることがわかります。
[作成] ボタンを押すと、クライアントの認証情報を含むポップアップ ウィンドウが表示されます。

後でアプリケーションで使用するために、クライアント ID(必要に応じてクライアント シークレット)が必要になります。
アシスタント アプリケーションを実行する
アプリケーションを起動する前に、いくつかの環境変数を設定する必要があります。フライトや空港の設備を検索するなどのアプリケーションの基本的な機能には、アプリケーションを検索サービスに接続する BASE_URL のみが必要です。これは gcloud コマンドを使用して取得できます。
VM SSH セッションで、次のコマンドを実行します。
export BASE_URL=$(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
想定される出力(秘匿化済み):
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export BASE_URL=$(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
フライトの予約や変更など、アプリの高度な機能を使用するには、Google アカウントを使用してアプリにログインする必要があります。そのためには、クライアント ID の準備の章で説明した OAuth クライアント ID を使用して、CLIENT_ID 環境変数を指定する必要があります。
export CLIENT_ID=215....apps.googleusercontent.com
想定される出力(秘匿化済み):
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export CLIENT_ID=215....apps.googleusercontent.com
これで、アプリケーションを実行できるようになりました。
python run_app.py
予想される出力:
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ python main.py INFO: Started server process [28565] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)
アプリケーションに接続する
VM で実行されているアプリケーションに接続するには、いくつかの方法があります。たとえば、VPC のファイアウォール ルールを使用して VM でポート 8081 を開いたり、パブリック IP を使用してロードバランサを作成したりできます。ここでは、ローカルポート 8080 を VM ポート 8081 に変換する VM への SSH トンネルを使用します。
ローカルマシンからの接続
ローカルマシンから接続する場合は、SSH トンネルを実行する必要があります。これは、gcloud compute ssh を使用して行うことができます。
gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8081:localhost:8081
予想される出力:
student-macbookpro:~ student$ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081 Warning: Permanently added 'compute.7064281075337367021' (ED25519) to the list of known hosts. Linux instance-1.us-central1-c.c.gleb-test-001.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
これで、ブラウザを開いて http://localhost:8081 を使用してアプリケーションに接続できます。アプリケーション画面が表示されます。

Cloud Shell から接続する
または、Cloud Shell を使用して接続することもできます。上部の「+」記号を選択して、別の Cloud Shell タブを開きます。

新しい Cloud Shell タブで、gcloud コマンドを実行して VM へのトンネリングを開始します。
gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
「Cannot assign requested address」エラーが表示されますが、無視してください。
想定される出力は次のとおりです。
student@cloudshell:~ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081 bind [::1]:8081: Cannot assign requested address inux instance-1.us-central1-a.c.gleb-codelive-01.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat May 25 19:15:46 2024 from 35.243.235.73 student@instance-1:~$
Cloud Shell でポート 8080 が開き、「ウェブでプレビュー」に使用できます。
Cloud Shell の右上にある [ウェブでプレビュー] ボタンをクリックし、プルダウン メニューから [ポート 8080 でプレビュー] を選択します。

ウェブブラウザで新しいタブが開き、アプリケーションのインターフェースが表示されます。[Cymbal Air Customer Service Assistant] ページが表示されます。ページのアドレスバーにプレビュー ページの URI が表示されます。末尾の「/?authuser=0&redirectedPreviously=true」の部分を削除する必要があります。

URI の最初の部分(「https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/」など)は、ブラウザ ウィンドウに残し、「クライアント ID を準備する」の章で作成した認証情報の「承認済みの JavaScript の生成元」と「承認済みのリダイレクト URI」として指定します。このとき、元々指定されていた http://localhost:8080 の値を置き換えるか、追加します。上の値は「https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev」、下の値は「https://8080-cs-35704030349-default.cs-us-east1-vpcf.cloudshell.dev/login/google」のようになります。

アプリケーションにログインする
すべてが設定され、アプリケーションが開いたら、アプリケーション画面の右上にある [ログイン] ボタンを使用して認証情報を入力します。これは省略可能で、アプリケーションの予約機能を試す場合にのみ必要です。

ポップアップ ウィンドウが開き、認証情報を選択できます。
ログインすると、アプリケーションの準備が完了し、ウィンドウの下部にあるフィールドにリクエストを投稿できるようになります。
このデモでは、Cymbal Air のカスタマー サービス アシスタントを紹介します。Cymbal Air は架空の航空会社です。このアシスタントは、旅行者がフライトを管理したり、サンフランシスコ国際空港(SFO)にある Cymbal Air のハブに関する情報を検索したりできるようにする AI の chatbot です。
ログインせずに(CLIENT_ID なしで)、次のようなユーザーの疑問の解決に役立ちます。
デンバー行きの次のフライトはいつですか?
C28 ゲートの周辺に高級ショップはありますか?
A6 ゲート付近でコーヒーを飲める場所はどこですか?
ギフトはどこで購入できますか?
午前 10 時 35 分発のデンバー行きのフライトを予約してください
アプリにログインすると、フライトの予約や、割り当てられた座席が窓側か通路側かを確認するなどの機能を利用できます。

このアプリケーションは、最新の Google 基盤モデルを使用して、レスポンスを生成し、運用中の Cloud SQL データベースのフライトと設備に関する情報で拡張しています。このデモ アプリケーションについて詳しくは、プロジェクトの GitHub ページをご覧ください。
9. 環境をクリーンアップする
すべてのタスクが完了したら、環境をクリーンアップできます。
Cloud Run サービスを削除する
Cloud Shell で、次のコマンドを実行します。
gcloud run services delete retrieval-service --region us-central1
想定されるコンソール出力:
student@cloudshell:~ (gleb-test-short-004)$ gcloud run services delete retrieval-service --region us-central1 Service [retrieval-service] will be deleted. Do you want to continue (Y/n)? Y Deleting [retrieval-service]...done. Deleted service [retrieval-service].
Cloud Run サービスのサービス アカウントを削除します。
Cloud Shell で、次のコマンドを実行します。
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet
想定されるコンソール出力:
student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-222] student@cloudshell:~ (gleb-test-short-004)$ gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet deleted service account [retrieval-identity@gleb-test-short-004.iam.gserviceaccount.com] student@cloudshell:~ (gleb-test-short-004)$
Cloud SQL インスタンスを削除します。
ラボの終了時に Cloud SQL インスタンスを破棄します。
接続が切断され、以前の設定がすべて失われた場合は、Cloud Shell でプロジェクトと環境変数を定義します。
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
インスタンスを削除します。
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
想定されるコンソール出力:
student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID All of the instance data will be lost when the instance is deleted. Do you want to continue (Y/n)? y Deleting Cloud SQL instance...done. Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].
これで、VM を破棄できます。
GCE VM を削除する
Cloud Shell で、次のコマンドを実行します。
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
想定されるコンソール出力:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
Deleted
GCE VM と Retrieval サービスのサービス アカウントを削除します。
Cloud Shell で、次のコマンドを実行します。
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet
想定されるコンソール出力:
student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project) gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet Your active configuration is: [cloudshell-222] deleted service account [compute-aip@gleb-test-short-004.iam.gserviceaccount.com] student@cloudshell:~ (gleb-test-short-004)$
10. 完了
以上で、この Codelab は完了です。
学習した内容
- Cloud SQL インスタンスを作成する方法
- Cloud SQL インスタンスに接続する方法
- GenAI Databases Retrieval Service の構成とデプロイ方法
- デプロイされたサービスを使用してサンプル アプリケーションをデプロイする方法