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

1. はじめに

概要

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

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

このセクションでは、ノードにイベント ドリブン関数をデプロイする方法について説明します。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

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

この例では、必要な EventArc 権限と Cloud Run 起動元ロールを持つサービス アカウントを作成し、Cloud Storage からイベントを受信して 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 トリガーに関連付けられたサービス アカウントに、プロジェクトの Eventarc イベント受信者のロール(roles/eventarc.eventReceiver)を付与します。これにより、トリガーがイベント プロバイダからイベントを受信できるようになります。

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 フラグ(new)を使用して、新しいサービスのエントリポイントを、呼び出す関数シグネチャとして設定します。
  • (省略可)-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 サービスの名前です。
  • 使用する場合は、バケット名に接頭辞 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 の関数に関するドキュメントを確認することをおすすめします。

学習した内容

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

8. クリーンアップ

不注意による料金の発生(たとえば、この Cloud Run サービスが誤って無料枠の毎月の 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 を実行します。