![[Twilio+Slack] Slack に SMS 送信コマンドを実装する: SQS+Lambda での非同期処理構成 [1/3]](https://images.ctfassets.net/ct0aopd36mqt/wp-thumbnail-3f316c20ff5f4f46d1a005e2ad976882/c71162912c717bb0ca7c9b4196a40df5/twilio.png)
[Twilio+Slack] Slack に SMS 送信コマンドを実装する: SQS+Lambda での非同期処理構成 [1/3]
- 第 2 回: Lambda 関数と SQS を使った非同期処理の実装
- 第 3 回: Slack アプリの設定と動作確認
対象読者
- Slack のスラッシュコマンドを使って外部サービスと連携したい方
- Twilio を使って SMS を送信したい方
- AWS Lambda を使ったサーバーレス構成に興味がある方
- Slack の 3 秒タイムアウト制限を回避する方法を知りたい方
- SQS を使った非同期処理の実装例を探している方
参考記事
開発環境
バージョン
node: 22.13.1
npm: 10.9.2
node_modules/twilio: 5.5.1
node_modules/aws-sdk: 2.1692.0
概要
本記事では、Slack のスラッシュコマンド /sms
を使って、Twilio 経由で SMS を送信する仕組みを構築する方法を紹介します。ユーザーは Slack 上で以下のようにコマンドを入力するだけで、指定した電話番号に SMS を送信できます。第 1 回では、全体構成の理解を深めた上で、Twilio 側の準備 (SMS 対応番号の取得と API 認証情報の確認) を行います。
/sms +81XXXXXXXXXX メッセージ本文
この仕組みを実現するために、以下の技術を組み合わせて構築します。
- Slack: スラッシュコマンドによるユーザーインターフェース
- Twilio: SMS 送信 API
- AWS Lambda: リクエスト処理を行うサーバーレス関数
- API Gateway: Slack からの HTTP リクエストを Lambda に中継
- Amazon SQS: 非同期処理のためのメッセージキュー (SQS を使用する理由については後述)
上記構成図のうち、第 1 回では Twilio 側の設定 (赤枠で示した部分) を行います。具体的には、SMS 送信に対応した電話番号の取得と、API 認証情報 (SID・トークン) の確認を行います。
実用性を考慮し、Slack からのリクエストが正規のワークスペースから送信されたものであることを検証する署名検証機能も実装します。これにより、セキュリティを担保しつつ、インフラ管理不要なサーバーレス構成で安全に運用できる仕組みを実現します。
本記事を通じて、以下のような知見が得られます。
- Slack スラッシュコマンドの基本的な使い方
- Twilio API を使った SMS 送信の実装方法
- AWS Lambda + API Gateway を使ったサーバーレス API の構築
- Slack の署名検証によるセキュリティ対策の実装方法
- Amazon SQS を使った非同期処理の設計と実装
Slack コマンドとは
Slack のスラッシュコマンドとは、ユーザーが /コマンド
を入力すると、指定した外部の HTTP エンドポイントにリクエストを送信する機能です。このエンドポイントをどこにホストするかは自由ですが、今回は AWS Lambda を使ったサーバーレス構成を採用しました。理由は以下のとおりです。
-
インフラ管理が不要
サーバーの起動・監視・スケーリングなどを意識せず、コードの実装に集中できます。 -
コスト効率が高い
Lambda はリクエストごとの従量課金制で、低トラフィックな用途 (今回のようなコマンド実行時のみ動作する処理) に非常に適しています。 -
セキュリティ要件に対応しやすい
Slack の署名検証を含むセキュアな処理を、Node.js で柔軟に実装できます。
Slack のスラッシュコマンドには、3 秒以内に HTTP 200 OK を返さなければ operation_timeout
エラーが表示されるという制限があります。この制限があるため、Twilio のように外部 API を呼び出す処理を直接行うと、Slack 側でタイムアウトエラーが発生してしまう可能性があります。実際、Twilio の SMS 送信には数秒かかることがあるため、レスポンスを一旦即時に返却し、処理をバックグラウンドで行う構成が必要です。そのため本記事では、Amazon SQS を使って非同期処理を実現する構成を採用しています。
Twilio API とは
Twilio とは、電話・SMS・ビデオ通話などの通信機能を API 経由で提供するクラウドサービスです。 本記事では、Twilio の SMS API を使って、Slack から指定した電話番号にメッセージを送信します。Twilio の SMS 送信は、1 通あたり数円程度の料金が発生します (国や宛先によって異なります) 。本記事では日本国内宛の送信を想定しています。
Twilio の初期設定: SMS 対応番号と認証情報を取得する
Slack から SMS を送信するには、Twilio 側で SMS 送信に対応した電話番号と、API を利用するための認証情報 (SID とトークン) を取得しておく必要があります。このセクションでは、Twilio コンソール上で行う初期設定について説明します。
ステップ 1: SMS 対応の電話番号を取得する
Twilio コンソール にアクセスし、左メニューから Phone Numbers > Manage > Buy a Number
を選択します。 Capabilities
で SMS にチェックを入れ、必要に応じて国 (例: United States - US
) を指定して検索します。SMS 対応の電話番号を選択し、 Buy
ボタンをクリックして購入します。
取得した電話番号は、後ほど AWS Lambda から SMS を送信する際の「送信元番号 (from) 」として使用します。番号は国番号付き (例: +81XXXXXXXXXX
) の形式で控えておきましょう。
ステップ 2: API 認証情報 (SID・トークン) を確認する
Twilio API を利用するには、アカウントごとに発行される認証情報 (Account SID と Auth Token) が必要です。 Twilio コンソール にアクセスし、左メニューから Account Dashboard
を選択します。 Account Info
セクションに表示されている以下の情報を確認・コピーします。
- Account SID: アカウントの一意な識別子
- Auth Token: API 認証に使用する秘密鍵
これらの情報は、後ほど AWS Lambda の環境変数として設定します。
まとめ
第 1 回では、Slack から SMS を送信する仕組みの全体構成を確認し、Twilio 側で必要となる初期設定 (SMS 対応の電話番号の取得と、API 認証情報の確認) を行いました。次回は、AWS Lambda と Amazon SQS を使って、Slack からのリクエストを非同期で処理するためのバックエンド構成を実装していきます。
- 第 2 回: Lambda 関数と SQS を使った非同期処理の実装
- 第 3 回: Slack アプリの設定と動作確認