TGH -Taka Gadgets House-

とことこエンジニアリング

LINEからSlackにメッセージを転送するBotをAWSで作成してみる。

はじめに

この記事は Slack Advent Calender2018 12日目の記事です。

前日はtemmihiさんの[技術(者)を支えるネコ - にゃーんbotを作った]でした!

にゃーん🐱 んで実は今回ぼくが話す内容でにゃーんの基礎のところもわかったりしますので一緒に頑張りましょう!(初めてプログラミングする方でもきっとできる!)

 

エンジニアや今風のスタートアップに勤めている方はSlackを使っている方が多いと思います。

ですがまだまだ周りの方がLINEをメインで使っている方も多いはず。

そんなわけで今回はLINEとSlackのBOTを作ってLINEのメッセージをSlackに転送してみます。

こんなのが出来ます

f:id:takapc:20181211205213g:plain



使うもの

- AWS (Lambda, API Gateway)

- python3.6

- Line messenger API

- Slack Webhook API 

目次

Line Botを作る

まずはLINEのメッセージを受け取るためのBotを作ります。

Botを作るためにはLINE Developersに登録する必要があります。

 今回はMessaging APIを使っていきます。他にもソーシャルログインであるLINEログインや流行りのLINE Payなどの開発もできるようです。そのうちやろうかな。

プロバイダーを作成する

LINEのBOTにはプロバイダーの作成が必要です。

チャネル(BOT)を作成する

Bot本体を作ります。

botの名前などを設定、規約に同意するだけですぐに終わります。

プランについてですが、フリープランで問題ないです。

今後も色々試してみたい方はdeveloper trialでも良いです。

両者の違いについては以下の記事がわかりやすいです。

今回作るLine側のBot自身からメッセージを送ることはないので(push API)は使いません。

f:id:takapc:20181210174833p:plain

チャネルを作成するとbotのアイコンが出てくるので詳細画面を開きます。


f:id:takapc:20181211084919p:plain

Bot詳細画面の下の方にメッセージ送受信設定という欄があります

今回はwebhook送信を使いますので利用するにします。

またグループのメッセージを転送したいと思っている方は下のBotグループトーク参加も利用するにしておきましょう。

f:id:takapc:20181211090500g:plain

これでline側のセットアップは完了です

 

Slack Webhook Botを作る

今度はSlack側のbotを作っていきます。

Slack API | Slack

ここにアクセスしてStart Buildingをクリックします。

f:id:takapc:20181211091259p:plain

appの作成画面が出てくるのでapp名と参加させるWorkspaceを洗濯してCreateします。

botにどの機能をつけるかが選べるので今回はIncoming WebhooksをOnにします。

f:id:takapc:20181211091526p:plain

また、Lineから飛んできたメッセージをどのチャンネルに飛ばすかを設定します。

f:id:takapc:20181211091921p:plain

設定が完了するとWebhookのURLが生成されます。

f:id:takapc:20181211120135p:plain

試しにcurlでテストしてみましょう

Slack Webhook Test

設定したチャンネルにHello WorldがきていればこれでSlack側の設定もOKです。

AWSの構成を作る

今回はいわゆるサーバレスな仕組みを構築します。

AWSマネジメントコンソールにログインします。 

AWSのアカウントを持っていない方は作成してください。無料です。

aws.amazon.com

I/O   -> AWS API Gateway

 LineからのWebhookをAPI GateWayで受けてLambdaに転送します。

f:id:takapc:20181211123349p:plain

API Gatewayの画面を開けたら、+APIの作成をクリックします。

f:id:takapc:20181211123437p:plain

新しいAPIapi名をつけましょう。

f:id:takapc:20181211123705p:plain

リソースタブ

apiを作成できたら左側のサイドバーに作ったAPIのメニューが表示されていると思います。

全部大事なのですが、APIをデプロイする上で必ず使うのがリソースと後述するステージです。

リソースタブではPOSTやGETなどのHTTPリクエストがきた時にする処理(メソッド)を定義できます。また、/line, /slack などの子リソースを作成したい時にも利用します。

早速リソースタブで新規メソッド(処理)を作成してみましょう。

ANYメソッドを作ります。

f:id:takapc:20181211153223g:plain

メソッド内にLambda関数というボックスがあると思いますが、そこにこれから作るLambda のARN(Amazon Resource Name)を入れることになります。

では、次は処理の実装をします。
 

処理 -> AWS Lambda

 Lambdaはサーバーレス(+環境構築なし)でpythonを動かせます。

API GateWayと統合することで受け取ったリクエストを処理できます。

Lambdaの関数を新規作成する

サービスからLambdaにいきます。もしくは下のリンク参照

https://ap-northeast-1.console.aws.amazon.com/lambda/home

関数の作成ボタンを押し、以下のように設定します。

f:id:takapc:20181211154825p:plain

作成が終わると、Lambdaの基本画面(Designer)が出てきます。

右上のarnをコピーしてAPI Gatewayに移動します。

f:id:takapc:20181211155241p:plain

先ほどのANYをクリックしてLambda関数の所にarnを貼り付けるとLambdaの関数名が表示されますのでそれをクリックして、保存します。

f:id:takapc:20181211160057p:plain

するとこのような画面が出てきますのでOKを押します。

f:id:takapc:20181211164044p:plain

AWSではセキュリティのために権限(ロール)を細かく分けているのでそのままだとAPI GateWayからLambdaへのアクセスが許可されません。

しかしそれだと届いたリクエストをLambdaに渡せなくなるため、API GatewayにLambdaを呼び出す権限を与えます。

保存が終わると画面が変わるかと思います。

f:id:takapc:20181211161154p:plain

この画面は処理の見ての通り処理の流れを図にしています。クライアント(Line)からきたリクエストは統合リクエストによってLambdaの関数に転送されます。

これでAPIの入口はほぼ完成です。最後にデプロイをします。

 

f:id:takapc:20181211165751g:plain

最後に出てくるAPIのURLを試しにクリックしてみましょう!

Hello from Lambda!と書かれたページが出てくるはずです。

Lineのwebhook先を設定する

line developersの設定画面の下に行ってwebhook送信を利用するにして

↑のURLをコピペします。

接続確認して成功したらバッチリです!

f:id:takapc:20181211204343p:plain


 

 

Lambdaで処理の内容を実装する

入口ができたら中身を実装します。

再度Lambdaを開くと左側にAPI Gatewayが追加されているはずです。

f:id:takapc:20181211165948p:plain

少し下にスクロールすると関数コードがあるはずです。

f:id:takapc:20181211170219p:plain

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側から来るリクエストの例を見てみましょう。

Messaging APIリファレンス

Line Messenger APIからのリクエスト例

↑の様な形でリクエストが来ます。

すなわちこの形式でテストすれば良いのでLambdaの上の方にあるテストというボタンを押して、この本文を登録しましょう。

* 追記 これですがリクエストがヘッダーごときたので今回はjsonのことも考慮する必要が出てきました。後述のコードは対応済みなのでコードから読み取ってくださると幸いです。 時間があるときに記事も直します。

f:id:takapc:20181211180812g:plain

上のリクエスト例を見ると["events"][0]["message"]["text"]を取得すれば本文を取れます。

これを実行した時の出力は

{
"statusCode": 200,
"body": "\"Hello, world ここにLINEのメッセージが入っている\""
}

になります。

Slack incoming webhook にPOST

無事取れているので次はこのメッセージをSlackに転送します。

slackにはurllibを使ってPOSTするだけ!あら簡単!

このコードを追加してテストしてみましょう!

f:id:takapc:20181211184934g:plain

完成!

ではでは動かしてみます。

f:id:takapc:20181211205213g:plain

何かあればいつでも連絡ください!

レポジトリも置いておきます。

github.com

twitter.com

何か質問や意見があればコメントやリプライください!!

感想欲しいです!!初めてのAdvent Calender頑張ったー!

明日はstopll2さんの

独身30代サラリーマンの「ひとりSlack」運用について

です!!

qiita.com

ではまた会いましょう!

Bye!