Serverless を使って 簡単なLine Bot を作った話

  • 17
    いいね
  • 0
    コメント

勉強会の話すネタ作りに、ちょっと試してみました。

完全に動かしてみた、的な感じなので動作保障は無いですが、誰かの参考になればと思います。

準備

serverless のインストール

$ npm install -g serverless

AWS ユーザの作成

~/.aws/credential がない場合、ユーザを作成してほげほげする。

$ aws iam create-user --user serverless-bot
$ aws iam create-access-key --user-name serverless-bot
$ aws iam attach-user-policy --user-name serverless-bot --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

キーなどを ~/.aws/credential に貼っつけて完了

Line Bot 作成の準備

Line Notify を利用して簡単なHTTP通信でメッセージ送信が可能。

開発者ドキュメントはこちらから確認できる。

Oauth 実装はテスト利用するには面倒なので今回は下記のマイページから発行できる、自分用トークンを利用して実装。

https://notify-bot.line.me/my/

なおAPIはBearer認証でトークンさえ手に入れれば後は楽ちん。

コードの作成

まずは以下のコマンドでスケルトンを作成

$ mkdir serverless-bot
$ cd serverless-bot
$ serverless create --template aws-nodejs --name serverless-bot

スケルトンとして 以下 3つのファイルが出来る。

  • event.json : 関数のテスト実行で利用するパラメータファイル
  • handler.js : 関数を記述するJSファイル
  • serverless.yml : いろいろ設定とか記述するファイル

とりあえず Line にメッセージを送信してみる。

今回、HTTP通信にはsuperagent を使用するので、npmでインストールしておく。

$ npm init
$ npm i superagent -S

メッセージを送信するための関数を handler.jsに追加

const request = require("superagent")

module.exports.line = (event, context, callback) => {
  request
      .post('https://notify-api.line.me/api/notify')
      .send({ message: 'ねえねぇ' })
      .set('Content-Type', 'application/x-www-form-urlencoded')
      .set('Authorization', 'Bearer xxxxxxxxxxx')
      .end(function(err, res){
        const response = {
          statusCode: 200,
          body: JSON.stringify({
            message: 'Go Serverless v1.0! Your function executed successfully!',
          })
        };
        callback(null, response);
      })
};

関数をサービスとして登録するので、serverless.yml を編集

functions:
  line:
    handler: handler.line
    events:
      - schedule: rate(10 minutes)
      - http:
          path: serverless/line
          method: get

今回はスケジュールとHTTPの2つをイベントとして登録し、動作をテストしてみる。

deploy / debug / logging

以下のコマンドでデプロイを実行する。

$ serverless deploy -v 
....中略.....
Service Information
service: serverless-bot
stage: dev
region: us-east-1
api keys:
  None
endpoints:
  GET - https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/serverless/line
functions:
  serverless-bot-dev-hello: arn:aws:lambda:us-east-1:xxxxxxxx:function:serverless-bot-dev-hello
  serverless-bot-dev-line: arn:aws:lambda:us-east-1:xxxxxxxx:function:serverless-bot-dev-line

HTTP イベントを設定している場合、デプロイログ画面で URLが表示される。

$ curl -X GET  https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/serverless/line

みたいにすると無事Lineに通知が届き実行可能。

AWSのダッシュボードからスケジューラも適切に設定されていることが確認出来る。

10minに1回、ねぇねぇとつぶやいてくれるメンヘラbotがお手軽に完成する。

デプロイしたら、コマンド経由でテスト実行する事も可能。以下のコマンドで関数を実行する。

$ serverless invoke --function line --log 

あくまでココではテスト実行するだけなので、ここでエラーを吐かなくてもHTTP経由ではエラー、ということもある。

デプロイしていないコードは実行できないっぽいので、本格的に開発するならmochaなりでテスト書くのが無難そう。

各種イベントを設定する

schedule イベント

line:
    handler: handler.line
    events:
      - schedule: rate(10 minutes)

構文については、 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html を参照

1分のときは 10 minutesではなく1 minuteなので注意

http イベント

line:
    handler: handler.line
    events:
      - http:
          path: serverless/bot
          method: get

path でエントリー、methodで メソッドを指定する。

こちらのイベントを設定すると自動でAPI Gateway が起動し、ほげほげしてくれるみたい。

感想・気になったところとか

本来の目的としてはHerokuで動いていたBacklog用のBotを Serverless で置き換えられたらなぁ…というところだったので、
上で試した機能を利用して概ね実装することは可能っぽい。

Lineの通知はおもったよりも簡単。SlackじゃなくてLineの方が良い類の通知、プライベート周りでめっちゃありそうなので重宝しそう。

nodeもモジュールなど不通に使える様なので、通常のnode開発のフローでシンプルな関数を記述していけば、そのままLambdaとしてデプロイ出来るっぽくって、すごいお手軽感はある。

  • line の開発者ドキュメント、URLとかコピペすると文字がバグる時ある。
  • 料金とかどうなるのかとかが気になる。
  • CloudFormationって何!?掛かるの? - 無料です参考
  • API Gateway って何!?いくらかかるの? - ちょっとだけお金かかる。参考
  • nodeのversionは4.3らしい。素敵。
  • ソースをGithubで管理したいと思うので、セキュリティキーの埋め込みとかそういうのなんとかマスターしたい。
  • Lineの通知は以外とめちゃくちゃ簡単だった。ほんとに簡単。

 参考

Serverless Framework v1.0の使い方まとめ
http://qiita.com/horike37/items/b295a91908fcfd4033a2

Serverless 1.0 の参考プロジェクト
https://github.com/serverless/serverless#example-projects-v10