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}
のようにすることで、ログまでのリンクを作成することができます。
ログに直接飛べるので状態の確認が少し楽になりますね。