概要
AWS Lambda + Serverless Framework + Slackを使ってカスタマイズ出来るfeedリーダーを作ろうという記事のその1です。
(最初は一つの記事で完結させようとしていたのですがやることが多すぎました...なお続編があるかどうかは不明)
こんなの作ったよ系の記事なので、ツールとかフレームワークの説明は少なめかも。
そもそもfeedリーダーを作ろうと思った動機
実はfeedの機能自体はSlackにあって、各チャンネルで
/feed subscribe https://hoge/feed
のように打つとそのチャンネルに定期的にフィードの記事が流れてきます。ただ
- 一つ一つの記事のdescriptionがとても長い
- feedによっては大きいサイズの画像が表示される
などの理由から、流れてくる記事をカスタマイズしたいなーという思いから作り始めました。
Serverless Frameworkの説明
Serverless Frameworkは、AWS Lambdaなどの、関数単位で提供されているサービスの環境準備やデプロイ、パッケージング、バージョン管理、ローカルでのデバッグなどをやってくれるフレームワーク・ツールです。
3か4つぐらいのコマンドさえ覚えておけばなんとかなるので、非常に使いやすいです。
詳しくは以下の記事が分かりやすいかと思います。
- http://qiita.com/hiroshik1985/items/6d979ff1afb56953b62e
- http://dev.classmethod.jp/cloud/aws/easy-deploy-of-lambda-with-serverless-framework/
具体的なデプロイのコマンドなどは後述のhttps://github.com/yudetamago/my_rss_to_slack_service
を参照のこと。
今回の記事で出来たもの
とりあえず
- Serverless Frameworkを使ったデプロイ
- デプロイした関数をデバッグ実行するとfeed(今のところRSSのみ)を取ってきてSlackのwebhookに送信する
という最低限feedの内容をSlackに引っ張ってこれるところまで出来ました。
コードではサンプルとしてAmazon Web Services ブログのfeedを取ってきています。
コードの仕組み・説明
出来たもの
https://github.com/yudetamago/my_rss_to_slack_service
全体としてはfeedをHTTP GETで取ってきて、Slack通知用に変換して送信しているだけだったりします。
(今回は最低限のところしか作っていないので、自分で関数を呼び出してfeed内容を取得してくるだけです。。)
Lambda Functionの機能自体に関連する部分
まず serverless.yml
で指定した feedToSlack
という関数を handler.js
の module.exports
で定義します。そして後述するfeedの処理を終えてレスポンスを返すときには、引数の callback
にレスポンス内容を入れて callback(null, response)
のように呼び出すとLambdaの処理は終了します。
feedの処理
今回はfeedParserというライブラリを使っていて、リクエストをそのまま pipe
でパーサーのほうに流しています。記事を読み込むと parser.on('readable')
のコールバック関数が呼ばれるので、そこで読み込んだ記事を items
に入れたあと、slackのattachmentsに入れています。
これからやること/やりたいこと
- descriptionにHTMLタグが入っているときの処理
- 現状ではタグがそのままplain textで表示されるので、どうしようかな...という気持ち。
- RSSやAtomなどフィードの種類に依存しないようにする
-
item["rss:description"]["#"]
が依存している部分だけれど、これは正直頑張るしかない。
-
- 同じitemが2回以上送られないよう重複管理
- これだけはステートフルになってしまうので、何らかの方法で楽したい...
- 定期的にフィードを取ってくるようにする
- LambdaのSchedule機能使えば出来そう。
- ref. https://serverless.com/framework/docs/providers/aws/events/schedule/
- 複数のフィードに対応する
- 1つのLambda Functionで並列にHTTP GETする(そもそも出来るの?)か、フィードごとにLambda Function作るかみたいなところから検討する感じ。
まとめ
とりあえず最低限のところまでは出来たので、気力があれば続き作ります!