🚀

AWSで動かすAI要約機能付きRSSリーダーを自作してみた

2024/06/24に公開

RSSリーダーを自作してAWSで動かしてみました。
RSSリーダーといえばFeedlyや個人的によくアクセスしている、企業テックブログRSSがあり、参考が多くて技術検証にちょうどよかったです。
ある程度やりたかったことは実現できて満足したので最後にこの記事で供養しようと思います。

作ったもの

キャプチャ

https://github.com/ryosuke-horie/rss-summary-notifier

*課金が発生するのでAWSリソースは削除済みです。

機能

大まかに実装した機能の紹介です。

  • RSSフィードの収集
  • Bedrockによるコンテンツの要約
  • 技術のカテゴライズ
  • カード風にまとめたコンテンツの表示
  • 定期的なコンテンツの更新
  • 設定したコストを超えたらSlackに通知

アーキテクチャ

バックエンド

  1. Lambda(Python)でRSSフィードを収集しURLやTitleなど基本的な情報をDynamoDBに保存
  2. DynamoDB Streamによってもう1つのLambda関数を実行。
    • コンテンツを取得しBedrock(Cloude Haiku)で要約
    • コンテンツに含まれる文字列から技術要素を判定しカテゴライズ
    • DynamoDBを更新
  3. 上記をEventBridgeで定期実行

フロントエンド

  1. NextjsでDynamoDBからデータを取得しUIを生成
  2. 静的エクスポートしS3に保存
  3. CloudFrontから配信
  4. 上記をGitHub Actionsで定期実行し静的ページを更新

技術スタック

  • AWS (CDK)

    • S3
    • DynamoDB
    • Lambda
    • EventBridge
    • CloudFront
    • CloudWatch
    • Bedrock (Cloude Haiku)
  • Next.js

    • Bun
    • Tailwind CSS
    • TypeScript
    • DaisyUI
  • Python

  • GitHub Actions

開発を始めた意図・モチベーションについて

RSSリーダーで以下の記事を見つけました。

https://aws.amazon.com/jp/builders-flash/202406/catch-up-genai-update/

以下のサンプルを利用して、AWS What`s NewのブログをBedrockで要約してSlackなどに投稿するような仕組みをCDKを利用して構築する、という内容のものでした。

https://github.com/aws-samples/whats-new-summary-notifier

cdk.jsonにRSSのリンクを追加するだけで対象を増やすことができるようだったので、Zennなどのリンクを追加して自分のSlackに通知できるようにしてみました。

DynamoDBに登録する処理があるならUIを自作してみたくなり、ちょうど業務のためにCDKやGitHub Actionsに慣れておきたかったこともあり開発を進めてみました。

要約などの機能はFeedlyなど他のサービスで十分なのと、技術的に試したいことが完了して満足したためモチベーションが消えたのでここで公開し供養しようと思いました。

開発を通して得られた・試せた知見

ぱっと思いつくものを上げてみます。

  • CDKを含むCI/CDの実装
  • Bedrock(生成AI)を使用したアプリケーションの開発とどんなものが取得できるのか
  • Nextjsの静的エクスポートの成果物をS3, CloudFrontで配信する方法
  • daisyUIが便利
  • Pythonを利用したスクレイピング
  • コストを抑えたサーバレススタック等のアーキテクチャ

苦労した点

  • Bedrockの要約精度

    Bedrockによる要約の精度が期待通りではない場合がありました。要約のチューニングやコンテンツの前処理を工夫して、精度を改善しました。

  • Next.js Static Export

    基本SSRを利用するので記事が少なく、使い慣れていない身としては心もとない思いでした。また、UIの実装について学びたいわけではなかったためChatGPTを利用して楽をしたかったですが、生成されるコードにgetStaticPathとかが紛れていると萎えます。

  • スクレイピングのカスタマイズ

    AWS SampleのコードだとZennなどのコンテンツが収集できませんでした。サクッと終わるかと思っていましたが、HTMLタグの指定など本格的に実装しようとしたら作りこみが必要そうに感じました。今回は取得できればいいとあきらめたので特定タグで取得を試みてできなければ最終的にHTML全体を取得する方法に落ち着きました。

費用について

BedrockでCloude Haikuを利用していた分が課金対象で、DynamoDB,S3, CloudFrontは無料枠で賄うことができました。
約2週間程度立ち上げ、ZennやClassmethodなどを含む10個以上のRSSを登録し100件程のコンテンツを収集しBedrockで要約ししました。
開発中、何度もDynamoDBを削除して再度収集して要約というプロセスを踏み、利用回数を重ねましたが、2.2$程度に収まりました。

AWSでCDKを利用して立ち上げることがテーマのためUI用にサーバーを利用すると金額が跳ね上がるので、無料枠が多いS3,CloudFrontにNext.jsのStatic Exportを使用しました。
コンテンツの更新のためにDyanmoDBのScanコマンドを実行してGitHub Actionsで定期的にビルド・S3の更新・CloudFrontのキャッシュ削除を実行しています。
Scanを利用していますが、定期実行のみで100件程度を取得するだけなので無料枠に収まりました。

運用を続けるなら自腹でやってもいいレベルの課金ですが、提供する機能はFeedlyの下位互換なので止めることにしています。

最後に

この記事の目的はこの個人プロジェクトの供養です。
ありがとうございました。

Discussion