AWS Lambda上で動作するMTG辞書配布用のDiscord botです。
Discord Interactions API(webhook方式)を使用してスラッシュコマンドに応答します。 辞書ファイルの配布はSQSを介した非同期処理で行います。
Discord → Lambda Function URL (index.js)
↓ SQS
Lambda (dictionary-handler.js)
↓
Discord followup message
| 関数名 | ハンドラー | 役割 |
|---|---|---|
mtg-dic_discord-bot |
index.handler |
Discord webhook受信・署名検証・コマンド処理 |
discord-bot-dictionary-handler |
dictionary-handler.handler |
SQSトリガー・辞書ファイル生成・Discord送信 |
両関数に同じzipをデプロイし、AWS側のハンドラー設定で役割を分けています。
| コマンド | 説明 |
|---|---|
/ping |
応答確認 |
/get-dictionary |
辞書ファイルを非同期で生成・送信(type 5 deferred response) |
/purge-queue |
SQSキューのメッセージを削除 |
/remove-guild-command |
ギルドスラッシュコマンドを全削除 |
- Discord Developer Portalでアプリケーションを作成
- 「Bot」タブでbotトークンを取得
- 「General Information」タブで以下を取得:
- Application ID
- Public Key
Lambda関数の環境変数として以下を設定します(.envはローカルのregister-commands.js実行時のみ使用):
| 変数名 | 説明 |
|---|---|
DISCORD_PUBLIC_KEY |
Ed25519署名検証用公開鍵 |
DISCORD_APPLICATION_ID |
DiscordアプリケーションID |
DISCORD_BOT_TOKEN |
Botトークン |
DISCORD_GUILD_ID |
ギルドID |
DICTIONARY_QUEUE_URL |
SQSキューURL |
pnpm installローカルで.envを用意してから実行:
pnpm run register-commandsGitHub Actionsによる自動デプロイが設定されています。
mainブランチへのpushで自動実行- GitHub ActionsのUIから手動実行(
workflow_dispatch)も可能
# パッケージ作成
zip -r discord-bot.zip . \
-x "*.git*" -x "*node_modules/.cache/*" \
-x "*.md" -x "tests/*" -x ".github/*"
# Lambda更新
aws lambda update-function-code \
--function-name mtg-dic_discord-bot \
--zip-file fileb://discord-bot.zip
aws lambda update-function-code \
--function-name discord-bot-dictionary-handler \
--zip-file fileb://discord-bot.zipmtg-dic_discord-bot:
- Handler:
index.handler - Timeout: 30秒
- Function URL: 有効(認証タイプ: NONE)
discord-bot-dictionary-handler:
- Handler:
dictionary-handler.handler - Timeout: 必要に応じて設定
- トリガー: SQS
「General Information」→「Interactions Endpoint URL」にLambda Function URLを設定。
├── index.js # Botハンドラー(webhook受信)
├── dictionary-handler.js # SQSハンドラー(辞書処理)
├── register-commands.js # スラッシュコマンド登録スクリプト
├── src/
│ ├── dictionaryProcessor.js # 辞書ファイル生成
│ ├── discordUtils.js # Discord followupメッセージ送信
│ └── messageProcessor.js # 重複排除・ファイルサイズ確認
├── .github/workflows/
│ └── deploy-lambda.yml # CI/CDワークフロー
└── CLAUDE.md # 設計方針・実装上の注意事項
- Runtime: Node.js 22.x
- パッケージマネージャー: pnpm
- Discord API: Interactions API(webhook方式)
- 認証: Ed25519署名検証(tweetnacl)
- 非同期処理: AWS SQS
- CI/CD: GitHub Actions(OIDC + IAMロール)
- Discordのタイムアウトは3秒。コールドスタート時はギリギリになることがある
- Lambda Function URLのログを確認(CloudWatch)
- 環境変数が正しく設定されているか確認
- Function URLがDiscordのInteractions Endpoint URLに正しく設定されているか確認
DICTIONARY_QUEUE_URL環境変数が設定されているか確認- LambdaのIAMロールにSQS送信権限があるか確認
dictionary-handlerのCloudWatchログを確認
DISCORD_PUBLIC_KEYが正しいか確認- リクエストボディが改ざんされていないか確認
register-commands.jsにコマンド定義を追加index.jsの_handler内のswitchにケースを追加- スラッシュコマンドを再登録(
pnpm run register-commands) - Lambda関数を再デプロイ