Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

https://qiita.com/shunp/items/ded0da8b29dae7aa9196

inabajunmr
なんか間違ってたら教えてください
http://inabajunmr.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away