ブログ

Amazon Bedrock を使って毎朝 IT ニュースを Slack に通知するシステムを作ってみた

IT 分野の進歩は目覚ましく、日々どんどん情報がアップグレードされていきますね。
「最新の技術トレンドを追いかけたいけど、英語の記事を読む時間がない…」
「 IT ニュース を毎朝チェックしようとしても、結局後回しになる… 」
こんなお悩みをお持ちの方は多いのではないでしょうか。

実はこれ、AWS の生成 AI サービス「 Amazon Bedrock 」を使って、全て自動化することができます。サーバーの管理は一切不要で、月々の費用も低コストに抑えられます。

本ブログでは、毎朝の IT ニュース収集を自動で行う方法を紹介します。

Amazon Bedrock を含む今回の構成について

まず、今回登場する AWS のサービスを簡単にご紹介します。

Amazon EventBridge:
定義したルールに基づいてイベントをリアルタイムにフィルタリング・配信することができ、AWS サービスやアプリケーション等の統合を容易にします。
今回のシステムでは、毎朝 8 時に自動でプログラムを起動する役目を担います。

AWS Lambda:
サーバ管理不要でコードを実行することができます。今回のシステムでは、イベントを受けてコードを実行する役目を担います。

Amazon Bedrock:
主要な生成 AI モデルを API 経由で利用できます。今回のシステムでは、生成 AI で記事を要約・翻訳する役目を担います。

これらを組み合わせてシステムを作り、Slack にニュースを通知する仕組みを作ります。

また、今回は AWS SAM( Serverless Application Model )というツールも使います。これは複数の AWS サービスを設計図ファイル( template.yaml )に書いておくと、コマンド 1つで一括作成してくれる便利なツールです。複雑なコンソール操作を何十回もしなくていい、というのが最大のメリットです。

Amazon Bedrock を使う前の事前準備について

実際に実装する前に、以下の 4 つの準備をする必要があります。

① IAMユーザーの作成と AWS CLI の設定

AWS CLI は「 PCのターミナルから AWS を操作するためのツール」です。使うためには CLI 用の鍵(アクセスキー)を発行する必要があります。

◯ IAM ユーザーとアクセスキーの作成手順

  1. AWS コンソールにログイン → 「 IAM 」を検索して開く。
  2. 左メニュー「 ユーザー」→「ユーザーの作成」をクリックする。
  3. ユーザー名(例:news-bot-user )を入力して「次へ」をクリックする。
  4. 「ポリシーを直接アタッチ」を選び「 AdministratorAccess 」にチェック後、 「ユーザーの作成」をクリックする。

※ 今回は解説を簡略化するため最強権限にしていますが、本来は必要な権限(IAMFullAccess、 CloudFormationFullAccess、 LambdaFullAccess 等)に絞るのが理想です。

  1. 作成したユーザーをクリック → 「セキュリティ認証情報」タブを開く。
  2. 「アクセスキーを作成」→ 「 CLI 」を選択しそのまま作成する。
  3. 表示された「アクセスキー ID」と「シークレットアクセスキー」を 必ずコピーする。

◯ターミナルで認証情報を設定する

先ほど作成したアクセスキーとシークレットアクセスキーを使い、ターミナルにて認証情報を設定します。実行に際して、どこのディレクトリにいても問題ありません。

# AWS CLIの認証情報を設定する
aws configure

AWS Access Key ID:     → 先ほどコピーしたアクセスキー IDを貼り付け
AWS Secret Access Key: → 先ほどコピーしたシークレットアクセスキーを貼り付け
Default region name:   → ap-northeast-1 であればそのまま Enter
Default output format: → json でよければそのまま Enter

問題なく設定できたら、SAM CLI をインストールしてください。
※すでにインストール済みでしたらスキップしてください。

# SAM CLI のインストール ( Homebrew 経由)
brew install aws-sam-cli

意図したアカウントではないアカウントに誤って設定するリスクを防ぐため、認証情報設定後は必ず以下コマンドにて確認してください。

aws sts get-caller-identity

返ってくる Account の12桁の数字が、AWSコンソールの右上に表示されるデプロイ予定のアカウント ID と一致していることを確認してください。不一致の場合は絶対に先に進まないでください。

{
    "UserId": "AIDAXXXXXXXXXXXXXXXXX",
    "Account": "123456789012",   ← 想定されたアカウント ID か確認   
 "Arn": "arn:aws:iam::123456789012:user/news-bot-user"
}

また、今回は IAM ユーザを発行する手順をご紹介しておりますが、会社の Organizations や SSO 導入環境は aws configure sso という初期設定方法もあります。そちらで設定されたいという方は、 AWS 公式ドキュメント AWS CLI を使用した IAM Identity Center 認証の設定 をご確認ください。

② Amazon Bedrock を有効化する

  1. AWS コンソールにログインし、検索バーで「 Bedrock 」を検索して開く。
  2. 左メニューの「モデルカタログ」をクリックする。
  3. ご利用になりたいモデルの 3 点ボタンを押して、「プレイグラウンドで開く」をクリックする。
    ※モデルによって使用できるリージョンが異なります。また、事前に利用申請が必要な場合があります。
  1. チャット画面で文字を送り、モデルが有効化されているか確認する。返答があれば有効化されています。

今回は「 Amazon 」カテゴリの中から「 Amazon Nova Lite 」を使用しています。
設定途中に「 EULA の同意」ボタンが表示された際は、内容をご確認のうえ問題なければそのまま進んでください。

③ Slackの Webhook URL を取得し、Slack と連携する

◯ Slack にて IT ニュース投稿先の新しいチャンネルを作成する。

Slack のチャンネル一覧の列にある「チャンネルを追加する」をクリックしてください。「チャンネル名」「パブリック or プライベートか」「ユーザを追加するか」等、ご自分のチャンネル形態要望に沿って設定し、チャンネルを作成してください。

◯ Slackの Webhook URL を取得する

  1. https://api.slack.com/apps を開き「 Create New App 」→「 From scratch 」をクリックする。
  1. アプリ名(例:IT News Bot )を入力して自分が所属するワークスペースを選択する。
  2. 左メニュー「 Incoming Webhooks 」を開いてトグルを ON に切り替える。
  1. 同ページ下部の「 Add New Webhook 」をクリックし、遷移先にて投稿先チャンネルを選択後、「許可する」をクリックする。
  1. 「 Add New Webhook 」付近に発行された「 Webhook URL 」 をコピーする。
    ※この URL は後々使います。

④フォルダとファイルを構成する

お使いの PC 上に、以下の構成でフォルダとファイルを作成してください。その後、以下に記載するコードを各ファイルにコピー&ペーストし保存してください。

it-news-system/             
├── template.yaml 
├── samconfig.toml 
├── Makefile 
└── functions/ 
  └── news_collector/ 
       ├── handler.py 
       └── requirements.txt

◯ template.yaml

このファイルがシステム全体の「設計図」です。ここに書いた内容を AWS SAM が読み取って、必要なサービスを自動で一括作成してくれます。

Parameters :
デプロイ時に入力する設定項目を定義しています。

Globals :
全 AWS Lambda に共通する設定をまとめています。

Resources :
実際に作る AWS リソースを定義しています。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: "ITニュース自動収集&Slack通知システム - SAM版"

Parameters:
  BedrockRegion:
    Type: String
    Default: "us-east-1"
    Description: "Amazon Nova Liteを使用するリージョン"
  SlackWebhookUrl:
    Type: String
    NoEcho: true
    Description: "SlackのIncoming Webhook URLを入力してください"
  ScheduleExpression:
    Type: String
    Default: "cron(0 23 * * ? *)"
    Description: "収集スケジュール(UTC指定。デフォルトはJST朝8時)"

Globals:
  Function:
    Runtime: python3.13
    Timeout: 300
    MemorySize: 256
    Environment:
      Variables:
        BEDROCK_REGION: !Ref BedrockRegion
        SLACK_WEBHOOK_URL: !Ref SlackWebhookUrl

Resources:
  NewsCollectorFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: "it-news-slack-bot"
      CodeUri: functions/news_collector/
      Handler: handler.lambda_handler
      Policies:
        - Statement:
            - Effect: Allow
              Action:
                - bedrock:InvokeModel
              Resource: !Sub "arn:aws:bedrock:${BedrockRegion}::foundation-model/amazon.nova-lite-v1:0"
      Events:
        DailySchedule:
          Type: Schedule
          Properties:
            Schedule: !Ref ScheduleExpression

Outputs:
  LambdaFunctionName:
    Description: "作成されたLambda関数名"
    Value: !Ref NewsCollectorFunction

◯ samconfig.toml

SAM がデプロイするときの「デフォルト設定」をあらかじめ書いておくファイルです。これがあるおかげで、make deploy を実行したときに毎回同じ設定で動いてくれます。

stack_name :
AWS CloudFormation 上に作られるリソースグループの名前です。

confirm_changeset :
デプロイ前に変更内容を確認するかどうかを定義しています。

※もし東京以外の AWS リージョンを使う場合は region の値を変更してください。

version = 0.1
[default.deploy.parameters]
stack_name = "it-news-slack-bot"
resolve_s3 = true
s3_prefix = "it-news-slack-bot"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

◯ Makefile

make deploy という短いコマンドで操作できるようにするファイルです。

.PHONY: build deploy delete

build:
	sam build

deploy: build
	sam deploy --guided

delete:
	sam delete --stack-name it-news-slack-bot --region ap-northeast-1 
--no-prompts

※ Windows をお使いの場合は make コマンドが標準ではないため、代わりに sam build && sam deploy --guided を直接実行してください。

◯ functions/news_collector/requirements.txt

Python プログラムが使う外部ライブラリ(追加機能のパッケージ)を定義するファイルです。 SAM はデプロイ時にここを読み取り、必要なライブラリを自動でインストールしてくれます。

boto3 は AWS の公式 Python ライブラリで、AWS Lambda からAmazon Bedrock を呼び出すために必要です。この記事のコードは標準ライブラリのみで動くため、外部ライブラリは boto3 だけで十分です。

なお、boto3 は AWS Lambda に標準で含まれていますが、Amazon Bedrock の新しいAPI(converseなど)を利用する場合、ランタイムに含まれる boto3 のバージョンでは対応していない可能性があります。
そのため、boto3 を明示的に記載しています。

boto3>=1.35.79

◯ functions/news_collector/handler.py

これがシステムの核となるプログラムです。大きく3つの処理に分かれています。

fetch_rss:
指定した URL から RSS フィードを取得し、タイトル・URL・概要文を抽出します。

summarize_with_nova:
取得した記事情報を Amazon Bedrock に送り、日本語 3 行要約を生成します。

post_to_slack():
要約済みのメッセージを Slack の Webhook URL に送信します。

また今回は以下の 3つのニュースサイトからニュースを取得しています。

  • Hacker News:
    世界中のエンジニアが集まる掲示板ニュースです。技術的な流行やリリースの早い情報を確認できます。
  • TechCrunch:
    IT 業界全体のグローバルな動向を扱う大手メディアです。新しい製品の発表やスタートアップの台頭など、ビジネス視点での重要なニュースを確認できます。
  • Itmedia:
    日本最大級の IT ニュースサイトです。業界の最新ニュースはもちろん、ビジネスや健康、時事トレンドなど、 IT 以外のトピックも網羅的に報道しています。
import os
import json
import logging
import urllib.request
import xml.etree.ElementTree as ET
import re

import boto3
from botocore.exceptions import ClientError

logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 環境変数からSlack/Bedrockの設定を読み込みます
BEDROCK_REGION = os.environ.get("BEDROCK_REGION", "us-east-1")
SLACK_WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_URL")

bedrock = boto3.client("bedrock-runtime", region_name=BEDROCK_REGION)
MODEL_ID = "amazon.nova-lite-v1:0"  # Amazon Bedrockで使うAIモデル

# ここにお好みのRSSフィードを追加できます
RSS_FEEDS = [
    {"name": "Hacker News", "url": "https://news.ycombinator.com/rss"},
    {"name": "TechCrunch",  "url": "https://techcrunch.com/feed/"},
    {"name": "ITmedia",     "url": "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml"},
]

def fetch_rss(url, max_items=2):
    """指定したRSSフィードから記事を最大max_items件取得する"""
    items = []
    try:
        req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
        with urllib.request.urlopen(req, timeout=10) as response:
            root = ET.fromstring(response.read())
        for item in root.findall(".//item")[:max_items]:
            title = item.findtext("title", default="無題")
            link  = item.findtext("link",  default="")
            desc  = re.sub(r"<.*?>", "", item.findtext("description", default=""))[:300]
            items.append({"title": title, "link": link, "desc": desc})
    except Exception as e:
        logger.error(f"RSS取得エラー ({url}): {e}")
    return items

def summarize_with_nova(title, desc):
    """Amazon Bedrockのプロンプトを組み立て、Nova Liteで記事を日本語3行要約する"""
    prompt = (
        f"以下のITニュースをエンジニア向けに日本語で3行以内で要約してください。\n\n"
        f"タイトル: {title}\n内容: {desc}\n\n要約:"
    )
    try:
        response = bedrock.converse(
            modelId=MODEL_ID,
            messages=[{"role": "user", "content": [{"text": prompt}]}],
            inferenceConfig={"maxTokens": 200, "temperature": 0.3},
        )
        return response["output"]["message"]["content"][0]["text"].strip()
    except ClientError as e:
        logger.error(f"Amazon Bedrockエラー: {e}")
        return "要約の生成に失敗しました。"

def post_to_slack(text):
    """Slackのウェブフック宛てにメッセージをPOSTする"""
    if not SLACK_WEBHOOK_URL:
        logger.warning("SLACK_WEBHOOK_URLが未設定です。環境変数を確認してください。")
        return
    payload = {"text": text}
    req = urllib.request.Request(
        SLACK_WEBHOOK_URL,
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json"},
    )
    with urllib.request.urlopen(req, timeout=10):
        logger.info("Slackへの投稿に成功しました!")

def lambda_handler(event, context):
    """Lambdaのエントリーポイント。EventBridgeから毎朝ここが呼ばれます。"""
    logger.info("ニュース収集を開始します")
    lines = ["*📰 今朝のITニュースまとめ(Amazon Bedrock によるAI要約)*"]
    for feed in RSS_FEEDS:
        articles = fetch_rss(feed["url"])
        if articles:
            lines.append(f"\n*{feed['name']}*")
            for a in articles:
                summary = summarize_with_nova(a["title"], a["desc"])
                lines.append(f"• <{a['link']}|{a['title']}>\n  _{summary}_")
    post_to_slack("\n".join(lines))
    return {"statusCode": 200, "body": "OK"}

Amazon Bedrock を使った IT ニュース自動化の実装

準備ができたら、いよいよ構築(デプロイ)します。
ターミナルで it-news-system/ フォルダに移動し、以下のコマンドを実行するだけです。

make deploy

すると、SAM がいくつかの質問を英語で聞いてきますが、以下のように対応してください。

Stack Name [it-news-slack-bot]: → そのままEnter
AWS Region [ap-northeast-1]: → ap-northeast-1 であればそのまま Enter
Parameter BedrockRegion [us-east-1]: → そのままEnter
Parameter SlackWebhookUrl: → 取得したWebhook URLを貼り付けてEnter
Parameter ScheduleExpression [cron(0 23 * * ? *)]: → そのまま Enter
Confirm changes before deploy [Y/n]: → そのまま Enter
Allow SAM CLI IAM role creation [Y/n]: → そのまま Enter
Disable rollback [y/N]: → そのまま Enter
Save arguments to configuration file [Y/n]: → そのまま Enter
SAM configuration file [samconfig.toml]: → そのまま Enter
SAM configuration environment [default]: → そのまま Enter
Deploy this changeset? [y/N]: → y を入力してEnter

数分後に「 Successfully created/updated stack - it-news-slack-bot 」 と表示されたら完成です!

Amazon Bedrock を使った IT ニュース自動化の動作確認

毎朝 8 時になればニュースが投稿されますが、8 時を待たずとも AWS コンソールから手動で実行できます。

  1. AWSコンソール → Lambda → it-news-slack-bot を開く。
  2. 「テスト」タブをクリック → 「テスト」ボタンを押す。
  1. 1 ~ 2 分で Slack にメッセージが届きます。届いたら成功です!

★もっと好みのニュースを集めたい場合

handler.py の RSS_FEEDS リストに好きな RSS の URL を追加するだけです。

★システムを削除したくなったら

もう使わないと思ったら、以下コマンドを実行すればすぐに削除できます。

make delete

これだけで、今回作ったAWSのリソースがすべてきれいに削除されます。

Amazon Bedrock を使って毎朝 IT ニュースを Slack に通知するシステムを作ってみた(まとめ)

本ブログでは Amazon Bedrock を使って毎朝 IT ニュースを Slack に通知するシステムを作る方法をご紹介しました。

Amazon Bedrock とAWS SAM を組み合わせることで、AWS 初心者の方でも、今日から自分だけの AI ニュースボットを持つことができます。本ブログに記載したコードをカスタマイズして「特定のキーワードを含むニュースだけを通知」「マーケター向けに要約する」など、ご自分に合ったAI ニュースボットスタイルにも是非挑戦してみてください。

最後までお読みいただきありがとうございました。

元記事発行日: 2026年05月13日、最終更新日: 2026年04月17日