こんにちは、テクノロジーサービス部の大西です。
RSSフィードで取得した記事を要約し、自分のLINEアカウントに送信するシステムを構築しました。
今回対象にした技術ブログは本サイトであるTechHarmonyであり、SCSKでは様々な技術発信を高頻度で行っているため、特に自分の興味ある分野を見逃さないことを目的にしました。
作成したシステムについて
Amazon Bedrockには様々なAIモデルが用意されています。モデルによってサポートされるリージョンや入力、出力形式が異なります。
(詳細は以下のページをご確認ください。)
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/models-supported.html
今回使用したモデルは、日本語対応の「Claude 3 Haiku」です。リソースは全てバージニア北部(us-east-1)に作成しています。
メインの処理を行うLambda関数はNode.jsで実装されており、RSSフィードのURLやLINEへのメッセージ送信用のアクセストークンはParameter StoreとSecrets Managerに保存しています。
また、重複した記事を取り込まないよう、DynamoDBで記事情報を管理しています。
メインの処理を行うLambdaはNode.jsを使用しており、RSSフィードのURLやLINEへのメッセージ送信で利用するアクセストークンは、
それぞれParameter StoreとSecrets Managerに保存しています。
また、重複した記事を取り込まないように、DynamoDBに記事情報を登録しています。
以下の例ではTechHarmonyの取得した記事をテーブルに書き込んでいます。
Lambdaを実行すると、以下のようにLINEに記事の要約が送信されました。
次の章から構築手順をざっくりとご説明していきたいと思います。
前準備
Node.jsで作成したソースコードは以下のモジュールを利用しており、事前にインストールが必要です。
・axios
・RSSParser
・aws-sdk
私は自分のPCにワーク用フォルダを作成、その中にソースコードと追加モジュールを配置しており、
完成後はソースコードと追加モジュールをまとめたzipファイルを作成し、Lambdaへアップロードしました。
LINEへメッセージ送信は、LINE Messaging API(https://developers.line.biz/ja/services/messaging-api)を使用しています。
本サービスの利用にはLINEアカウントが必要です。
LINE Messaging API用意
LINEへ連携するため、LINE Messaging APIを準備します。
https://www.studycloudtech.com/aws/start-line-messagingapi/
上記サイトを参考に構築し、以下のようにユーザーIDとチャネルアクセストーンを取得しました。
※APIの使用料金は今回無料枠を選択しており、月200通までの送信が可能です。その他プランは以下を参照してください。
https://www.lycbiz.com/jp/service/line-official-account/plan/
DynamoDB用意
記事を保存するため、DynamoDBを作成します。パラメータは以下の通りです。
パラメータは以下の通りで、他の設定はデフォルト値を使用しています。
①テーブル名:RSSArticles
②パーティションキー:ArticleID 文字列
Parameter Store作成
要約対象のページを追加・変更・削除する可能性を考え、RSSフィード取得先URLをParameter Storeに保存しています。
以下のようなパラメータで作成しました。
名前:/rss_sites/
利用枠:標準
タイプ:文字列のリスト
値:任意のURL(画像はTechHarmonyのRSSフィードページ)
今回は1つのURLのみ指定していますが、今後複数のページから取得すること可能性を踏まえ、
タイプは「文字列のリスト」を選択し、拡張性を考慮しています。
Secrets Manager作成
LINE Messaging APIの手順で発行したチャネルアクセストークンを安全に保管するため、Secrets Managerを以下のように作成しています。
暗号化キーはSecrets Managerが発行するKMSキーを使用しています。
①シークレットのタイプ:その他のシークレットのタイプ
②キー/値:LINE_ACCESS_TOKEN/<手順3で発行したチャネルアクセストークン>
③暗号化キー:aws/secretsmanager
Bedrock使用アクセス申請
Bedrockで「Claude 3 Haiku」を使用するため、以下のような操作を行いました。
①Bedrockを開き、「View Model catalog」を選択する。
②今回使用するモデルである「Claude 3 Haiku」を選択する。
③右上にある「・・・」を選択し、「Modify access」を選択する。
④モデルアクセスのページに遷移するため、「特定のモデルを有効にする」を選択する。
⑤リストから「Claude 3 Haiku」にチェックを入れ、「次へ」を選択する。
⑥初回設定時にはユースケースを求められるため入力する。(私は自社情報を入力しました)
⑧数分でアクセス権が付与される。ステータスを確認し、許可されたことを確認する。
IAM権限設定
Lambdaから呼び出されるリソースへの権限が必要になるため、IAMポリシーを以下のように設定し、
dynamoDB、Secrets Manager、Parameter Store、Bedrockへアクセスできるようにしています。
作成したポリシーは別途ロールへ付与します。
・IAMポリシー
ポリシー名:RSSPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": "arn:aws:dynamodb:us-east-1:xxxxxxxxxxxxx:table/RSSArticles"
},
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "arn:aws:secretsmanager:us-east-1:xxxxxxxxxxxxx:secret:xxxxxxxxxx"
},
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter"
],
"Resource": "arn:aws:ssm:us-east-1:xxxxxxxxxxxxx:parameter/rss_sites"
},
{
"Effect": "Allow",
"Action": "bedrock:*",
"Resource": "*"
}
]
}
・IAMロール
ルール名:RSSRole
許可ポリシー:AWSLambdaBasicExecutionRole、RSSPolicy
Lambda用コード作成
今回Lambdaで実行するコードは、Node.jsを使用して作成しています。
index.zip
コードが長いので、上記ファイルをダウンロードして実ファイルと以下の説明を確認していただけるとわかりやすいと思います。
①AWSサービスの初期化
まず、AWSの複数のサービスを利用するために、AWS SDKを使ってクライアントを初期化しています。
対象のサービスには、DynamoDB, Parameter Store, Secrets Manager, Amazon Bedrockがあります。
②RSSサイトの取得
getRSSSites関数を使用して、Parameter StoreからRSSサイトの一覧を取得します。
取得された情報は、カンマ区切りの文字列として返され、RSSフィードを取得するために使用されます。
③LINEアクセストークンの取得
getLineAccessToken関数では、Secrets ManagerからLINEのアクセストークンを取得します。
これは、LINE Messaging APIを使用して通知を送信する際に必要です。
④新しい記事のフィルタリング
filterNewArticles関数は、RSSフィードから取得した記事のうち、まだDynamoDBに保存されていないものをフィルタリングします。
既存の記事はDynamoDBから取得して比較します。
⑤新しい記事の保存
新しく取得した記事は、saveArticles関数を使用してDynamoDBに保存します。
バッチ書き込みを使用して効率的にデータを保存し、万が一未処理のアイテムがあった場合には再試行を行います。
⑥記事の要約生成
Amazon Bedrockのモデルを用いて、generateSummary関数が新しい記事の要約を生成します。
この要約はClaude 3 Haikuモデルによって提供され、レスポンスから要約を抽出します。
ここでは使用するモデルIDとバージョンの指定、AIへの命令方法がAPIとして提供されており、以下のページのAPIリクエストを参考にしています。
https://us-east-1.console.aws.amazon.com/bedrock/home?region=us-east-1#/model-catalog/serverless/anthropic.claude-3-5-haiku-20241022-v1:0
{
"modelId": "anthropic.claude-3-5-haiku-20241022-v1:0",
"contentType": "application/json",
"accept": "application/json",
"body": {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 200,
"top_k": 250,
"stopSequences": [],
"temperature": 1,
"top_p": 0.999,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "hello world"
}
]
}
]
}
}
⑦LINEにプッシュ通知
最後に、sendToLine関数を使って、新しい記事とその要約がLINEのユーザーにプッシュ通知されます。
LINE Messaging APIを利用し、事前に取得したアクセストークンを使用して安全にメッセージを送信します。
Lambda作成
作成したコードを実行するため、Lambdaを以下のように作成しました。
関数名:RSSNotifier(画像では既に作成済みで重複するため、_を付与しています)
ランタイム:Node.js 22.x
アーキテクチャ:x86_64
実行ロール:RSSRole
作成したコードとモジュールを含めたzipファイルを作成し、Lambdaにアップロードします。
アップロードした結果、以下のようにソースコードとモジュールが設定されていることを確認してください。
また、ある程度実行に時間がかかるため、設定画面からタイムアウト値を変更してください。
設定変更後、テスト実行すると、LINEに要約したメッセージが届きます。
まとめ
Bedrockを用いたシステム構築に初挑戦してみました。
AIによる要約システムを作るのに多くの技術ブログやドキュメントに助けられました。
今後、EventBridgeを使用した定期実行やメッセージに参照元URLを含める改善を進めるのと、別AIモデルの動作についても検証していきたいと考えています。
閲覧いただき、ありがとうございました。