Cloud Run の関数と Gemini を使用して、Cloud Storage バケットにアップロードされたテキスト ファイルを要約する方法

1. はじめに

概要

Cloud Run functions は、使い慣れた GCF イベント処理のパラダイムと関数シグネチャを使用してワークロードをデプロイする新しい方法です。Cloud Run 関数を使用すると、独自のビルドプロセスとデプロイ構成を使用する代わりに、Cloud Run で作成された基盤となる Service を直接制御できます。

このセクションでは、Gemini を使用して Cloud Storage バケットにアップロードされたプレーンテキスト ファイルを要約するイベントドリブン関数を Python でデプロイする方法について説明します。

学習内容

  • オブジェクトが GCS バケットにアップロードされるたびにトリガーされるイベント ドリブンの Cloud Run 関数をデプロイする方法
  • Cloud Storage からイベントを受信して Cloud Run 関数を呼び出すための適切なロールを持つサービス アカウントを作成する方法
  • Gemini を使用して Cloud Storage にアップロードされたプレーンテキスト ドキュメントを要約する方法

2. 環境変数を設定し、API を有効にする

gcloud CLI を更新する

この Codelab には、gcloud CLI の最新バージョンが必要です。CLI を更新するには、

gcloud components update

API を有効にする

この Codelab を使用する前に、いくつかの API を有効にする必要があります。この Codelab では、次の API を使用する必要があります。これらの API を有効にするには、次のコマンドを実行します。

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com \
    eventarc.googleapis.com \
    aiplatform.googleapis.com

環境変数を設定する

この Codelab 全体で使用する環境変数を設定できます。

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
SERVICE_NAME=crf-vertexai-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. ストレージ バケットとサービス アカウントを作成する

Storage バケットを作成する

Cloud Storage バケットを作成するには、次のコマンドを実行します。

gsutil mb -l us-central1 gs://$BUCKET_NAME

サービス アカウントを作成する

この例では、必要な EventArc 権限と Cloud Run 起動元ロールを持つサービス アカウントを作成し、Cloud Storage からイベントを受信して Cloud Run 関数を呼び出します。

まず、サービス アカウントを作成します。

SERVICE_ACCOUNT="crf-vertexai-codelab"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

次に、トリガーがイベント プロバイダからイベントを受信できるように、プロジェクトの Eventarc イベント受信者のロール(roles/eventarc.eventReceiver)を Eventarc トリガーに関連付けられたサービス アカウントに付与します。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

次に、サービス アカウントに Cloud Run 起動元ロールを付与して、関数を呼び出せるようにします。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

次に、サービス アカウントに AI Platform ユーザーロールを付与して、Gemini を呼び出せるようにします。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/aiplatform.user"

サービス アカウントに Storage オブジェクト閲覧者ロールを付与して、ファイルにアクセスできるようにします。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/storage.objectViewer"

Cloud Pub/Sub で ID トークンを作成するには、プロジェクトに roles/iam.serviceAccountTokenCreator ロールが必要です。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role=roles/iam.serviceAccountTokenCreator

Cloud Storage 経由でイベントを受け取るには、トリガーに Google Cloud Storage サービス アカウントに roles/pubsub.publisher ロールが付与されている必要があります。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com \
  --role=roles/pubsub.publisher

4. 関数を作成してデプロイする

まず、ソースコード用のディレクトリを作成し、そのディレクトリに移動します。

mkdir $SERVICE_NAME && cd $_

次に、次の内容の requirements.txt ファイルを作成します。

functions-framework==3.*
google-cloud-aiplatform==1.63.*
google-cloud-storage==2.16.*

次に、次の内容の main.py ファイルを作成します。

import functions_framework
import vertexai
from vertexai.generative_models import GenerativeModel
from google.cloud import storage

vertexai.init(project="<YOUR_PROJECT_ID>", location="us-central1")

model = GenerativeModel(
    model_name="gemini-1.5-pro-001",
    system_instruction=[
        "Summarize the following document in a single sentence. Do not respond with more than one sentence.",
    ],
)

# Triggered by a change in a storage bucket
@functions_framework.cloud_event
def hello_gcs(cloud_event):
    data = cloud_event.data

    # download the file
    storage_client = storage.Client()
    blob = storage_client.bucket(data["bucket"]).get_blob(data["name"])
    #print(blob)

    doc = blob.download_as_text()
    contents = [doc]

    response = model.generate_content(contents)
    print(response.text)

    print(f"Response from Model: {response.text}")

これで、次のコマンドを実行して Cloud Run 関数をデプロイできるようになりました。

gcloud beta run deploy $SERVICE_NAME \
      --source . \
      --function hello_gcs \
      --region $REGION \
      --no-allow-unauthenticated \
      --service-account $SERVICE_ACCOUNT_ADDRESS

次の点にご注意ください。

  • --source フラグを使用して、実行可能なコンテナベースのサービスに関数をビルドするよう Cloud Run に指示します
  • --function フラグ(新規)は、新しいサービスのエントリ ポイントを、呼び出される関数シグネチャに設定するために使用されます。
  • (省略可)関数が一般公開で呼び出されないようにする --no-allow-unauthenticated

「Deploying from source requires an Artifact Registry Docker repository to store built containers. [<YOUR_REGION>] リージョンに [cloud-run-source-deploy] という名前のリポジトリが作成されます。」デフォルトの「yes」をそのまま使用してリポジトリを作成します。

次のコマンドを実行すると、新しいサービス crf-vertexai-codelab を表示できます。

gcloud beta run services describe $SERVICE_NAME --region $REGION

5. イベントを作成する

Google Cloud Storage でオブジェクトがファイナライズされるたびに関数にメッセージを送信する Eventarc トリガーを作成できます。

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

--event-filters フラグでは、バケット名に gs:// 接頭辞を使用しないでください。

If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent.」というエラーが表示された場合は、数分待ってからもう一度お試しください。

Eventarc を使用して Cloud Storage からトリガー サービスを設定する詳細なチュートリアルについては、Cloud Run のドキュメント(https://cloud.google.com/run/docs/tutorials/eventarc)をご覧ください。

6. 関数をテストする

関数をデプロイし、トリガーを作成したので、関数を呼び出す準備が整いました。

ファイルを作成して Cloud Storage バケットにアップロードします。これは、Cloud コンソールのウェブ インターフェースから、または gsutil CLI ツールを使用して行えます。

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

ファイルが正常にアップロードされると、イベントが生成され、関数は Gemini を呼び出して書式なしテキスト ファイルを要約します。概要がログに出力されます。

Cloud Run サービスの Cloud コンソールでログを表示するか、次のコマンドを実行します。

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME AND textPayload: Response"

たとえば、限定公開プレビュー用の Cloud Run 関数ユーザーガイドの書式なしテキスト ファイルをアップロードすると、ログに次のように出力されます。

Response from Model: Cloud Run functions offer a new way to deploy serverless workloads with familiar Google Cloud Functions paradigms while providing control over the underlying Cloud Run service. 

7. 完了

以上で、この Codelab は完了です。

Cloud Run functions のドキュメントを確認することをおすすめします。

学習した内容

  • オブジェクトが GCS バケットにアップロードされるたびにトリガーされるイベントドリブンの Cloud Run 関数をデプロイする方法
  • Cloud Storage からイベントを受信して Cloud Run 関数を呼び出すための適切なロールを持つサービス アカウントを作成する方法
  • Gemini を使用して Cloud Storage にアップロードされたプレーンテキスト ドキュメントを要約する方法

8. クリーンアップ

誤って課金されないようにするには(たとえば、この Cloud Run サービスが 無料 tier の Cloud Run の月間呼び出し割り当てを超える回数で誤って呼び出された場合など)、Cloud Run サービスを削除するか、手順 2 で作成したプロジェクトを削除します。

Cloud Run サービスを削除するには、Cloud Run Cloud コンソール(https://console.cloud.google.com/run/)に移動し、この Codelab で作成した crf-vertexai-codelab サービスを削除します。

プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、手順 2 で作成したプロジェクトを選択して [削除] を選択します。プロジェクトを削除する場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストが表示されます。