2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS×LINE】Lambda と Messaging API で「毎朝の天気通知ボット」を作ってみた

Last updated at Posted at 2025-09-20

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を取得します。

【ユーザーID取得するための構成図】
ユーザーID取得.png

続けて、毎朝LINE送信するための構成図は下記としました。
【定期実行するための構成図】
AWS構成図.png

4. 各種アカウント作成

4.1. LINE公式アカウントを作成する。

メッセージは200通まで無料のようです。(2025年9月20日現在)
※無料メッセージ数は変わる可能性があります。最新は公式を確認してください。
4.png

以下のサイトを参考にアカウントを作成しました。
参考:https://entry.line.biz/start/jp/

4.2. LINE Developers で Messaging API チャネルを作る

  1. https://developers.line.biz/ にログイン → プロバイダー作成(初回のみ)
  2. プロバイダー配下で チャネルを作成 → 種別は Messaging API
  3. 入力(アプリ名・説明・連絡先)→ 規約同意 → 作成
  4. Messaging API 設定で チャネルアクセストークン(長期)を発行 → 安全に保管
  5. 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キーを指定。
Node.js
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. 動作確認

公式アカウントを自分の端末で友だち追加します。
image.png

今回はLambda側で「登録」とコマンドを受け取るようにしました。
「登録」と受け取った場合、ユーザーIDを返す仕組みです。
image.png

取得したユーザーIDを通知用Lamda側へ設定します。

7. 動作確認

無事、受け取ることが出来ました。
Lambdaの手動実行/EventBridgeの定刻実行のいずれでも、LINEに通知が届くことを確認しました。
image.png

後日、雨予報の日の通知もしっかり受信できました。

AWSを使って身近な困りごとを解決する仕組みづくりは楽しいです。

次はAWSの請求情報もLINEで受け取ろうかなと考えています。
最後まで読んでいただき、ありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?