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

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

はじめに

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に変更する。
今回はここまでとする。

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした