ゆるく情報収集するために、2020 年から masutaka-feed というサーバーレスアプリケーションを運用しています。

  • GitHub のプライベートフィード1を Mastodon に投稿
    • スターやフォローの通知は Pushover にも通知
  • はてブのお気に入り フィード2を Mastodon に投稿

いずれもフィードリーダーで真面目に購読するほどではないが、視界には入れておきたい立ち位置の情報です。

※ Mastodon の投稿先は鍵アカの @[email protected]

以前の構成図

以前は IFTTT の RSS Feed Integration を使って、新着アイテムを検知したら API Gateway 経由で Lambda 関数を呼び出していました。

ところが、2024 年になってから RSS Feed Integration が有料の IFTTT Pro でないと使えなくなり、仕方なく年額 $34.99 支払っていました。

GitHub:

以前の GitHub プライベートフィードの構成図

はてブ:

以前のはてブのお気に入りフィードの構成図

現在の構成図

IFTTT は他で全く使っていないので、さすがに年額 $34.99 は支払い続けたくなく、今回 AWS のサーバーレス構成に完全移行しました。

EventBridge Scheduler でフィードを定期的にチェックし、DynamoDB で既読管理を行う構成です。外部サービスへの依存がなくなり、AWS 内で処理が完結するようになりました。

GitHub:

現在の GitHub プライベートフィードの構成図

はてブ:

現在のはてブのお気に入りフィードの構成図

現在のアーキテクチャ

新しいアーキテクチャでは、以下のコンポーネントが協調して動作します。

EventBridge Scheduler による定期実行

GitHub プライベートフィードは 5 分ごと、はてブのお気に入りフィードは 15 分ごとに、次に示す Lambda の Subscriber 関数を定期実行します。

Lambda 関数の責務分離

フィードごとに 2 つの Lambda 関数に分離されています。

  1. Subscriber 関数: フィードの取得と新着アイテムの検出
    • RSS/Atom フィードを取得、rss-parser によるパース
    • DynamoDB で既読管理
    • 新着アイテムがあれば Notifier 関数を呼び出す
  2. Notifier 関数: 通知処理の実行
    • フィルタリング処理(GitHub では特定のイベントのみ通知)
    • Mastodon への投稿
    • Pushover への通知(GitHub のみ)

DynamoDB による重複防止

  • フィードごとにテーブルを作成
    • GitHub: masutaka-feed-github-state
    • はてブ: masutaka-feed-hatebu-state
  • パーティションキーを設定
    • GitHub: Atom フィード、各 entryid
    • はてブ: RSS 1.0 フィード、各 itemrdf:about
  • TTL を設定し、古いレコードを 30 日後に自動削除

SAM による構成管理は引き続き

今までどおり AWS SAM を使って、追加したコンポーネントも構成管理しています。

環境変数は今までどおり、GitHub Actions の Secrets/Variables で管理し、main ブランチに commit が追加されると自動デプロイされます。

移行してみて

  • 責務が増えたのに、想定外にコードがすっきりした
  • rss-parser が予想以上に便利で、GitHubFeedItemHatebuFeedItem というフィードの型さえ定義すれば、簡単にパース出来た
  • IFTTT Pro の年額 $34.99 を支払わずに済むようになった
    • AWS 料金は無料枠内に収まる
  • 約 2 週間、エラーゼロで運用できている

Claude Code で実装した

IFTTT Pro への課金を始めてから、頭の中では構想できていたものの、言ってしまえばリファクタリングなので、どうにもやる気が起きず、放置していました。

Claude Code なら、そのやる気の低さを乗り越えることができ、大いに利用させてもらいました。

  1. JavaScript から TypeScript への移行
  2. IFTTT Pro から AWS 自前実装への移行

💡 pull request の各 commit message に、Claude Code のプロンプトあります。

template.yaml のリソース定義は調べるのが面倒ですが、Claude Code が一発で書いてくれました。もちろん後でウラは取ってます。

  • EventBridge Schedulers 定義
  • DynamoDB Tables 定義
  • 各リソースの IAM Role 設定
  • CloudWatch Alarm 監視定義

まとめ

IFTTT Pro のフィード通知機能を AWS のサーバーレス構成で自前実装することで、以下のメリットを得ることができました。

  • コスト削減: 年間 $34.99 の固定費が実質ゼロ
  • 透明性獲得: フィードにどんなアイテムが追加され、今までどんなアイテムを既読にしたのかを掌握
  • 監視強化: フィード購読にも監視を設定でき、障害をすぐに検知
  • コード最適化: rss-parser を使用した、フィードのパース最適化

また、Claude Code を活用することで、JavaScript から TypeScript への移行や SAM テンプレートの作成など、やる気のなさのハードルを大幅に下げることができました。

今後も低空飛行で masutaka-feed を継続的に運用していきます。