#はじめに
AWSアカウントを作成したので、料金管理のため料金通知botを作成したい。
そのため、まずはechobotを作成してbotを試してみる。
#Lambdaを作成する
「AWSマネジメントコンソール」から「Lambda」を作成する。
諸々の設定を行い、以下のようにコードを書きかえる。
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が正常に動作するか発言してみる。
同じ内容が帰ってきたので正常に動作した事が確認できた。
後はLambdaの内容を変更して料金通知botに変更する。
今回はここまでとする。