この記事は、個人ブログで公開していた内容を技術記事向けに再構成・加筆したものです。
本記事の内容は執筆時点の情報をもとにしています。
AWS や Notion API の仕様は変更される可能性があるため、
実装時は最新の公式ドキュメントをご確認ください。
はじめに
技術記事やニュースを Notion に集約して管理したい と思い、
RSS フィードから記事を取得し、AWS Lambda + Notion API を使って
自動で Notion データベースに登録する仕組み を作ってみました。
この記事では、
- RSS を定期取得する仕組み
- AWS Lambda での実装方法
- Notion API でのデータ登録方法
を 実装ベースで 紹介します。
この記事でできること
- RSS フィードを定期的に取得
- 新着記事を AWS Lambda で処理
- Notion データベースに自動登録
- タグ付きで記事管理
Notionへの登録内容
全体構成
- EventBrideで1時間毎に、Lambdaを起動する
- LambdaがAWS Systems ManagerからRSS情報を取得する
- 取得したRSSから前回取得した記事以降に、更新された記事タイトルと記事URLを取得する
- 取得した記事URLにアクセスして、スクレイピングを行う
- AWS Sercrets ManagerからNotionの接続情報を取得する
- 記事タイトル・記事URL・記事内容・記事のタグをNotionに送信
- Notionに記事が登録される
使用技術
- AWS Lambda(AWS SAM)
- EventBridge Scheduler
- AWS Secrets Manager
- AWS Systems Manager Parameter Store
- Notion API
- feedparser
- BeautifulSoup
事前準備
Notion側
Notion integrationを作成
Notion APIでNotionのデータベースに記事を登録するには、インテグレーションを作成する必要があります。
下記リンクにアクセスし、「New Integration」からインテグレーションを作成します。
インテグレーションを作成したらInternal Integration Tokenをコピーして控えてください。
後程、AWS Secrets Managerに登録する際、必要になります。
ワークスペースにインテグレーションを招待
Notionページにインテグレーションを招待する必要があります。
招待することで、Notion APIと連携が可能になります。
データベースIDを取得する
当機能は、データベースに書き込みを行いますので、データベースIDを取得する必要があります。
ページ内に作成したデータベースしたら共有でリンクをコピーしてください。
URLの「?v」の前にある文字列部分がデータベースIDになりますので、控えてください。
https://www.notion.so/{workspace_name}/{database_id}?v={view_id}
後程、AWS Secrets Managerに登録する際、必要になります。
AWS側
AWS System Managerの設定
下記を作成する
- パラメータ名:RSSURLList
- 利用枠:標準
- タイプ:文字列
- データ型:text
- 値 (下記json参照)
- url:記事の取得先URL
- tag:Notionに記事登録時のタグ名称
{
"rsslist": [
{
"url": "https://aws.amazon.com/jp/about-aws/whats-new/recent/feed/",
"tag": "AWS",
"name":"AWSの最新情報"
},
{
"url": "https://aws.amazon.com/jp/blogs/news/feed/",
"tag": "AWS",
"name":"Amazon Web Services ブログ"
},
{
"url": "https://qiita.com/tags/aws/feed",
"tag": "AWS",
"name":"Qiita - AWS"
},
{
"url": "https://qiita.com/tags/docker/feed",
"tag": "Docker",
"name":"Qiita - Docker"
},
{
"url": "https://qiita.com/tags/python/feed",
"tag": "Python",
"name":"Qiita - Python"
},
{
"url": "https://dev.classmethod.jp/feed/",
"tag": "技術ブログ",
"name":"クラスメソッド"
},
{
"url": "https://zenn.dev/feed",
"tag": "技術ブログ",
"name":"Zenn - トレンド"
},
{
"url": "https://zenn.dev/topics/aws/feed",
"tag": "AWS",
"name":"Zenn - AWS"
},
{
"url": "https://zenn.dev/topics/docker/feed",
"tag": "Docker",
"name":"Zenn - Docker"
},
{
"url": "https://zenn.dev/topics/python/feed",
"tag": "Python",
"name":"Zenn - Python"
}
]
}
Secret Manegerの設定
- シークレットのタイプ:その他のシークレットのタイプ
- キー/値のペア
- NOTION_TOKEN:Integration Token
- DATABASE_ID:データベースID
- 暗号化キー:DefaultEncryptionKey
Lambdaの実装
ソースコードはこちら
RSS取得と解析
下記の記事を参考にRSS取得と解析は実装しています。
RSS取得
AWS System ManagerからRSS取得先を取得します。
RSS解析
feedparserを使い記事を解析します。
現在時刻と記事の公開日を比較し、1時間経過した記事を取得対象としています。
Secret Maneger
Secret Manegerからの取得ロジックについては、下記の記事を参考にしました。
シークレットの取得
取得したいシークレットキーを引数に指定することで、シークレットの値を取得しています。
Notion登録とスクレイピング
スクレイピング
PythonでNotion APIを扱うため、「Notion SDK for Python」と
Notion登録前に記事の内容をスクレイピングするため、「BeautifulSoup」を利用しています。
targetTagsに設定されている値がスクレイピングの対象になります。
対象のタグにあったNotionのリクエストBodyを作り上げ、リクエストしています。
Notion登録
NotionへのリクエストBodyは、公式リファレンスを参照
Lambda・ポリシー・ロール
起動時間とポリシーとロールは、template.yamlに記述しています。
ビルド・実行・デプロイ
コマンド
sam build
sam local invoke NotionRegisterFunction --event events/event.json
sam deploy --guided
デプロイ結果
EventBridge
Role
Policy
まとめ
AWS Lambda と Notion API を組み合わせることで、
- 記事収集を自動化
- 情報整理のコスト削減
- Notion をナレッジハブとして活用
が可能になります。
RSS × Notion × AWS は応用範囲が広く、
個人開発・業務効率化どちらにもおすすめです。










