1. はじめに
概要
Cloud Run functions は、使い慣れた GCF イベント処理パラダイムと関数シグネチャを使用してワークロードをデプロイする新しい方法です。Cloud Run functions では、Google の独自のビルドプロセスとデプロイ構成を使用する代わりに、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
サービス アカウントを作成する
この例では、Cloud Storage からイベントを受信して Cloud Run 関数を呼び出すために、必要な EventArc 権限と 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 Console ウェブ インターフェースまたは gsutil CLI ツールを使用して行うことができます。
gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME
ファイルが正常にアップロードされると、イベントが生成され、関数が Gemini を呼び出してプレーン テキスト ファイルを要約します。概要がログに出力されます。
Cloud Run サービスのログは、Cloud Console で表示するか、次のコマンドを実行して表示できます。
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME AND textPayload: Response"
たとえば、限定公開プレビュー用の Cloud Run functions ユーザーガイドのプレーン テキスト ファイルをアップロードすると、ログに次のように出力されます。
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 サービスが無料枠の Cloud Run 呼び出しの月間割り当てよりも多く呼び出された場合など)、Cloud Run サービスを削除するか、ステップ 2 で作成したプロジェクトを削除します。
Cloud Run サービスを削除するには、Cloud Run Cloud Console(https://console.cloud.google.com/run/)に移動し、この Codelab で作成した crf-vertexai-codelab サービスを削除します。
プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除した場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。