イベントドリブン Cloud Run 関数を使ってみる

1. はじめに

概要

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

Cloud Run functions では、Cloud Run ソース デプロイのシンプルな UX を提供し、デベロッパーが Cloud Run 構成を使用してワークロードを完全に制御できるようにします。

このセクションでは、Node でイベント ドリブン関数をデプロイする方法について説明します。Google Cloud Storage バケットでオブジェクトがファイナライズされるたびにトリガーされる関数をデプロイします。

この Codelab では、以下の例で nodejs サンプルを使用します。ただし、Cloud Functions(第 2 世代)のコードサンプルは、任意の言語で使用できます。

学習内容

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

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

環境変数を設定する

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

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

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-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 起動元ロールを持つサービス アカウントを作成します。

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

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
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

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

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

mkdir ../$SERVICE_NAME && cd $_

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

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

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

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

次のコマンドを実行して、Cloud Run 関数をデプロイします。

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

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

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

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

gcloud beta run services describe $SERVICE_NAME

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

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

  • gcs-function-trigger はトリガーの名前です
  • crf-event-codelab は、関数がデプロイされる Cloud Run サービスの名前です。
  • –event-filters フラグの場合、バケット名に gs:// 接頭辞を使用しないでください。

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

6. 関数をテストする

デプロイが完了すると、サービス URL が表示されます。関数を呼び出すには、次のように、ID トークンまたは Cloud Run 起動元のロールを持つプリンシパルの ID トークンを使用して、認証済みリクエストを送信する必要があります。

# get the Service URL
SERVICE_URL="$(gcloud run services describe $SERVICE_NAME --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

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

ファイルを作成して、Cloud Storage バケットにアップロードします。この操作は、Cloud Console ウェブ インターフェースまたは gsutil CLI ツールを使用して行うことができます。

echo "hello world" > test.txt
gsutil cp test.txt gs://$BUCKET_NAME

ファイルが正常にアップロードされると、イベントが生成され、関数によってオブジェクトに関する基本的な情報(ファイル名など)が出力されます。この出力は、Cloud Console の関数のログエントリで確認できます。または、gcloud CLI を使用してこの出力をクエリすることもできます。

gcloud logging read "resource.labels.service_name=$SERVICE_NAME AND textPayload: File" --format=json 

次のような内容が出力されます

"textPayload": "File: test.txt"

7. 完了

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

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

学習した内容

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

8. クリーンアップ

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

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

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