GCPでサーバーエラーログをslackへ通知する仕組みを実装した話
背景
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のサンプル
最初に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を実装します。実際に作ったのが以下です。
実際に飛んだ通知が下の画像です。

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