1. はじめに
「今日は傘いる?」
この小さな悩みを自動化したくて、AWS LambdaとEventBridge、そして LINE Messaging API を使って、毎朝の天気通知ボットを作りました。
Yahoo天気など既存アプリにも通知機能はありますが、不要なニュースや情報まで届くのが煩わしいと感じていました。
そこで「本当に必要な情報だけを、シンプルに受け取れる仕組み」を自分で用意することにしました。
なお、LINE Notifyはサービス終了していますが、問題有りません。
今回は、公式アカウント+Messaging API でプッシュ配信します。
※注意事項
本記事は個人的な趣味/技術検証の一環として作成しています。
説明は概要レベルになっていますので、ご了承ください。
2. 機能概要
- 配信タイミング:毎朝 7:00(JST)
- 配信先:自分のLINE
- 参照API:OpenWeather(天気情報)
3. 構成図
今回は自分のLINEに送れればOKとします。
ただし、自分のuserIdが分からないとプッシュ送信できません。
そのため最初に、作成した公式アカウントへ自分が1通メッセージを送る
→ Webhookで受けて、userIdを取得します。
続けて、毎朝LINE送信するための構成図は下記としました。
【定期実行するための構成図】
4. 各種アカウント作成
4.1. LINE公式アカウントを作成する。
メッセージは200通まで無料のようです。(2025年9月20日現在)
※無料メッセージ数は変わる可能性があります。最新は公式を確認してください。
以下のサイトを参考にアカウントを作成しました。
参考:https://entry.line.biz/start/jp/
4.2. LINE Developers で Messaging API チャネルを作る
- https://developers.line.biz/ にログイン → プロバイダー作成(初回のみ)
- プロバイダー配下で チャネルを作成 → 種別は Messaging API
- 入力(アプリ名・説明・連絡先)→ 規約同意 → 作成
- Messaging API 設定で チャネルアクセストークン(長期)を発行 → 安全に保管
- Webhook(任意):userId取得に使う場合のみ有効化し、API Gateway のURLを設定→検証
4.3. OpenWeatherのAPI キーを取得(無料枠でOK)
下記のサイトからアカウントを作成し、APIキーを取得。
https://openweathermap.org/
5. 通知用Lamdaの実装
- 目的:毎朝、指定都市の「今日中に雨が降りそうか」を判定して LINE に通知する。
- トリガー:Amazon EventBridge(JSTのcron)から Lambda を定刻起動。
- 外部API:OpenWeather/LINE Messaging API(push)
- 設定:環境変数でアクセストークン・送信先userId・都市名・APIキーを指定。
export const handler = async () => {
if (!ACCESS_TOKEN) throw new Error("LINE_CHANNEL_ACCESS_TOKEN is not set");
if (!USER_IDS.length) throw new Error("LINE_USER_IDS is empty");
// 現在天気と今日の予報を並列取得
const [w, fc] = await Promise.all([
fetchWeather().catch(() => null),
fetchForecast3h().catch(() => null),
]);
const cityEn = fc?.city?.name || w?.name || CITY;
const city = CITY_JA || String(cityEn).split(",")[0]; // 日本語指定があればそれを優先する
const temp = Number.isFinite(w?.main?.temp) ? Math.round(w.main.temp) : null;
// 今日の雨予報(あればこちらを優先)
const today = willRainToday(fc);
const rainy = today.rainyToday ?? isRainy(w);
const base = rainy
? `【傘アラート】${city}は雨の見込みやで。傘を忘れんでな。`
: `${city}は雨の心配は無さそうやで。傘は要らんと思うで。`;
const detail =
today.firstRainTime
? `最初の降雨見込み:${today.firstRainTime}頃 / 予想降水量合計:${today.totalMm}mm`
: `予想降水量合計:${today.totalMm}mm`;
const tail = temp !== null ? `現在気温は約${temp}℃です。` : "";
const nowJST = new Intl.DateTimeFormat("ja-JP", {
timeZone: "Asia/Tokyo", hour: "2-digit", minute: "2-digit"
}).format(new Date());
const msg = [base, detail, tail && tail, `(${nowJST}時点)`]
.filter(Boolean)
.join("\n");
for (const uid of USER_IDS) {
await pushText(uid, msg);
}
return { statusCode: 200, body: "ok" };
};
6. Webhook(userId を取得するため)
6.1. API Gateway(HTTP API)を作成
- ルート:POST /webhook
- 統合:Webhook用Lambda
- HTTP API のURLを取得し、/webhook を付けた完全パスにする
- LINE Developers → 対象チャネル → Messaging API 設定
- Webhook送信:有効化
- Webhook URLに上記URLを設定 → 検証(Verify)で200 OKを確認
6.2. 動作確認
今回はLambda側で「登録」とコマンドを受け取るようにしました。
「登録」と受け取った場合、ユーザーIDを返す仕組みです。
取得したユーザーIDを通知用Lamda側へ設定します。
7. 動作確認
無事、受け取ることが出来ました。
Lambdaの手動実行/EventBridgeの定刻実行のいずれでも、LINEに通知が届くことを確認しました。
後日、雨予報の日の通知もしっかり受信できました。
AWSを使って身近な困りごとを解決する仕組みづくりは楽しいです。
次はAWSの請求情報もLINEで受け取ろうかなと考えています。
最後まで読んでいただき、ありがとうございました。