ChatOps: SlackからLambdaに連携してみる(4)

id:kizashi1122 です。

f:id:ingage:20210620201734p:plain

ひとまず Slack から Lambda を呼び出すところまでは終わりました。 (といってもURL確認用のリクエストを受け取っただけです)

ワークスペースにアプリをインストールする

まだコードは何も書いてないですが、Slack から使ってみたいのでインストールします。

f:id:ingage:20210628122716p:plain

クリックします。次の画面では「Accept」すればよいです。 チェックが入りましたね。

f:id:ingage:20210628122833p:plain

ではこの「echoapp」をSlackのチャンネルに追加してみましょう。最初はテスト用に作ったチャンネルで試すのがいいかもしれません。ここでは #app-test としています。

f:id:ingage:20210628123503p:plain

上記の「Add an App」をクリックして「echoapp」を選択して追加します。

f:id:ingage:20210628123608p:plain

追加されました。ではメンションしてみましょう。

f:id:ingage:20210628124724p:plain

何も起きません・・・。
そもそも Lambda まで届いているのかすらわかりません。ログを確認しましょう。

ここから確認できます。

f:id:ingage:20210628124903p:plain

タイムスタンプを見るにちゃんと届いてそうです。ログを出してみます。Ruby なので p で引数の event を標準出力に出力してみるだけです。
ログ出力コードを入れてデプロイし、更にメンションしてみます。

同じようにログを確認し、さらにリンクを飛んで CloudWatch Logs までいきます。

f:id:ingage:20210628130034p:plain

へー、イベントの中身ってこうなってるのねーというのがよくわかります。

中で気になるものを赤枠で囲ってます。1つ目が token です。簡単なリクエストチェック(Slack からのリクエストであるということの検証)に使えます。
2つ目はエコーする内容です。ここをそのまま返せばエコーできそうだなとわかります(このときは「@echoapp hello2」と投稿してました)。

1つ目について、トークンの一致性を見るだけなら簡単なので実装しておきましょう。本当は署名チェックをするのがよいようです。

Verifying requests from Slack | Slack

Slack から送られるトークンについてはここにあります。

f:id:ingage:20210628131244p:plain

これを Lambda 側の環境変数にいれておき(画面省略)、コード上ではこう比較すればよいでしょう。

require 'json'

def lambda_handler(event:, context:)
    # p event
    req = JSON.parse(event['body'])
    if ENV['SLACK_VERIFICATION_TOKEN'] != req['token']
        return { statusCode: 401, body: "VERIFICATION TOKEN UNMATCHED" }
    end
    
    { statusCode: 200, body: 'done' }
end

さて、次はいよいよLambda側からエコーする部分を作りましょう。

続きはこちら。

ChatOps: SlackからLambdaに連携してみる(5) - インゲージ開発者ブログ