Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

みなさま、はじめまして!
この記事はエイチームブライズ/エイチームコネクト/エイチーム引越し侍 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を送ります。

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

お知らせ

エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひともエイチームグループ採用ページWebエンジニア詳細ページ)よりお問い合わせ下さい。

最後に

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

a-hikkoshi
当社は、親会社である株式会社エイチームの経営理念をそのままに、引越しの比較サービス開始以降、大切にしてきた「三方よし」の理念を基本として、世の中に求められるサービスの創造を目指します。
https://hikkoshi.a-tm.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした