📝

個人開発用にSlack+CloudRun Jobsでログの集計結果を自動投稿する仕組みを整える

2022/06/12に公開

個人開発をやっていると日常のログ監視などは割と大きな負担なので自動化してしまいたいニーズが高まってくる。CloudRunJobsでSlackにログの集計結果を連携する仕組みを構築する。

バッチ実行用のDockerfileの準備

何はともあれバッチファイルを実行できるDockerイメージを生成する。今回はgcloud loggingでGCPもログを集計して、自作コマンドqmaでログを集計する。cargoを使いたいためにベースイメージとしてrustを利用しているが内容は適宜読み替えて問題無い。またコンテナ内でgcloudコマンドを使うためにgcloudのインストールと初期化も行っている。

FROM rust:1

ENV SERVICE_ACCOUNT=<GCPのサービスアカウント>
ENV PROJECT=<プロジェクト名>

# セットアップ
WORKDIR /app

#  依存ファイルのインストール
RUN apt-get update && apt-get install -y \
     jq apt-transport-https ca-certificates gnupg \
     curl python3-dev python3-pip \
     && rm -rf /var/lib/apt/lists/*
RUN cargo install qma
RUN pip3 install --upgrade pip
# gcloudのインストール
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | \
    tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \ 
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && \
    apt-get update -y && \
    apt-get install google-cloud-cli -y

# 必要なディレクトリをコピー
COPY ./ .

# gcloudの初期化
RUN gcloud auth activate-service-account ${SERVICE_ACCOUNT} --key-file=./secret.json --project=${PROJECT}

CMD ["bash", "-c", "./check.sh"]

次に実際に動かすバッチファイルを用意する。上のDockerfileにも記載があるがcheck.shというバッチファイルを用意する。Slack投稿用のURLはこちらのリンクの手順で取得できる。また投稿するJSONの仕様詳細は以下のリンクに記載があるので見ながらいい感じに整える。
https://api.slack.com/messaging/composing/layouts

#!/bin/bash

cd `dirname $0`

target=`date -d yesterday '+%Y-%m-%d'`
today=`date '+%Y-%m-%d'`

table=`gcloud logging read "ここに適当なフィルター" --project=<プロジェクト名> --format=json --limit 100000 \
    | jq -c '.[]' \
    | qma latency.yaml`

data="
{
  \"blocks\": [
    {
      \"type\": \"header\",
      \"text\": {
        \"type\": \"plain_text\",
        \"text\": \"${target}\"
      }
    },
    {
      \"type\": \"section\",
      \"text\": {
        \"type\": \"mrkdwn\",
        \"text\": \"${table}\"
      }
    }
  ]
}"
echo $target
echo $table
curl -X POST -H 'Content-type: application/json' --data "$data" <投稿用のURL>

イメージのビルド & レポジトリにpush

通常通りイメージをビルドする。

docker build -t <レポジトリ名> .
dockeer push <レポジトリ名>

CloudRun Jobsの準備

GCPコンソールからCloudRunのページを開く。画面上部のジョブタブを開き「ジョブを作成」を選択。
Dockerfile

コンテナ名やコンテナのURLなどの必要な情報を記載してジョブを作成する。

作成したジョブを実行して問題なく実行できることを確認する。

Cloud Schedulerの設定

以下のリンクに従って設定していく。
https://cloud.google.com/run/docs/execute/jobs-on-schedule

完成

こんな感じで自動投稿できるようになる。Slackのマークダウンだとテーブルが表示できないことを完成後に知って絶望した。バッチ一つ動かすために大分大仰なことをやってしまったが一度作れば使い回せるので楽そう。

Discussion