1. はじめに
概要
ワーカープールは、pull キューなどのリクエスト以外のワークロード用に特別に設計された Cloud Run リソースです。ワーカープールには次の機能がないことに注意してください。
- エンドポイントまたは URL がない
- デプロイされたコンテナは、ポートでリクエストをリッスンする必要がない
- 自動スケーリングなし
この Codelab では、Pub/Sub pull サブスクリプションからメッセージを継続的に取得するワーカープールを作成します。ドキュメントとこのコード例で、Pub/Sub pull サブスクリプションの詳細を確認する。
学習内容
- Cloud Run ワーカープールを作成してデプロイする方法
- Pull ベースの Pub/Sub サブスクリプションからメッセージを取得する方法
2. 設定と要件
まず、この Codelab の環境変数を設定します。
export PROJECT_ID=<your_project_id>
export REGION=<your_region>
export WORKER_POOL_NAME=codelab-workers-pubsub
export SERVICE_ACCOUNT=worker-pools-sa
export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
export TOPIC=pull-pubsub-topic
次に、プロジェクト ID を使用するように gcloud を構成します。
gcloud config set project $PROJECT_ID
この Codelab を使用する前に、次のコマンドを実行して次の API を有効にします。
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
次のコマンドを実行してサービス アカウントを作成します。
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
最後に、Cloud Run サービス アカウントに PubSub へのアクセス権を付与します。
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Cloud Run ワーカープールを作成する
まず、ワーカープール コード用のディレクトリを作成します。
mkdir codelab-worker-pools
cd codelab-worker-pools
次に、package.json というファイルを作成します。
{
"name": "codelab-worker-pools",
"version": "1.0.0",
"description": "A codelab example of a Cloud Run worker pool retrieving messages from a Pull-based PubSub subscription",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": ">=22.0.0"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@google-cloud/pubsub": "^5.1.0"
}
}
次に、index.js というファイルを作成します。
'use strict';
const subscriptionNameOrId = 'codelab-subscription';
const { PubSub } = require('@google-cloud/pubsub');
// Creates a Pub/Sub client; cache this for further use.
const pubSubClient = new PubSub();
// References an existing subscription.
const subscription = pubSubClient.subscription(subscriptionNameOrId);
// This function is called when a shutdown signal is received.
const handleShutdown = async (signal) => {
console.log(`\n${signal} signal caught. Shutting down gracefully...`);
try {
// 1. Stop listening for new messages. The `close()` method returns a Promise.
console.log('Closing Pub/Sub subscription...');
await subscription.close();
console.log('Pub/Sub subscription closed.');
// 2. Add any other cleanup logic here, like closing database connections.
} catch (err) {
console.error('Error during graceful shutdown:', err);
} finally {
console.log('Worker Pool exited.');
process.exit(0);
}
};
// Listen for termination signals.
// SIGINT handles Ctrl+C locally.
// SIGTERM handles signals from services like Cloud Run.
process.on('SIGINT', () => handleShutdown('SIGINT'));
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
// ------------------ Pub/Sub Message Handling ------------------
// Create an event handler to process incoming messages.
const messageHandler = message => {
console.log(`Received message ${message.id}:`);
console.log(`\tData: ${message.data}`);
console.log(`\tAttributes: ${JSON.stringify(message.attributes)}`);
// Ack the message so it is not sent again.
message.ack();
};
// Register the message handler and listen for messages.
subscription.on('message', messageHandler);
console.log(
`Worker started. Listening for messages on "${subscriptionNameOrId}".`
);
console.log('If running locally, press Ctrl+C to quit.');
// The application will now listen for messages indefinitely until a shutdown
// signal is received.
4. ワーカープールをデプロイする
次のコマンドを実行して、Cloud Run ワーカープールを作成します。
gcloud beta run worker-pools deploy $WORKER_POOL_NAME \
--region=$REGION \
--source . \
--service-account $SERVICE_ACCOUNT_EMAIL
このコマンドは、ソースからイメージをビルドしてジョブをデプロイします。完了するまでに数分かかります。
5. PubSub にメッセージをパブリッシュする
Pub/Sub トピックを作成する
gcloud pubsub topics create $TOPIC
Pub/Sub pull サブスクリプションを作成する
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
次のコマンドを実行して、PubSub トピックにメッセージをパブリッシュします。
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
ワーカープールのログを確認する
gcloud logging read 'resource.type="cloud_run_worker_pool" AND resource.labels.worker_pool_name="'$WORKER_POOL_NAME'" AND resource.labels.location="'$REGION'"' --limit 10
ログに Hello Worker Pools が表示されます。
6. ワーカープールを削除します。
ワーカープールは継続的に実行されるため、ワーカープールを削除する必要があります。
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. 完了
以上で、この Codelab は完了です。
Cloud Run のドキュメントを確認することをおすすめします。
学習した内容
- Cloud Run ワーカープールを作成してデプロイする方法
- Pull ベースの Pub/Sub サブスクリプションからメッセージを取得する方法
8. クリーンアップ
Cloud Run ワーカープールを削除するには、https://console.cloud.google.com/run で Cloud Run Cloud Console に移動し、codelab-workers-pubsub ワーカープールを削除します。
プロジェクト全体を削除するには、[リソースの管理] に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除した場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。