AWS ChaliceでSlackにWebhookを投げるWebAPIを作ってみた

この記事は 『CRESCO Advent Calendar 2017』 13日目の記事です。

こんにちは。技術研究所の910です。
もう旬が過ぎてしまった感じもしますが、Chaliceを利用してSlackへのWebhookを投げるWebAPIを以前作ったので、そのときのことを備忘録として残します。

概要

  1. Slack
  2. AWS Chalice
  3. ChaliceからSlackにメッセージを投げる
    1. Slack Incoming Webhook APIの作成
    2. PythonからSlackにメッセージを投げる
      • 汎用ライブラリを利用する方法(requests)
      • slackweb
    3. ローカルでChaliceを動かしてSlackにメッセージを投げる
    4. Lambda, API Gatewayにデプロイしてメッセージを投げる
  4. まとめ

1. Slack

最早Slackについて説明する必要は無いと思いますが、敢えて言うならば

  • 公開されているプラグインを導入して好きなように拡張できる
  • Webhookを受けられる

という特徴を持ったチャットツールと言えると思います。

2. AWS Chalice

一言で言うとFlaskライクに書けて、簡単にLambdaとAPI GatewayにデプロイできるPython用のサーバレスフレームワークです。
導入方法や使い方、実装例はすべてChaliceのGitHubにまとめられているので、そちらをご参照ください。
ちなみに、私が利用したChaliceのバージョンは1.0.4になります。

Chalice導入の際の注意

Chaliceは、LambdaがサポートするPythonのバージョンのみをサポートしています。
対応していないバージョンのPythonで利用しようとすると、以下のようなエラーが出て使えません。

Note: make sure you are using python2.7 or python3.6.
The chalice CLI as well as the chalice python package will support the versions of python supported by AWS Lambda.
Currently, AWS Lambda supports python2.7 and python3.6, so that's what this project supports.

Chaliceに限らず、特定のバージョンのPythonでしか動かないライブラリは多々あるので、用途毎に仮想環境を作れるようにしておくと何かと便利です。
仮想環境を扱う手段としては以下のようなものがあります。

これらの違いについては、以下のページをご参照ください。

ちなみに私は最近pyenvからvenvに移行しました。

3. ChaliceからSlackにWebhookを投げる

前置きが長くなりましたが、ようやくここからが本題です。
Chaliceを使って、SlackにWebhookを投げる迄の流れを記載していきます。

ⅰ. Slack Incoming Webhook APIの作成

  1. Workspaceを作っていない場合はこちらを参考に、Workspaceを作成してください。

  2. Slack APIにアクセスし、Start Buildingを選択します。

  3. 1にて用意したWorkspaceを選択し、Create Appを選択します。

  4. Incoming Webhooksを選択します。

  5. Activate Incoming WebhookをONにします。

  6. Activate Incoming WebhookをONにするとWebhook URLs for Your Workspaceという項目が画面下部に表示されます。
    この中のAdd New Webhook to Workspaceを選択します。

  7. ここでWorkspaceのどのチャネルに対してメッセージを投げるのかを指定します。
    Post toにメッセージを投げたいチャネルを指定してAuthorizeを選択すると、Webhookを投げる為に使うURLと、メッセージを投げる為のcurlコマンドが表示されます。試しにこのcurlコマンドをターミナルで叩くと、指定されたチャネルに対してメッセージが投げられます。


ⅱ. PythonからSlackにWebhookを投げる

ようやくここからが実装の部分になります。
PythonからSlackにメッセージを投げる手段としては、大きく分けて2つあります。

・汎用ライブラリを利用する方法(requests)

まずは汎用的なHTTPライブラリを使い、POSTリクエストを投げる方法です。
Python 3にはurllib.requestが標準搭載されていますが、ここではよりシンプルに実装できるrequestsを使っています。
requestsはpip install requestsでインストールできます。

ちなみに、curlコマンドを見る限りではSlackにメッセージを投げる為にはWebhook URLメッセージの文面があれば良いので、ソースコードは非常にコンパクトになります。

to_slack("Python3からきました。")を実行すると、画像のようにSlackにメッセージが投げられることが確認できました。

・slackweb

もう一つの方法は、slackwebというSlack専用のライブラリを使う方法です。
requestsと同様、pip install slackwebでインストールできます。

流石にSlack専用のライブラリだけあって、requestsを使う場合よりも更にコンパクトなソースコードになりました。

こちらもto_slack("Slackwebからきました。")を実行して、Slackにメッセージが投げられるのを確認できました。

このように、僅か数行のスクリプトで簡単にSlackにメッセージを投げられるということが分かるかと思います。


ⅲ. ローカルでChaliceを動かしてSlackにメッセージを投げる

ようやくここからChaliceを使っていきます。
いきなりデプロイするのは怖いので、とりあえずはローカルでChaliceを動かしてSlackにメッセージを投げてみます。
また、先程はrequestsslackwebを使う2つの方法を示しましたが、以降はslackwebを利用したスクリプトを使います。

Chaliceもrequestsなどと同様、pip install chaliceで導入できます。
また、Chaliceの導入と同時にchaliceコマンドにPATHが通されます。

chaliceコマンドで使えるオプションはいくつかあるのですが、今回は以下の3つしか使いません。
オプションを全てチェックしたいときはchalice --helpで確認してみてください。
また、この作業ではChalice Python Serverless Microframework for AWS 1.0.4 documentationを参照しました。

機能 概要
deploy ChaliceのプロジェクトをLambda、API Gatewayにデプロイする
local Chaliceのプロジェクトをlocalhostで実行する
new-project 新規プロジェクトを作成する
  1. 新規プロジェクトの作成
    chalice new-projectコマンドを任意のディレクトリで実行すると、最小限の構成のディレクトリが生成されます。

  2. 必要なライブラリの配置 & requirements.txtへの追記
    Chaliceを利用する場合、指定されたディレクトリに手持ちのスクリプトやライブラリのファイルを配置しておくことでそれらのライブラリを利用することができます。
    その為、既存のモジュールを再利用したり、適宜モジュール分割したりといったことができます。
    ディレクトリ構成のルールはこちらにあるので、適宜ご参照ください。

    先程実装したto_slack_with_slackweb.pyslackwebライブラリを配置して、最終的にはこのようなディレクトリ構成になりました。

    また、Pythonを使っている方ならばお馴染みのrequirements.txtも用意する必要があります。
    以下のように、サードパーティ製のライブラリの名称を記載して配置してください。
    今回はslackwebが必要なので、このような内容のrequirements.txtを用意しました。

    ライブラリの形式について

    pip downloadで取得したファイルの形式がwhl形式でない場合、デプロイする際にはwhl形式に変換する必要があります。
    以下の流れで変換してからvendorディレクトリに配置してください。

    リファレンスにはもっと詳細な説明がありますので、もしサードパーティ製ライブラリに起因する問題が発生した場合にはこちらを参照してみてください。

  3. リクエストを受けた際の処理を実装する
    app.pyにリクエストを受けたときの処理を実装します。
    既にSlackに対してPOSTリクエストを投げる部分は実装済みですので、その関数を呼び出すだけで済みます。
    また、書き方はFlaskとそっくりなので、非常に書き易いかと思います。
    (スクリプトのファイル名が冗長ですが、ここでは眼をつむってください…)

  4. Chaliceをローカルで動かして動作確認
    ここ迄終わったらchalice localを実行して動作確認をします。
    これで問題なくメッセージが投げられれば、後はデプロイするだけです。

問題がなければこのように、メッセージが投げられるはずです。



ⅳ. Lambda, API Gatewayにデプロイしてメッセージ投げる

デプロイを行う為には認証情報が必要となりますので、予めAWS CLIのセットアップを済ませておいてください。
CLIのセットアップが終わっていれば、deployコマンドを叩くだけでデプロイされます。

chalice deployすると、最後にURLが表示されます。
このURLを使ってAPIの呼び出しを行いますので、このURLを控えておいてください。

デプロイ可能なファイルサイズについて

2017年11月現在では、Lambdaには合計50MB迄アップロードできます。
TensorFlowを入れたプロジェクトをchalice deployしようとしたら、Lambdaのファイル容量の制限に引っ掛かってしまいデプロイすることができませんでした…


まとめ

正直、拍子抜けするくらい簡単にWebAPIが作れてびっくりしました。
ちなみにLINE BOTでもWebhookを受けられるので、ChaliceでBOTを拡張していくのも楽しそうだなーと思っています。

  • このエントリーをはてなブックマークに追加