← Back to list

GCPでサーバーエラーログをslackへ通知する仕組みを実装した話

背景

Tky in days365 · 2020-07-03 02:01 · 0 claps · 5.6 min read
#gcp #cloud-functions #cloud-storage #google-cloud-pubsub #cloud-dataflow
Open on Medium ↗
Wiki topics: RAG · RAG & Retrieval ☁️ · DevOps & Cloud

GCPでサーバーエラーログをslackへ通知する仕組みを実装した話

Daysエンジニアの吉村です。今日はGCP上でサーバーログを監視して、エラーがでたらslackに通知してくれる仕組みを作った話をしたいと思います。

背景

サーバーアプリでエラーが発生した時に、そのエラー内容をslackにすぐ通知して発生しうる機会損失を最小限に抑えたい。Daysでは基盤はGCPをメインにしているため、GCP上でその仕組みを構築したい。

実装

構成図は以下になりました。

Logging エージェント(google-fluentd)

GCEではStackdriver Loggingにログを送信するためにLogging エージェント(google-fluentd)が用意されており、それを利用してLoggingにログを流します(Logging エージェントのインストールはこちら)。

今回、サーバーアプリはSystemd上で動かしていたので、google-fluentdの設定に以下のものを /etc/google-fluentd/config.d/ 追加しました。

<source>
 @type systemd
 tag myapp
 path /run/log/journal
 matches [{ “_SYSTEMD_UNIT”: “myapp.service” }]
 read_from_head true
<storage>
 @type local
 path /var/log/google-fluentd/fluentd-journald-myapp-cursor.json
 </storage>
<entry>
 fields_strip_underscores true
 fields_lowercase true
 </entry>
</source>
<match myapp>
 @type stdout
</match>

Logging -> Cloud Pub/Sub

次に、google-fluentdからLoggingに送られたログからエラーログだけ抽出するためにLogging Routerを使います。Logging Routerでエラーログに該当するログのフィルターをかけたSinkを作ります。このSinkにはエクスポート先を設定することができ、エクスポート先にはBig Query、GCS、Cloud Pub/Subが選べます(独自のエクスポート先も設定できるようですが割愛します)。

エラーログ抽出Sinkのサンプル

エラーログ抽出Sinkのサンプル

最初にGCSをエクスポート先に設定すれば楽そうと思ったのですが、GCSは1時間周期でまとめてエクスポートする仕様だったため、今回の目的にはマッチしていなかったのでCloud Pub/Subをエクスポート先に選びました。*1

Cloud Pub/Sub -> Cloud Dataflow -> GCS

Dataflowを使って、Cloud Pub/Subに投げられたログエントリを取り出してGCSに保存していきます。Dataflowの中身は自分で実装できますが、テンプレートも用意されています。今回特別な処理とかは無いので素直にテンプレートを使います。

使うテンプレートは Pub/Sub to Cloud Storage Text です。都合上CLIで起動できるようにしています。

#!/bin/bash
set -ex
service_account=dataflow@myproject.iam.gserviceaccount.com
gcloud beta dataflow jobs run error-logs-dataflow \
    --gcs-location gs://my-template/dataflow/2019-07-10-00_Cloud_PubSub_to_GCS_Text \
    --max-workers 3 \
    --num-workers 1 \
    --network prod \
    --subnetwork regions/asia-northeast1/subnetworks/prod-subnet-1 \
    --worker-machine-type n1-standard-1 \
    --parameters \
inputTopic=projects/myproject/topics/prod-error-logs,\
outputDirectory=gs://err_logs/dataflow/,\
outputFilenamePrefix=errlogs-,\
windowDuration=15s,\
    --region asia-northeast1 \
    --service-account-email $service_account \
    --project myproject

--parameters で指定できる内容は、実際にソースコードを見に行くとわかりやすいかと思います。

GCS -> Cloud Function -> Slack

Cloud FunctionはGCSのbucketにオブジェクトが生成されたことをトリガーに実行できます。それを利用して、先のDataflowでGCSに保存されたエラーログが生成されたタイミングでそのログ内容をslackに通知するCloud Functionを実装します。実際に作ったのが以下です。

[embed]tkyshm/alert_to_slack GitHub is home to over 50 million developers working together to host and review code, manage projects, and build…github.com

実際に飛んだ通知が下の画像です。

slackに届く通知

slackに届く通知

さいごに

Dataflow周りが初めて触ったので戸惑ったところも有りますが、目的達成できたので良かったです。また、サーバーアプリ以外にnginxのエラーログもとってきてslackへ通知できるようにもしています。

汎用的に使える仕組みなので、今後組み込めるものは組み込めていけたら良いなと思います。

*1: Cloud Pub/Subはアプリケーションまたはリポジトリにログエントリをストリーミングするのに向いている。


메타데이터
post_id
433c9d5fd980
slug
gcpでサーバーエラーログをslackへ通知する仕組みを実装した話-433c9d5fd980
url
https://medium.com/days365/gcp%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AD%E3%82%B0%E3%82%92slack%E3%81%B8%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E8%A9%B1-433c9d5fd980
canonical_url
https://medium.com/days365/gcp%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AD%E3%82%B0%E3%82%92slack%E3%81%B8%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E8%A9%B1-433c9d5fd980
author_url
https://medium.com/@tkyshm
status
ok
fetched_at
2026-07-28 23:49:14