Lambda@RubyでサーバーレスLINE BOTを作ってみた

Lambda@RubyでサーバーレスLINE BOTを作ってみた:

みなさま、はじめまして!

この記事はエイチームブライズ/エイチームコネクト/エイチーム引越し侍 Advent Calendar 2018 22日目の記事です。

22日目はインフルエンザ予防接種でフラフラの、エイチーム引越し侍@ysysysysが担当いたします。


概要

さて、ご存知のようにさる先月末からAWS LambdaでRubyがつかえるようになりました。RubyおよびRailsからプログラミングの世界に迷いんこんだ私としては嬉しい限りです。ということで今回はLambda@RubyでLINE Messaging APIを動かしてみます。


下準備


LINE Messaging API

Messaging APIの概要はこちらから

公式のドキュメント通りにアカウント、channelを作成し設定します。

Channel Secretとアクセストークンは使用するので控えておきましょう。
スクリーンショット 2018-12-22 2.37.42.png


スクリーンショット 2018-12-22 2.37.27.png



AWS Lambda

AWSで提供されているLambdaというサービスは、サーバーいらずで任意のプログラムを実行できる優れものです。

BOTを動かすにはweb上になんらかの実行環境が必要です。

通常であればVPSを立てるなり、HerokuなどのPaasなどを使う必要がありますが、Lambdaはコンソールにソースコードを書くだけで簡単に実行環境を手に入れることができるのです。

それではLambdaの設定をしていきます。

AWSのコンソール画面からLambdaを探し出してください。

作成画面から次のように設定しました。



スクリーンショット 2018-12-21 22.34.10.png


ランタイムはもちろん「Ruby2.5」です。

続いてLambdaを発火させるトリガーを設定します。

今回はMessaging APIからHTTPリクエストを受けつけるためにAPI Gatewayを使用します。

下記のように左のメニューからAPI Gatewayを選択します。


スクリーンショット 2018-12-21 22.34.58.png


「必要な設定」から下記のように設定しました。


スクリーンショット 2018-12-21 22.22.16.png


さらに進みAPIの設定を続けます。

リソースを作成します。


スクリーンショット 2018-12-22 1.50.23.png


Messaging API側からのリクエストはPOST形式で送られてきます。したがって下記のように「リソースのアクション」からPOSTメソッドを追加します。


スクリーンショット 2018-12-21 22.35.38.png


Lambda関数の部分には先ほど作成した「line_bot」を入れておきます。

保存したらAPIをデプロイします。


スクリーンショット 2018-12-22 0.55.28.png

スクリーンショット 2018-12-22 0.55.44.png


表示されるURLは後ほどMessaging APIのwebhookに登録します。
スクリーンショット 2018-12-22 2.45.45.png


これで一通りの下準備は終了です。


ソースコード

いよいよLambdaにコードを書いていきます。

再びLambdaの画面にいきます。


スクリーンショット 2018-12-21 23.14.07.png


ご覧の通りコンソール画面からコードを直接書くことができます。

ですが今回は簡単にLINE側とのやり取り行いためGemを使いたいです。

その場合はローカルでGemのインストールとコーディングを済ませてからZipファイルでLambdaにアップします。

せっかくなので開発はAWS Cloud9からやってみます。

Cloud9のページから「create environment」へ


スクリーンショット 2018-12-21 23.12.02.png


2ページほどの簡単な設定をすませると開発環境がブラウザ上に立ち上がります。

下部のコンソールから

bundle init 
Gemfileが生成されたら下記を追記。

gem 'line-bot-api' 
その後Gemをvendor以下にインストールします。

bundle install --path vendor/bundle 
あとはこちらを参考におうむ返しするBOTをコーディングしていきます。

line_bot.rb
require 'line/bot' 
 
  def handler(event:, context:) 
    body = event["body"] 
    signature = event["headers"]["X-Line-Signature"] 
    unless client.validate_signature(body, signature) 
      error 400 do 'Bad Request' end 
    end 
    requests = client.parse_events_from(body) 
    requests.each do |req| 
      case req 
      when Line::Bot::Event::Message 
        case req.type 
        when Line::Bot::Event::MessageType::Text 
          mes = req.message['text'] 
          token = req['replyToken'] 
          message = { 
            type: 'text', 
            text: mes 
          } 
          client.reply_message(token, message) 
        end 
      end 
    end 
  end 
 
  private  
 
  def client 
    @client ||= Line::Bot::Client.new { |config| 
      config.channel_secret = ENV['LINE_CHANNEL_SECRET'] 
      config.channel_token = ENV['LINE_CHANNEL_TOKEN'] 
    } 
  end 
書き終わったらvendor以下とスクリプトファイルをzipに圧縮します。

zip -r linebot.zip vendor line_bot.rb  
あとはコンソール上部のメニューからプロジェクトをダウンロードして一旦ローカルに落としましょう。


スクリーンショット 2018-12-22 2.24.27.png


zipをアップロード。


スクリーンショット 2018-12-22 0.47.13.png


これでコンソールにコードが表示されているはずです。

次いで環境変数を設定します。


スクリーンショット 2018-12-22 2.34.35.png


ついでにハンドラの設定もline_bot.handlerに変えてやります。

さて、これで実装が終わりました。


※注
なかなか動かず小一時間悩んでいたのですが、原因はCloud9のRubyのバージョンが2.4だったからでした。

無理やりvendor配下のディレクトリ名を変更してごまかしています、、
スクリーンショット 2018-12-22 0.57.10.png


動かしてみる

Messaging APIのチャンネル基本設定画面からwebhookURLを登録します。

接続確認をして成功しましたと出ればOKです。


スクリーンショット 2018-12-22 0.56.56.png


BOTを友達登録して、LINEを送ります。
68747470733a2f2f71696974612d696d6167652d


無事おうむ返ししてくれました。にしても時間帯よ、、、


お知らせ

エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。

興味のある方はぜひともエイチームグループ採用ページWebエンジニア詳細ページ)よりお問い合わせ下さい。


最後に

明日のAdvent Calender23日目は@GakuYasuiさんがDAppsのことについて書いていただけるみたいです(初めて聞いた)。ブロックチェーン関連のことのようですがどのようなことを教えていただけるのでしょうか??みなさんお楽しみに!

コメント

このブログの人気の投稿

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-04-30 23:37:32 RSSフィード2021-04-30 23:00 分まとめ(42件)

投稿時間:2023-02-05 02:09:04 RSSフィード2023-02-05 02:00 分まとめ(9件)