#gcp #cloudrun
Cloud Runはトラフィックに合わせてインスタンスの数を調整してくれるので、低コストでWebサービスを運用することができる。
ただ趣味で開発しているようなアクセス頻度の低いWebサービスは、毎回すべてのインスタンスが止まってしまうため、アクセスする度に起動を待つことになりがち。
それでは使い物にならないので、Cloud Schedulerを活用し、 9:00-17:00
など指定した時間帯のみ最小インスタンス数を1にしている。
手順
- Pub/Subのトピックを作成
- Cloud Schedulerのジョブを作成
- Cloud Run関数を作成
※ 必要に応じて適切な権限でサービスアカウントを発行する
1. Pub/Subのトピックを作成
Cloud Schedulerで設定変更用のCloud Run関数をトリガーするために、まずはそれらを中継するPub/Subトピックを作成する。
オプションはすべて無効にし、トピックIDはrun-scalerとした。
2. Cloud Schedulerのジョブを作成
Cloud Schedulerで、Cloud Runサービスのスケールアウト、スケールインそれぞれのためのジョブを作成する。
スケールアウト
- 名前 / scale-out
- リージョン / asia-northeast1
- 頻度 / 0 7 ** *
- ※ 毎日7:00
- タイムゾーン / 日本標準時(JST)UTC+9
- ターゲットタイプ / Pub/Sub
- トピック / run-scaler
- メッセージ本文 / 1
- ※ 最小インスタンス数 = 1
スケールイン
- 名前 / scale-in
- リージョン / asia-northeast1
- 頻度 / 0 22 ** *
- ※ 毎日22:00
- タイムゾーン / 日本標準時(JST)UTC+9
- ターゲットタイプ / Pub/Sub
- トピック / run-scaler
- メッセージ本文 / 0
- ※ 最小インスタンス数 = 0
Cloud Run関数を作成する
運用しているCloud Runサービスの最小インスタンス数を変更するためのCloud Run関数を作成する。
- 関数名 / scaler
- リージョン / asia-northeast1
- トリガーのタイプ / Cloud Pub/Sub
- Cloud Pub/Subトピック / run-scaler
- ランタイム / Node.js 20
ソース
# package.json
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"@google-cloud/run": "^1.4.0"
}
}
// index.js
const functions = require('@google-cloud/functions-framework');
const { ServicesClient } = require('@google-cloud/run').v2;
functions.cloudEvent('scale', async cloudEvent => {
const base64value = cloudEvent.data.message.data;
const value = base64value ? parseInt(Buffer.from(base64value, 'base64'), 10) : 0;
const client = new ServicesClient();
const [service] = await client.getService({ name: "projects/{プロジェクトID}/locations/{リージョン}/services/{サービス名}" });
service.launchStage = "BETA";
service.scaling = { minInstanceCount: value };
const [operation] = await client.updateService({ service });
operation.promise();
});