Cloud Run Jobsでジョブの実行が失敗したときに通知してほしい
先日、Cloud Run Jobsを使ってジョブを実行していて、正常に動作したジョブは問題ないのですが失敗したときはWebhook通知してほしいなと思うことがありました。
ただ、Cloud Run Jobs自体に通知を送る機能がないため、なにかいい方法ないか調べていましたが、Cloud Run Jobsが2023年4月26日と割と最近に一般提供開始されていて、似たようなことやっている情報がありませんでした。
参考:
あらゆるニーズに応えるサーバーレス: Cloud Run ジョブと第 2 世代の実行環境が一般提供に
Cloud Monitoringのアラートでmetric を「Cloud Run Job」>「Job」>「Completed Executions」と選択するとfailed のモニタリングができます。
ただ、ジョブの実行IDが表示されないのでこの方法は今回使いません。
幸い、ジョブを実行するとCloud Loggingにログを出力してくれるので、このログの内容を検知して、Webhook通知を実現していこうと思います。
利用するサービス
- Cloud Run Jobs
- Cloud Logging
- Cloud Pub/Sub
- Cloud Functions
上記のサービスを利用して構成を組んでいきます。
前提として、Cloud Run Jobsでジョブの作成は完了しているものとします。
作業
1. コマンドが失敗するようする
Cloud Run Jobsであえてコマンドが失敗するようにしておきます。
2. ログルーター シンクを作成
ログルーターでシンクの作成をします。
シンクの宛先
シンク サービスの選択でPub/Sub トピックを指定しておきます。
「トピックを作成する」からトピックを作成して選択します。
シンクに含めるログの選択
ここでCloud Run Jobsのエラーログをフィルターするクエリを入力します。
resource.type = "cloud_run_job"
resource.labels.job_name = "ジョブの名前"
resource.labels.location = "リージョン"
protoPayload.serviceName="run.googleapis.com"
severity=ERROR
入力が完了したらシンクの作成をします。
3. Cloud Functionsを使って通知処理を作成する
Pub/Subのコンソールから先ほど作ったトピックの詳細を表示します。
「Cloud Functions の関数をトリガー」から関数を作成します。
ソースコードを編集していきますが今回はNode.js 18のランタイムを使います。
const webhookUrl = "Google Chat の Webhook URL";
async function webhookSend(eventDate) {
const { job_name } = eventDate.resource.labels;
const execution_name = eventDate.labels["run.googleapis.com/execution_name"];
const message = {
text: `Cloud Run Jobs でエラーが発生しました
ジョブ: ${job_name}
実行ID: ${execution_name}`,
};
await fetch(webhookUrl, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(message),
});
}
/*
* Triggered from a message on a Cloud Pub/Sub topic.
*
* @param {!Object} event Event payload.
* @param {!Object} context Metadata for the event.
*/
exports.helloPubSub = async (event, context) => {
// event.dataの中身はbase64のためデコードする必要があります
const eventDate = JSON.parse(Buffer.from(event.data, "base64").toString());
await webhookSend(eventDate);
};
4. 通知の確認
Cloud Run Jobsを実行して失敗したとき通知が送られているか確認します。
以下のように通知されます。
おわりに
ジョブの実行IDが表示できる方法で通知することができました。
実行IDがあれば、
https://console.cloud.google.com/run/jobs/executions/details/${リージョン}/${実行ID}/logs?hl=ja&project=${プロジェクトID}
のようにすることで、ログまでのリンクを作成することができます。
ログに直接飛べるので状態の確認が少し楽になりますね。
プロフィール
-
元フロントエンドエンジニア
バックエンドエンジニアも少し経てDevOps Leadへ