0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoでSlackbotを作ってみた(Cloud Runデプロイ)

Last updated at Posted at 2025-10-30

はじめに

研究室や職場でSlackを使っていると、
「この前のスライドどこ?」「プリンタの設定どこにあったっけ?」
といったやり取り、ありますよね。

手動でDriveやNotionなどを探すのは地味に手間なので、
SlackのDMにキーワードを送ると自動でURLを返すbot をGoで作りました。

本記事ではその仕組みと設計のポイントを紹介します。

背景(作ろうと思ったきっかけ)

Slackにも検索機能はありますが、資料URLだけを即座に出す用途には少し冗長です。
DriveやNotionにまとめても、どこに書いたかを探すのが面倒でした。

そこで、

  • routes.yaml という1枚のYAMLファイルにキーワードとURLを登録
  • SlackのDMでキーワードを送るだけで即座に返す

という簡易リンク辞書botを作りました。

作成したアプリの概要

SlackのDMで「スライド」「旅費精算」などの単語を送信すると、対応するURLを返してくれるbotです。

主な機能:

  • routes.yamlでキーワードとURLを管理
  • SlackのDMでキーワードを送ると対応URLを返す
  • Cloud Run上で常時稼働し、署名検証とリトライ対応
  • HMAC署名検証・再送対策つき

リクエストはSlackのEvents API(event_callback)で受け取り、
3秒制限に対応するため非同期処理で返信しています。

使用技術

  • 言語:Go 1.22
  • フレームワーク:標準net/http
  • インフラ:Google Cloud Run
  • Slack API:Events API + chat.postMessage
  • データ:routes.yaml(YAML形式のリンク辞書)

構成

.
├── Dockerfile
├── README.md
├── go.mod
├── go.sum
├── main.go
└── routes.yaml

routes.yaml の例

links:
  - keywords: ["スライド", "発表資料"]
    url: "https://drive.google.com/slide/xxxx"
    note: "研究発表スライド"
  - keywords: ["旅費", "精算"]
    url: "https://docs.google.com/spreadsheets/xxxx"
    note: "旅費精算シート"

実装で工夫したポイント

  • 即時レスポンス + 非同期処理
    • Slackの3秒制限に対応し、体感レスポンスを高速化
  • 重複イベント対策(LRUキャッシュ)
    • 再送イベントを無視して冪等性を担保
  • ログレベル管理(INFO/WARN/ERROR)
    • 環境変数LOG_LEVELで制御可能

今後追加したい機能

  • Slackにアップされたファイルを自動的に辞書登録
  • Notion / Drive API などと連携してURL更新を自動化
  • /add や/list コマンドでSlack上から編集可能にする
  • chatGPT APIと連携して文脈検索対応

まとめ

Goの標準ライブラリだけで、軽量・安全なSlackbotを構築できることを実感しました。

署名検証・リトライ・非同期化といった
運用を意識した実装を行うことで、Cloud Run上でも安定して動作します。

シンプルですが、拡張次第でかなり汎用的に使えると思います。

GitHub

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?