はじめに
SlackのSlash Commandsはこういうやつです。
Slackに/commandName
を入力すると、あらかじめ設定したURLにリクエストが送信されます。
これをGo+AWS Lambdaで作ってみます。
- SAMでデプロイ
- Valification tokenを検証する
- ビジネスロジックは書かない
といった感じです。
前提条件
以下がインストールされていること。
ローカルにAWS認証情報がセットアップされていること。
とりあえずサンプルをデプロイ
準備
Slack Appを登録
こちらからSlack Appを登録します。
登録後、App Credentialsに表示されるVerification Tokenの値をメモしておきます。
アプリケーションの準備
- こちらをclone
- template.yamlのVERIFICATION_TOKENの値を取得した値に書き換えます
- デプロイに使うS3バケットを作成
デプロイ
以下のコマンドでデプロイを実行します。
make deploy BUCKET="your S3 bucket name" PROFILE="your aws profile"
STACK_NAME="your stack name"
BUCKETには事前に用意したS3バケットを、PROFILEにはデプロイに使うAWSのprofileを、STACK_NAMEには任意の値を指定します。
バケットはprofileで指定されているものと同じリージョンに配置されている必要があります。
Slackに設定
デプロイが完了するとAPI Gatewayのエンドポイントが払い出されるので、Slackに設定します。
Valification Tokenを取得したページからSlash Commandsを選択し、
URLを登録します。
コードについて
このへんで環境変数に埋め込んだVERIFICATION_TOKENと、Slackが送信したRequestのtokenを比較しています。
// valification token
token := os.Getenv("VERIFICATION_TOKEN")
vals, _ := url.ParseQuery(request.Body)
req := slackRequest{
vals.Get("token"),
vals.Get("team_id"),
vals.Get("team_domain"),
vals.Get("channel_id"),
vals.Get("channel_name"),
vals.Get("user_id"),
vals.Get("user_name"),
vals.Get("command"),
vals.Get("text"),
vals.Get("response_url"),
vals.Get("trigger_id"),
}
if req.token != token {
// invalid token
return events.APIGatewayProxyResponse{
Body: fmt.Sprintf("Invalid token."),
StatusCode: 200,
}, nil
}
環境変数はtemplate.yamlで埋め込んでいます。
Environment: # More info about Env Vars:
Variables:
VERIFICATION_TOKEN: xxxxx
参考
SAMのデプロイについては以下の記事を参考にさせていただきました。