API Gateway + LambdaでSlackのスラッシュコマンドを作った時に dispatch_failed が返ってきた
内容
動作確認したらエラーもです正常に動作していた
TerraformでAWSリソースを構築してから動作確認したらSlackbotからdispatch_failedというメッセージが返ってくるようになった エラー「dispatch_failed」により失敗しました
結論
手動で作った時は2.0だったのに対してTerraformで作った時は1.0になっていて、この差でエラーになっていた ペイロードバージョンを2.0にしたらなおった
なぜこれでエラーになっていたか
まず、このdispatch_failedというエラーは一定時間SlashCommandに対して応答を返さなかった場合に返ってくる
SlashCommandは開始してから3秒以内に何かしら応答を返さないといけない
空メッセージを返すならHTTPステータス200を返せばいい
Nimで今回書いたコードではテキストを返すようにしていた しかし、実際はdispatch_failedしていたので、正しくSlashCommandに応答できていないと考えた
API GatewayのLambdaペイロードバージョン2.0では以下の用にレスポンスボディには何でも使って良い code:2.json
{
"Name": "Eric Johnson",
"TwitterHandle": "@edjgeek"
}
しかしペイロードバージョン1.0では、返却するステータスコードやボディ、ヘッダーを明示的にJSONに含める必要がある
code:1.json
{
"statusCode": 200,
"body": {
"Name": "Eric Johnson",
"TwitterHandle": "@edjgeek"
},
"Headers": {
}
}
意図せずペイロードバージョン1.0を使っていたことにより、Slackに正しくステータスコードとボディを返却できていなかった
結果として、SlashCommandの応答待ち時間の3秒を超過してdispatch_failedが表示されるようになった
以上