LINEからSlackにメッセージを転送するBotをAWSで作成してみる。
はじめに
この記事は Slack Advent Calender2018 12日目の記事です。
前日はtemmihiさんの[技術(者)を支えるネコ - にゃーんbotを作った]でした!
にゃーん🐱 んで実は今回ぼくが話す内容でにゃーんの基礎のところもわかったりしますので一緒に頑張りましょう!(初めてプログラミングする方でもきっとできる!)
エンジニアや今風のスタートアップに勤めている方はSlackを使っている方が多いと思います。
ですがまだまだ周りの方がLINEをメインで使っている方も多いはず。
そんなわけで今回はLINEとSlackのBOTを作ってLINEのメッセージをSlackに転送してみます。
こんなのが出来ます
使うもの
- python3.6
- Line messenger API
- Slack Webhook API
目次
- はじめに
- こんなのが出来ます
- 使うもの
- 目次
- Line Botを作る
- Slack Webhook Botを作る
- AWSの構成を作る
- Lambdaの関数を新規作成する
- Lambdaで処理の内容を実装する
- 完成!
- 何かあればいつでも連絡ください!
Line Botを作る
まずはLINEのメッセージを受け取るためのBotを作ります。
Botを作るためにはLINE Developersに登録する必要があります。
今回はMessaging APIを使っていきます。他にもソーシャルログインであるLINEログインや流行りのLINE Payなどの開発もできるようです。そのうちやろうかな。
プロバイダーを作成する
LINEのBOTにはプロバイダーの作成が必要です。
チャネル(BOT)を作成する
Bot本体を作ります。
botの名前などを設定、規約に同意するだけですぐに終わります。
プランについてですが、フリープランで問題ないです。
今後も色々試してみたい方はdeveloper trialでも良いです。
両者の違いについては以下の記事がわかりやすいです。
今回作るLine側のBot自身からメッセージを送ることはないので(push API)は使いません。
チャネルを作成するとbotのアイコンが出てくるので詳細画面を開きます。
Bot詳細画面の下の方にメッセージ送受信設定という欄があります
今回はwebhook送信を使いますので利用するにします。
またグループのメッセージを転送したいと思っている方は下のBotのグループトーク参加も利用するにしておきましょう。
これでline側のセットアップは完了です
Slack Webhook Botを作る
今度はSlack側のbotを作っていきます。
ここにアクセスしてStart Buildingをクリックします。
appの作成画面が出てくるのでapp名と参加させるWorkspaceを洗濯してCreateします。
botにどの機能をつけるかが選べるので今回はIncoming WebhooksをOnにします。
また、Lineから飛んできたメッセージをどのチャンネルに飛ばすかを設定します。
設定が完了するとWebhookのURLが生成されます。
試しにcurlでテストしてみましょう
設定したチャンネルにHello WorldがきていればこれでSlack側の設定もOKです。
AWSの構成を作る
今回はいわゆるサーバレスな仕組みを構築します。
AWSマネジメントコンソールにログインします。
AWSのアカウントを持っていない方は作成してください。無料です。
I/O -> AWS API Gateway
LineからのWebhookをAPI GateWayで受けてLambdaに転送します。
API Gatewayの画面を開けたら、+APIの作成をクリックします。
リソースタブ
apiを作成できたら左側のサイドバーに作ったAPIのメニューが表示されていると思います。
全部大事なのですが、APIをデプロイする上で必ず使うのがリソースと後述するステージです。
リソースタブではPOSTやGETなどのHTTPリクエストがきた時にする処理(メソッド)を定義できます。また、/line, /slack などの子リソースを作成したい時にも利用します。
早速リソースタブで新規メソッド(処理)を作成してみましょう。
ANYメソッドを作ります。
メソッド内にLambda関数というボックスがあると思いますが、そこにこれから作るLambda のARN(Amazon Resource Name)を入れることになります。
では、次は処理の実装をします。
処理 -> AWS Lambda
Lambdaはサーバーレス(+環境構築なし)でpythonを動かせます。
API GateWayと統合することで受け取ったリクエストを処理できます。
Lambdaの関数を新規作成する
サービスからLambdaにいきます。もしくは下のリンク参照
https://ap-northeast-1.console.aws.amazon.com/lambda/home
関数の作成ボタンを押し、以下のように設定します。
作成が終わると、Lambdaの基本画面(Designer)が出てきます。
右上のarnをコピーしてAPI Gatewayに移動します。
先ほどのANYをクリックしてLambda関数の所にarnを貼り付けるとLambdaの関数名が表示されますのでそれをクリックして、保存します。
するとこのような画面が出てきますのでOKを押します。
AWSではセキュリティのために権限(ロール)を細かく分けているのでそのままだとAPI GateWayからLambdaへのアクセスが許可されません。
しかしそれだと届いたリクエストをLambdaに渡せなくなるため、API GatewayにLambdaを呼び出す権限を与えます。
保存が終わると画面が変わるかと思います。
この画面は処理の見ての通り処理の流れを図にしています。クライアント(Line)からきたリクエストは統合リクエストによってLambdaの関数に転送されます。
これでAPIの入口はほぼ完成です。最後にデプロイをします。
最後に出てくるAPIのURLを試しにクリックしてみましょう!
Hello from Lambda!と書かれたページが出てくるはずです。
Lineのwebhook先を設定する
line developersの設定画面の下に行ってwebhook送信を利用するにして
↑のURLをコピペします。
接続確認して成功したらバッチリです!
Lambdaで処理の内容を実装する
入口ができたら中身を実装します。
再度Lambdaを開くと左側にAPI Gatewayが追加されているはずです。
少し下にスクロールすると関数コードがあるはずです。
API GatewayとLambdaの統合ではデフォルトでは右上に記されたハンドラが最初に実行されます。デフォルトですと
lambda_function.pyというファイルのlambda_handlerが呼ばれるようになっています。これらはカスタム可能です。
もともとあるコードをみてみましょう。
lambda_handlerの引数のeventにリクエストの本文が入ります。(POST, PUTなどの場合)
このサンプルでは即returnしていますのでlambdaのハンドラが呼ばれたら何もせずにHello from lambda!を返す、となっています。
つまりこのreturnの前に処理を書き込んでいきます。
Lineから来たメッセージをSlackに転送する
本題です。最初に作ったLine Botから来たメッセージをSlackに転送(Webhook)してあげるにはどうすれば良いでしょうか。
まずLINE側から来るリクエストの例を見てみましょう。
↑の様な形でリクエストが来ます。
すなわちこの形式でテストすれば良いのでLambdaの上の方にあるテストというボタンを押して、この本文を登録しましょう。
* 追記 これですがリクエストがヘッダーごときたので今回はjsonのことも考慮する必要が出てきました。後述のコードは対応済みなのでコードから読み取ってくださると幸いです。 時間があるときに記事も直します。
上のリクエスト例を見ると["events"][0]["message"]["text"]を取得すれば本文を取れます。
これを実行した時の出力は
{
"statusCode": 200,
"body": "\"Hello, world ここにLINEのメッセージが入っている\""
}
になります。
Slack incoming webhook にPOST
無事取れているので次はこのメッセージをSlackに転送します。
slackにはurllibを使ってPOSTするだけ!あら簡単!
このコードを追加してテストしてみましょう!
完成!
ではでは動かしてみます。
何かあればいつでも連絡ください!
レポジトリも置いておきます。
何か質問や意見があればコメントやリプライください!!
感想欲しいです!!初めてのAdvent Calender頑張ったー!
明日はstopll2さんの
独身30代サラリーマンの「ひとりSlack」運用について
です!!
ではまた会いましょう!
Bye!