みなさま、はじめまして!
この記事はエイチームブライズ/エイチームコネクト/エイチーム引越し侍 Advent Calendar 2018 22日目の記事です。
22日目はインフルエンザ予防接種でフラフラの、エイチーム引越し侍@ysysysysが担当いたします。
概要
さて、ご存知のようにさる先月末からAWS LambdaでRubyがつかえるようになりました。RubyおよびRailsからプログラミングの世界に迷いんこんだ私としては嬉しい限りです。ということで今回はLambda@RubyでLINE Messaging APIを動かしてみます。
#下準備
LINE Messaging API
Messaging APIの概要はこちらから
公式のドキュメント通りにアカウント、channelを作成し設定します。
Channel Secretとアクセストークンは使用するので控えておきましょう。
AWS Lambda
AWSで提供されているLambdaというサービスは、サーバーいらずで任意のプログラムを実行できる優れものです。
BOTを動かすにはweb上になんらかの実行環境が必要です。
通常であればVPSを立てるなり、HerokuなどのPaasなどを使う必要がありますが、Lambdaはコンソールにソースコードを書くだけで簡単に実行環境を手に入れることができるのです。
それではLambdaの設定をしていきます。
AWSのコンソール画面からLambdaを探し出してください。
作成画面から次のように設定しました。
続いてLambdaを発火させるトリガーを設定します。
今回はMessaging APIからHTTPリクエストを受けつけるためにAPI Gatewayを使用します。
下記のように左のメニューからAPI Gatewayを選択します。
Messaging API側からのリクエストはPOST形式で送られてきます。したがって下記のように「リソースのアクション」からPOSTメソッドを追加します。
Lambda関数の部分には先ほど作成した「line_bot」を入れておきます。
保存したらAPIをデプロイします。
表示されるURLは後ほどMessaging APIのwebhookに登録します。
これで一通りの下準備は終了です。
ソースコード
いよいよLambdaにコードを書いていきます。
再びLambdaの画面にいきます。
ご覧の通りコンソール画面からコードを直接書くことができます。
ですが今回は簡単にLINE側とのやり取り行いためGemを使いたいです。
その場合はローカルでGemのインストールとコーディングを済ませてからZipファイルでLambdaにアップします。
せっかくなので開発はAWS Cloud9からやってみます。
Cloud9のページから「create environment」へ
2ページほどの簡単な設定をすませると開発環境がブラウザ上に立ち上がります。
下部のコンソールから
bundle init
Gemfileが生成されたら下記を追記。
gem 'line-bot-api'
その後Gemをvendor以下にインストールします。
bundle install --path vendor/bundle
あとはこちらを参考におうむ返しするBOTをコーディングしていきます。
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
あとはコンソール上部のメニューからプロジェクトをダウンロードして一旦ローカルに落としましょう。
zipをアップロード。
これでコンソールにコードが表示されているはずです。
次いで環境変数を設定します。
ついでにハンドラの設定もline_bot.handler
に変えてやります。
さて、これで実装が終わりました。
※注
なかなか動かず小一時間悩んでいたのですが、原因はCloud9のRubyのバージョンが2.4だったからでした。
無理やりvendor配下のディレクトリ名を変更してごまかしています、、
動かしてみる
Messaging APIのチャンネル基本設定画面からwebhookURLを登録します。
接続確認をして成功しましたと出ればOKです。
BOTを友達登録して、LINEを送ります。
無事おうむ返ししてくれました。にしても時間帯よ、、、
お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひともエイチームグループ採用ページ(Webエンジニア詳細ページ)よりお問い合わせ下さい。
#最後に
明日のAdvent Calender23日目は@GakuYasuiさんがDAppsのことについて書いていただけるみたいです(初めて聞いた)。ブロックチェーン関連のことのようですがどのようなことを教えていただけるのでしょうか??みなさんお楽しみに!