ヤマムギ

growing hard days.

*

Feedlyのフィードを自動でSlackへ投稿する(AWS Lambda , Amazon DynamoDB)

   


やりたいこと

Feedlyで共有したいフィードに特定のタグを付けます。
特定のタグがついたフィードは自動的にSlackへ投稿されます。

実現方法

FeedlyのAPIを使ってダイレクトでSlackへ投稿すればいいのですが、単純にそれをすると投稿が重複する可能性があるので、間にAmazon DynamoDBを挟みました。

(1) 5分ごとにAmazon CloudWatchスケジュールで実行されるLambdaが過去30分にFeedlyで特定のタグがつけられたフィードを取得して、Amazon DynamoDBに格納します。

(2) Amazon DynamoDBのストリームにより実行されたLambdaがレコードを受け取って、Slackへ投稿します。

パーティションキーをFeedlyのfeed_idにすることで同じフィードがDynamoDBに格納されないようにしました。

この方法だと、RSSリーダーを変更するときや増やすときは、(1)の機能だけ変更するか追加するかでいいので変化を考えやすいと思いました。

動作

例えばスマートフォンアプリのFeedlyでフィードに特定のタグを付けると、

5分間隔ぐらいでSlackに投稿されます。

ソースコード

  • Python 3.6.1

ソースコードはGitHubにあります。

2つのディレクトリにLambda_Functionをそれぞれ入れているので、ご利用される場合はそれぞれでzipを作成して、Lambda関数を設定してください。

feedly_to_dynamo

Feedlyで特定のタグがつけられたフィードを取得して、Amazon DynamoDBに格納します。

環境変数

  • FEEDLY_URL : FeedlyのAPI URLです。
  • FEEDLY_TOKEN : Feedlyのトークンです。
  • DYNAMO_TABLE : Amazon Dynamodbのテーブル名
  • INTERVAL_MINUTE : 何分前に登録されたフィードから取得するか、指定しない場合は7日前から取得します。
  • FEED_COUNT : 取得するフィードの最大数を指定。指定しない場合は100。
  • ERROR_SLACK_URL : エラー発生時に通知したいSlackのWebhook Incoming URL
  • ERROR_SLACK_CHANNEL : エラー発生時に通知したいSlackのチャンネル
  • LOG_LEVEL : ログレベル。指定しない場合はERROR。
FeedlyのAPI URLの例

https://cloud.feedly.com/v3/streams/contents?streamId=user/userid/tag/tagname
詳しくはFeedlyのAPIのドキュメントを見てください。

Feedlyのトークン

FeedlyのAPIのドキュメント Developer Access Token内のStart hereリンクから取得してください。

コード抜粋 Feed取得

コード抜粋 DynamoDB格納

dynamo_to_slack

Amazon DynamoDBのストリームにより実行されたLambdaがレコードを受け取って、Slackへ投稿します。

環境変数

  • SLACK_URL : 投稿先のSLACKのWebhook Incoming URL
  • SLACK_CHANNEL : 投稿先のSlackのチャンネル
  • ERROR_SLACK_URL : エラー発生時に通知したいSlackのWebhook Incoming URL
  • ERROR_SLACK_CHANNEL : エラー発生時に通知したいSlackのチャンネル
  • LOG_LEVEL : ログレベル。指定しない場合はERROR。

コード抜粋

DynamoDBの設定

  • パーティションキー : id

トリガー

トリガーにLambda関数を指定します。

参考 DynamoDB ストリーム イベント


最後までお読みいただきましてありがとうございました!

【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS, Python , , , ,

ad

ad

  関連記事

AWS Cloud9で環境を共有する

(特にリモート環境では)画面共有をしたり、リポジトリを共有したり、コーディング環 …

AWS RDS でMySQLインスタンスを構築する

Amazon Web ServiceにはAmazon Relational Da …

Amazon RDS MySQLでCSVをload data するときに「Access denied」発生

超小ネタです。 AWSのデータベースサービスの Amazon RDSのMySQL …

Amazon EC2のAMIイメージを自動取得して保持日数が過ぎたら削除

画像の保存をEC2に戻した事もあってEC2のバックアップの自動取得を勉強がてらや …

Pepper 開発 ワークショップ初級~中級~番外編に1日で一気に参加した

Pepperの開発方法が知りたかったので、Pepperアトリエ秋葉原 with …

リザーブドインスタンス推奨事項を確認した

マネジメントコンソールで[AWSコスト管理]カテゴリの[AWS Cost Exp …

Amazon Rekognitionでイベント参加者の顔写真を解析して似ている人ランキングをその場で作る

2017/9/21に開催されたAWS Cloud Roadshow 2017 大 …

AWSアカウントルートユーザーのMFAでYubicoセキュリティキーを設定した

先日Yubico セキュリティキーを購入して、USBにささなければならないのがな …

AWS Lambda(Python3.7)でPandocを実行する

昨日まで(AWS Batch) 昨日までは、Pandocを実行して、S3バケット …

Pepperで撮影した写真をAmazon Rekognitionで分析してその結果をPepperがしゃべる ~(1)AWS編~

Pepperの機能を使えるところは使って、何かしたいなあと思ってまして。 目(カ …