LoginSignup
1

More than 3 years have passed since last update.

posted at

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

はじめに

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のデプロイについては以下の記事を参考にさせていただきました。

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
What you can do with signing up
1