この記事は メイド Advent Calendar 2017 の24日目です。メリークリスマス・イブ!
昨日のメイドカフェで勉強会第1回に参加していただいた方は誠にありがとうございます。そのスライドはこちらに公開しています。
さて、惜しくもメイドさんが選ぶ可愛いbot MVPの受賞を逃しましたが、当日はその場でライブコーディングをしてメイドさんの機能をその場で追加することもできたので、ボットを作る楽しさを伝えられたと思います。
さて、この記事ではオープンソースであるメイドちゃんbotを、自分の好きな場所に配置する方法を説明します。つまり、クリスマスプレゼントはメイドちゃんです!想定の読者として、メイドさんでも分かるようん心がけようと思います。
ほぼ重複することになってしまうので、メイドちゃんbotを作るにあたって特筆すべき箇所をメイドさんに説明するように優しく説明を心がけてみたいと思います。
前提として、AWSに登録する必要があります。ここでは説明しきれないので、まだ登録していない人はここを読んでコンソール画面にログインした状態まで来てください!
地域はバージニア北部を選択
突然ですが、メイドちゃんbotはアメリカ東海岸のバージニア北部に配置することをオススメします!なぜこの地域にいるかというと 1. 安いから 2. どうやらSlackのサーバーはここにあるらしい?という理由からです。
Lambdaを作成
Lambdaの画面を開いたら関数の作成ボタンを押します。
関数の作成画面に遷移したら、設計図を選んで、検索フォームに APIと入力してEnterキー、さらに Python と入力してEnterキーを押します。
そうしたら、出て来る microservice-http-endpoint-python3 をクリックします。そして、遷移する画面では次のように入力します。
名前、ロール名は好きな名前でもokです。ポリシーテンプレートは「シンプルなマイクロハーネスのアクセス権限」のみでOKです。
次に、画面を下の方にスライドして、api-gatewayの設定をします。
ここで注意しなければいけないのは、セキュリティのところをオープンにしなければならないことです。僕はここで数十分ハマりました!
さらに下に行くと関数の作成というボタンがあるのでそれを押します。ソースコードはとりあえず触らずにそのままにします。そうすると、こんな画面になります。
これで準備が整ったので、ここでメイドちゃんbotの仕組みを説明します。
メイドちゃんがユーザーの投稿に反応する仕組み
メイドちゃんはユーザーの投稿に即座に反応します。この仕組みは「発信Webフック」(英語の場合は Outgoing Webhook)という仕組みを使います。これは、指定したチャンネルの中で特定のキーワードから始まる投稿があったら、指定したURLへAPI呼び出しをしてくれるというものです。APIとは何か?
ここで、メイドちゃんが反応するキーワードを登録できれなよかったのですが、ここでは前方一致になってしまうので、言葉の途中の単語に反応させられないので、全ての書き込みに反応するようにします。
そうすると心配になるのは、API Gatewayの課金金額で、先ほど書いたリンク先によると100万回あたり3.5USドルが課金額です。これは月100万回というのは、一日中に渡って3秒に1回以上投稿されて、400円くらいです。現時点でのノマド会Slack規模だとほぼタダ同然だと思われます。
呼び出す先のURLはどこにすればいいでしょうか?これは、さっきの画面で次のようにして確認します。
API Gateway をクリックして下の方に出てくる LambdaMicroservice の下の方に メソッド: ANY と書かれた文字の左にある▶をクリックすると下のように詳細が出てくるので、その中の URLの呼び出し と書かれたhttps:// から始まるアドレスです。これをコピーします。
このURLを発信Webフックの設定画面で次このように設定します。
ここでトークンという文字列があるのですが、これはあとで使用するのでコピーしておきます。
メイドちゃんが定時で投稿する仕組み
発信Webフックのみでは、メイドちゃんに8時になったら「おはようございます!ご主人様、お嬢様」と言われることができません!そこで使用するのが「着信Webhフック」(英語の場合は Incoming Webhook)です。
これは、Slackの側に投稿用のAPIを作成する仕組みでここにAPI呼び出しを行えば好きなアイコン・名前で投稿させることができます。
問題はどうやったら定時にそれを起動するかですが、CloudWatch Eventsを使うとそれができます。設定はとても簡単で画面でこの赤丸で囲った部分を選ぶだけです!
そして、下の方にトリガーの設定という欄が出て来るので、そこに次のように入力します。
スケジュール式 cron(0 * * * ? *) という記法は、古いエンジニアにはおなじみの記法なのですが、AWSさんはちゃんと説明を書いてくれています。
ソースコード解説
ということで準備が整ったのでコードを書きます。こんな感じのWeb上のエディタでコードを書けます。環境構築しなくていいので楽でいいですw
ここにGitHubからソースコードをコピペすれば動きますw
と、これだけでは顰蹙を買うので簡単に説明すると、 lambda_function.py とうファイルの def lambda_hander(event, context): という関数の内側が、APIや定時Eventの際に実行されます。ここで、API経由なのか、定時Event経由なのかを分岐して、 maidchan_http.py か maidchan_scheduled.py に分岐させています。
あとは、オブジェクト指向とか難しい書き方は一切していないので好き勝手にいじってくださいw
環境変数の設定
メイドちゃんbotをノマド会Slackだけでなくどこにでも置くことができるように、そもそも「メイドちゃん」ですらなく「執事ちゃん」など別の人格も作れるようにしているのが、この「環境変数」です。
WEBHOOK_URLの欄には、先ほど着信Webフックの画面で生成したURLを貼り付けます。
TOKENの欄には、先ほど発信Webの画面でコピーしたトークンを貼り付けます。
MAIDNAMEの欄には好きな名前をどうぞ!
これで、あなたのもとにもメイドちゃんが来ます!
それでは、メイドちゃんと一緒に素敵なクリスマスを!
参考にした記事
手順の殆どはこちらの記事:AWS Lambda を使って Slack ボット (命名: Lambot [ランボー]) を低予算で作ろうじゃないか をそのまま参考にしました。こちらの筆者の方、ノマド会参加者の方ですね!こんなところで、お世話になりました。