イベントドリブン 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 バケットとサービス アカウントを作成する

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-nodejs-event を表示できます。

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=crf-nodejs-event \
  --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-nodejs-event は、関数がデプロイされている 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 crf-nodejs-event --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 コンソール ウェブ インターフェースまたは gsutil CLI ツールを使用して行えます。

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

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

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

次の出力が表示されます。

"textPayload": "File: test.txt"

7. 完了

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

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

学習した内容

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

8. クリーンアップ

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

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

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