4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

echobotを作成し、Slackに通知する

Last updated at Posted at 2020-01-05

#はじめに

AWSアカウントを作成したので、料金管理のため料金通知botを作成したい。
そのため、まずはechobotを作成してbotを試してみる。

#Lambdaを作成する
「AWSマネジメントコンソール」から「Lambda」を作成する。
諸々の設定を行い、以下のようにコードを書きかえる。

HTTPステータス200(OK)と本文にeventをJSON形式にしたものを返す.
import json

def lambda_handler(event, context):
    # TODO implement
    return { 'statusCode': 200, 'body': json.dumps(event) }

#API Gatewayの作成
「AWSマネジメントコンソール」から「API Gateway」を作成する。
「APIの作成」をクリックする。
「アクション」→「メソッドの作成」から「POST」を選択し、以下のようにセットアップする。

  • 統合タイプ「Lambda関数」
  • Lambdaプロキシ統合の使用→チェックを入れる
  • Lambdaリージョン→さっき作ったLambdaのリージョンを指定。(デフォルト)
  • Lambda関数→さっき作ったLambdaの名前「echobot」を入力
  • デフォルトタイムアウトの使用→チェックを入れたままで良い。

「保存」をクリックし、「Lambda関数に権限を追加する」とか出るので、「OK」をクリックする。

#Slackの発信Webhook (Outgoing Webhooks)の準備
こちらにアクセスし、「発信Webhook」(英語UIだとOutgoing Webhooksかも)をクリック、「設定を追加」をクリックする。

「発信ペイロードとレスポンス」をクリックすると、どんなデータがやってくるのか分かるのでコピーし、メモ帳か何かに貼り付ける。
貼り付けたデータの改行を&に置き換え、AWSのAPI Gatewayテスト画面にて「リクエスト本文」に貼り付けて、テストする。
テスト後、「レスポンス本文」に出てきた結果をコピーする。
コピーした内容をLambdaのテストイベントとして設定する。

#Lambdaのコーディング
Slackからの発言に対してLambdaに無限ループを起こさせないよう以下のようのコードを修正する。

修正版.
import json
import os
from urllib.parse import parse_qs

def lambda_handler(event, context):
    token = os.environ['SLACK_TOKEN']
    query = parse_qs(event.get('body') or '')
    if query.get('token', [''])[0] != token:
        # 予期しない呼び出し。400 Bad Requestを返す
        return { 'statusCode': 400 }
    slackbot_name = 'slackbot'
    if query.get('user_name', [slackbot_name])[0] == slackbot_name:
        # Botによる書き込み。無限ループを避けるために、何も書き込まない
        return { 'statusCode': 200 }
    # textの内容をそのまま書き込む
    return {
        'statusCode': 200,
        'body': json.dumps({
            'text': query.get('text', [''])[0]
        }) }

次に、「関数コード」の下の「環境変数」のところに、Slackのtokenとしてやってくる文字列を指定する。

  • キー「SLACK_TOKEN」
  • 値: Slackの発信Webhookの「発信ペイロードとレスポンス」にあったtoken=...の行の=より後の文字列

「テスト」をして、statusCodeが200、bodyがJSON形式でtextにリクエストの本文と同じようなものが記述されれば良い。

#API GatewayエンドポイントURLの作成
API Gatewayのページの「リソース」の右側、「アクション」をクリックし、「APIのデプロイ」をクリックする。
以下のように入力し、「デプロイ」をクリックする。

  • デプロイされるステージ「新しいステージ」
  • ステージ名:適当。ここでは「prod」
  • ステージの説明、デプロイメントの説明: 書きたければ書く

#Slack Webhookの設定
「インテグレーションの設定」までスクロールし、以下のように設定します。

  • チャンネル: 全チャンネルだと迷惑なので、botを入れるチャンネルを選ぶか作成します。今回、botチャンネルを新たに作成しました。
  • 引き金となる言葉: ここに指定した単語で始まる行があったときのみbotをAPIを叩きます。全チャンネルの場合は必須ですが、今回はチャンネルを指定したので不要です。何も指定しません。
  • URL: 先ほどAPI GatewayをデプロイしてできたURLを貼り付けます
  • トークン: 変えずにそのまま。Lambdaの方で設定した環境変数SLACK_TOKENと同じかどうか、念のため確認する。(違っていた場合はLambdaの方を変えて保存する)
  • それ以外の項目: 特にさわる必要はない。変えたいものがあったら変える。

「設定を保存する」をクリック。

#おわりに
作成したbotが正常に動作するか発言してみる。
スクリーンショット 2020-01-05 17.27.37.png
同じ内容が帰ってきたので正常に動作した事が確認できた。
後はLambdaの内容を変更して料金通知botに変更する。
今回はここまでとする。

4
1
0

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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?