はじめに
AWSのアップデートは毎日大量に流れてきます。「What's New」を毎日チェックするのは現実的ではなく、気づいたら重要なアップデートを見逃していた、という経験をお持ちの方も多いのではないでしょうか。
本記事では、AWS Kiro(AIエージェント型IDE)を使って、AWSのアップデート情報を自動収集・AI要約してLINEに通知するサーバーレスアプリを開発した体験をまとめます。
コードを書いたのはほぼKiroです。私はやりたいことを日本語で伝えるだけでした。
成果物
AWSアップデート通知アプリ
- AWSの公式RSSフィードを1日3回(8:30 / 11:00 / 17:00 JST)自動取得
- 記事本文をfetchしてAmazon Bedrockで日本語要約
- LINE Messaging APIでFlex Messageとして友だち全員にbroadcast配信
試してみたい人は、こちらから追加できます!
※予告なくサービス変更・終了する可能性あるのでご注意ください
- AWSアップデート通知LINE
https://line.me/R/ti/p/@491jliqd - Azureアップデート通知LINE
https://line.me/R/ti/p/@569hzhet
通知イメージ
「詳細を見る」をタップすると、AWSが公式で出している詳細ページまで遷移します。
Azure版も同じです。
システム構成図
使用AWSサービス
| サービス | 用途 |
|---|---|
| Lambda | メイン処理(Python 3.12) |
| EventBridge Scheduler | 1日3回の定期実行 |
| Amazon Bedrock | Claude 3 Haikuで記事要約 |
| DynamoDB | 送信済み記事の重複管理(TTL 7日) |
| SSM Parameter Store | 前回実行時刻の保存 |
| Secrets Manager | LINE Channel Access Tokenの管理 |
| CloudWatch Logs | 実行ログ |
Kiroとの開発体験
仕様書を渡すだけでコードが生成
開発はまず仕様書(spec.txt)をKiroに渡すところから始まりました。
・配信するタイミングは1日3回
8:30, 11:00, 17:00(日本時間)
・記事URLから本文をfetchすること
・配信する内容をBedrock(Claude)で以下を抽出・生成すること
・タイトルの日本語訳
・要点(箇条書きで3-4点ほど)
・関連があるサービス(英語名のまま)
・適用リージョンに東京・大阪が含まれるか
・LINE messaging APIで通知すること
・LINEのChannel Access TokenはAWS Secrets Managerに保存すること
・通知内容に6件以上含まれる場合、5件ごとでメッセージを区切ること
・東京または大阪リージョンが含まれる記事を優先してソートすること
この仕様書を渡すと、Kiroは以下を一気に生成してくれました。
- CDKスタック(TypeScript)
- Lambda関数(Python)
- requirements.txt
- README.md
Kiro稼働中の画面はこんな感じです。
実施している経過・コマンドも確認できます。
CDKスタックの生成例
const notifierFn = new lambda.Function(this, 'NotifierFunction', {
functionName: `${PREFIX}-aws-line-notifier`,
runtime: lambda.Runtime.PYTHON_3_12,
handler: 'handler.lambda_handler',
timeout: cdk.Duration.minutes(5),
memorySize: 512,
environment: {
SCHEDULE_TIME_1: '08:30',
SCHEDULE_TIME_2: '11:00',
SCHEDULE_TIME_3: '17:00',
RSS_URL: 'https://aws.amazon.com/about-aws/whats-new/recent/feed/',
DYNAMODB_TABLE: `${PREFIX}-aws-news-sent`,
SSM_LAST_EXECUTED_PATH: `/${PREFIX}/aws-line-notifier/last-executed-at`,
LINE_SECRET_ARN: lineSecret.secretArn,
BEDROCK_REGION: 'ap-northeast-1',
BEDROCK_MODEL_ID: 'anthropic.claude-3-haiku-20240307-v1:0',
},
});
Bedrockへのプロンプト設計
要約の品質を上げるため、Kiroが設計したプロンプトはこちらです。
BEDROCK_PROMPT_TEMPLATE = """以下のAWSアップデート記事を分析し、指定のJSON形式のみで回答してください。
前後に説明文や```は不要です。
タイトル: {title}
URL: {url}
本文:
{body}
出力形式(JSONのみ):
{
"title_ja": "タイトルの日本語訳",
"points": ["要点1", "要点2", "要点3"],
"services": ["関連サービス名(英語)"],
"tokyo_osaka": true または false,
"url": "{url}"
}
注意:
- pointsは3〜4点で日本語
- servicesはAWSサービス名を英語のまま
- tokyo_osakaは記事内容から判断(グローバル展開・全リージョン対応もtrue)
- JSONのみ出力、余分なテキスト不要"""
JSONのみ出力させることで、後続処理でのパースが安定します。
ハマったポイントと解決策
1. Bedrockのモデル指定問題
最初に指定した anthropic.claude-sonnet-4-6 はオンデマンドスループット非対応でした。
ValidationException: Invocation of model ID anthropic.claude-sonnet-4-6
with on-demand throughput isn't supported.
Kiroが利用可能なモデルを調査し、価格とも相談した上で少し古いですがanthropic.claude-3-haiku-20240307-v1:0 に変更することで解決しました。
# 利用可能なモデルを確認
aws bedrock list-foundation-models \
--region ap-northeast-1 \
--query "modelSummaries[?contains(inferenceTypesSupported, 'ON_DEMAND')].modelId" \
--output table
2. Dockerなし環境でのLambdaパッケージング
CDKのbundling機能はDockerが必要ですが、開発環境にDockerが未インストールでした。
Kiroが提案した解決策は Lambda Layerの分離です。
// feedparser(pure Python)をLayerとして分離
const feedparserLayer = new lambda.LayerVersion(this, 'FeedparserLayer', {
layerVersionName: `${PREFIX}-feedparser`,
code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/layer')),
compatibleRuntimes: [lambda.Runtime.PYTHON_3_12],
});
pure Pythonパッケージはプラットフォーム依存がないため、WindowsでインストールしてもそのままLambda(Linux)で動作します。
3. Secrets ManagerへのトークンをPowerShellで登録する際のエスケープ問題
PowerShellでJSONをそのまま渡すとエスケープが崩れるので、ファイル経由で渡す必要があります。
# NG: エスケープが崩れる
aws secretsmanager put-secret-value --secret-string "{\"channel_access_token\": \"xxx\"}"
# OK: ファイル経由で渡す
aws secretsmanager put-secret-value \
--secret-id "2EP-Yoshida/line/messaging-api" \
--secret-string file://secret_value.json
デプロイ手順
前提条件
- Node.js 18以上
- AWS CDK v2
- AWS CLI(認証設定済み)
- Bedrockモデルアクセスの有効化(東京リージョン)
手順
# 1. 依存パッケージのインストール
npm install
# 2. CDK Bootstrap(初回のみ)
cdk bootstrap aws://ACCOUNT_ID/ap-northeast-1
# 3. デプロイ
cdk deploy
# 4. LINE Channel Access Tokenを登録
aws secretsmanager put-secret-value \
--secret-id "2EP-Yoshida/line/messaging-api" \
--secret-string file://secret_value.json \
--region ap-northeast-1
実際の動作ログ
テスト実行時のCloudWatch Logsです。
[INFO] 実行開始: {}
[INFO] 前回実行時刻: 1970-01-01T00:00:00+00:00
[INFO] 対象記事数: 20
[INFO] 要約中: Amazon EKS enhances cluster governance with new IAM condition keys
[INFO] 要約中: Amazon Aurora serverless: Up to 30% better performance...
...(20件)
[INFO] LINE送信成功: 200
[INFO] バッチ送信完了: 1〜5件目
[INFO] LINE送信成功: 200
[INFO] バッチ送信完了: 6〜10件目
[INFO] LINE送信成功: 200
[INFO] バッチ送信完了: 11〜15件目
[INFO] LINE送信成功: 200
[INFO] バッチ送信完了: 16〜20件目
[INFO] 完了: 20件送信
20件の記事を要約して4バッチに分けてLINEに送信、約58秒で完了しました。
Kiroを使った感想
優れてた点
仕様書→コードの変換精度が高い
日本語の仕様書をそのまま渡すだけで、CDKスタック・Lambda・README・requirements.txtまで一気に生成してくれました。構成の抜け漏れもほぼありませんでした。
エラーへの対応が速い
デプロイ時のエラーログを見せると、原因を特定して修正案を即座に提示してくれます。Bedrockのモデル問題もKiroが自分でAWS CLIを実行して利用可能なモデルを調べ、適切なものに変更してくれました。
AWSの操作も任せられる
aws configure の設定さえ済んでいれば、cdk deploy の実行からSecrets Managerへのトークン登録まで、AWSの操作をそのまま委任できます。
注意点
モデルの最新情報は要確認
Bedrockの利用可能モデルはアカウントやリージョンによって異なります。Kiroが提案したモデルIDが使えないケースがあったので、実際に確認するステップが必要でした。
ローカル環境の差異
Docker未インストール環境でのCDKのbundling問題など、ローカル環境固有の問題はKiroと一緒に解決していく必要があります。
まとめ
| 項目 | 内容 |
|---|---|
| 開発時間 | 約1時間(Kiroとの対話含む) |
| 手書きコード量 | ほぼゼロ |
| ハマりポイント | Bedrockモデル指定、Dockerなし環境のパッケージング |
| 月額コスト概算 | Lambda + DynamoDB + Bedrock で数十円〜数百円程度 |
AWSのアップデートを追いかけるのが楽になりました。
Kiroを使えば「やりたいこと」を日本語で伝えるだけでインフラからアプリまで一気に作れる時代になっています。
ぜひ試してみてください!!
また、アプリへの仕様変更要望あれば、ご連絡を!
参考情報
- AWS What's New RSS Feed
https://aws.amazon.com/about-aws/whats-new/recent/feed/ - Microsoft Update RSS Feed
https://www.microsoft.com/releasecommunications/api/v2/azure/rss - Amazon Bedrock ドキュメント
https://docs.aws.amazon.com/bedrock/ - AWS CDK ドキュメント
https://docs.aws.amazon.com/cdk/ - LINE Messaging API ドキュメント
https://developers.line.biz/ja/docs/messaging-api/



