LoginSignup
3
1

More than 5 years have passed since last update.

Go+AWS LambdaでSlackのSlash Commandsを作る

Posted at

はじめに

SlackのSlash Commandsはこういうやつです。

slash.gif

Slackに/commandNameを入力すると、あらかじめ設定したURLにリクエストが送信されます。

これをGo+AWS Lambdaで作ってみます。

  • SAMでデプロイ
  • Valification tokenを検証する
  • ビジネスロジックは書かない

といった感じです。

前提条件

以下がインストールされていること。

ローカルにAWS認証情報がセットアップされていること。

とりあえずサンプルをデプロイ

準備

Slack Appを登録

こちらからSlack Appを登録します。

スクリーンショット 2019-02-23 1.24.02.png

登録後、App Credentialsに表示されるVerification Tokenの値をメモしておきます。

アプリケーションの準備

  1. こちらをclone
  2. template.yamlのVERIFICATION_TOKENの値を取得した値に書き換えます
  3. デプロイに使う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を選択し、

スクリーンショット 2019-02-23 1.27.15.png

スクリーンショット 2019-02-23 1.27.31.png

URLを登録します。

スクリーンショット 2019-02-23 1.27.34.png

コードについて

このへんで環境変数に埋め込んだ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のデプロイについては以下の記事を参考にさせていただきました。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1