AWSニュースの自動要約・配信アプリを作ってみた。

はじめに

日々大量に更新されるAWSの最新情報をキャッチアップするのは大変です。一日に何件もの記事がアップロードされたり、英語の原文を翻訳して読んだりするのには時間がかかります。
そこで、最新情報のキャッチアップをもっと簡単にしたいと思い、
AWSニュースの自動要約・配信アプリを作ってみました。
手順なども載せているので、良ければご参考にしていただければと思います。

目次

概要

このアプリは、AWS LambdaとBedrock、S3、Difiなどを使って作成しました。
仕組みとしては、Lambda (Python) がAWS公式RSSフィードを取得、それをBedrock(Claude 3.5 Sonnet)記事の内容を送り、「3行サマリー」「変更点」「メリット」に要約させ、見やすいHTML形式に変換してS3にアップロードし、完成したWebページのURLを Slackに通知する仕組みになっています。

システム構成

手順の概要

  1. 通知先の設定
  2. IAMユーザーの作成
  3. S3バケットの作成
  4. Lambda関数の作成
  5. EventBridgeの設定
  6. Difiの設定

手順

通知先の設定

通知先のSlackチャンネルを決めて、Incoming Webhook URLを発行します。
今回の通知先は自分のSlackのチャンネルにしました。
作成したURLは後程使用するので控えておきます。

IAMユーザーの作成

DifyがBedrockのAPIを呼び出すためのIAMユーザーの作成し、IAMユーザーのアクセスキーとシークレットキーを作成していきます。
IAMの画面に移動して、ユーザーの作成を押します。
ユーザーの名前は任意。(例:Dify-User)

ポリシーを直接アタッチを選択して、BedrockFullAccessを選択、次へを押し、ユーザーを作成します。

作成出来たら、作成したユーザーを選択し、セキュリティ認証タブを選択し、アクセスキーの作成を押す。

S3バケットの作成

データの保存先であり、閲覧画面となるWebサーバー部分を作成します。
S3のページに移動し、バケットを作成します。

バケット名(例:my-aws-news-digest)を入れて、バケットを作成します。

作成出来たら、バケットを選択し、プロパティに移動し、静的ウェブサイトホスティングまでいき、S3 静的ウェブサイトホスティングを有効にします。

次にアクセス許可タブに移動して、パブリックアクセスをすべてブロックにすることと、

バケットポリシーを編集していきます。

▼ クリックしてポリシー(JSON)を表示


S3の設定はこれで終わりです。

Lambda関数の作成

Lambdaのページを開き、Lambda関数を作成してく。
「一から作成」を選択し、関数名を入力する。(例:aws-news-to-slack-standard)

ランタイムは「Python3.12」を選択し、作成を押します。

作成できたら、下記コードをlambd_function.pyにあるコードを削除して、貼り付けます。

▼ クリックしてポリシー(JSON)を表示

貼り付けたら、deployを押します。

設定タブに移動して、環境変数の設定をしていきます。

登録する変数のキーは↓値はそれぞれのURLなどを貼り付けます。

・SLACK_WEBHOOK_URL

・Dify_API_KEY

・S3_BUCKET_NAME

・S3_WEBSITE_URL

Difi_API_KeyはDifiの設定をした後に張り付けます。

タイムアウトの秒数の設定も行っておく。デフォルトが3秒なので、5分に変更します。(3秒だと記事が多いときにタイムアウトしてしまうので、長めに5分ほどに設定しておく。)

Lambda作成時にデフォルトで作られるロールにAmazonS3FullAccessとAmazonBedrockFullAccessを追加します。

EventBridgeの設定

EventBridgeで毎朝9時に定期的に実行されるように設定していきます。
Lamudbaの関数の画面で、トリガーを追加を押し、EventBridgeを選択します。

新規ルールの作成を選択します。

ルール名を入力し、スケジュールを作成します。

ルール名の例: Weekly-AWS-News-Trigger

スケジュールのCron式: 0 0 * * ? * (毎日朝9時 ※JSTの場合)

追加を押します。
これでEventBridgeの設定は完了です。

Difiの設定

最後にDifiの設定をしていきます。
こちらはアカウントを作成している前提の手順になります。
もし作成されていない方は下記記事を参考に作成してみてください。
▼Difiアカウント作成参考記事
Amazon BedrockとDifyでチャットボット作ってみた

まず、Difiを開きます。
右上の自分のアイコンを選択し、設定を押します。

モデルプロバイダーを選択し、Beadrockをインストールします。

インストールできたら、API KEYのコンフィグを押し、APIキーを追加します。

APIの名前を入力して、Authentication MethodをAccess-Secret Keyに変更します。

Access KeyとSecret Access KeyはIAMユーザー作成時のkeyを入力します。

リージョンは任意です。(今回はUS East (N. Virginia)にしました。)

Available Model Nameには、自分が使用する生成AIモデルのモデル名を入れる必要があります。今回私が使用した生成AIはClaude 3 Haikuを使用したので、モデル名は
(anthropic.claude-3-haiku-20240307-v1:0)になります。

モデル名はBedrockで確認できます。

自分が使用したい生成AIをクリックするとモデル名も記載されています。

Bedrockの画面説明

保存したら、初めの画面に戻り、チャットボットを選択して、最初から作成を押します。

チャットボットを選択し、アプリ名を入力して作成します。

プロンプトに下記文を入力します。

プロンプト文

画面右の方にあるモデルを自分の使用したいモデルにしておきます。

そして最後に、DifiのAPIキーをLambdaの環境変数(Dify_API_KEY)に登録します。
APIキーの確認の仕方は画像のAPIアクセスを押します。

下記画像のページに移るので、下記画像のAPIサーバをコピーし、
Dify_API_KEYの値に張り付けます。

これで、設定は完了です。
Lambdaのテストタブでテストを実行すると、Slackに通知されるはずです!

通知されるもの

ニュースがある日には下記画像のように通知されます。

ニュースがない日には下記画像のように通知されます。

そして、ニュースがある日のニュースページはこのようなデザインです。

過去のアーカイブページのリンクを押すと下記画像のように表示されます。

まとめ

今回の作成で、はじめは要約されたニュース文を直接Slackに通知する仕組みで作成しましたが、通知が多いのと、大事なメモなどが流れてしまう可能性もあったので、HTML形式に変更しました。
また、個人的によくできたなと思う点は、ニュースぺージから原文の記事にいけるようにしたことと、各ニュースページからアーカイブ一覧のぺージに移動できるようにした点です。

使っていくうちに問題点なども見えて、そのたび改善していくことができたので、よりよいものが作れたと思います。
input用のアプリが作成出来て、AWSの最新情報も確認できるので、作成してよかったと思いました。