Slackへファイルをアップロードすると加工して返却してくれるSlackボットを構築

Slackへファイルをアップロードすると加工して返却してくれるSlackボットを構築

概要

Slack Appが追加されているチャンネルに指定の形式のファイルをアップロードされたら、ファイルの内容にAmazon Location Serviceを利用して取得した情報を付加してスレッドで返信するSlackボットを開発しました。

構成

添付画像タップして拡大表示

技術スタック

  • AWS CDK
    • AWSリソースはAWS CDK(TypeScript)を利用してIaC管理しました。
    • 開発者ごとに独立した環境を起動できるようにCDKレイヤーを実装しました。
  • GitHub Actions
    • CI/CDパイプラインの構築にGitHub Actionsを利用しました。
    • プルリクエスト作成時にESLint, Prettier, tscによる静的解析を実行するようにしました。
    • プルリクエスト作成時にJestによるユニットテストを実行するようにしました。
  • Jest
    • Lambda関数にデプロイするTypeScriptコードのユニットテストを構築しました。
  • Amazon Location Service
    • 入力されたファイルに含まれる位置情報関連の情報から追加の情報を取得するために利用しました。
  • AWS Lambda Function URLs
    • SlackからのWebhookを受け付けるAPIをシンプルに立てるため、Amazon API GatewayではなくAWS LambdaのFunction URLs機能を利用しました。
  • SQS
    • SlackからのWebhookを受信してから3秒以内に応答を返す必要があるため、SQSを挟んでメインの処理を非同期で行う構成としました。
  • bottleneck
    • Amazon Location ServiceのAPIをクォータを最大限活用するために、Node.jsのパッケージbottoleneckを利用しました。

特徴

フルサーバーレスの構成のため、利用しない限り費用が発生せず、コストパフォーマンスに優れています。また、AWS Lambda, Amazon SQS, Amazon Location Serviceは高いスループットを持ち、Lambda, Location Serviceはクォータの引き上げも可能なため、Slackボットの利用数が増えても当面はこの構成で対応することができます。

所感

社内ツールを構築する上で、Slackボットという形式は以下の点で非常に良いと考えています。

  • UIを構築する必要がない
  • UIをホスティングする環境を構築する必要がない
  • 認証・認可を構築する必要がない

フロントエンド開発を伴うUIの設計・実装・テストは工数がかかるので、適宜このパターンを利用して効率的に要求を満たせればと思っています。

Slack
AWS Lambda
Amazon SQS
Amazon Location Service
社内ツール