GitHub ActionsとDiscord Webhookで定期通知システムを作ってみた

GitHub ActionsとDiscord Webhookで定期通知システムを作ってみた

GitHub ActionsとDiscord Webhookを組み合わせて、サーバーレスで定期通知システムを作ってみました。
2026.08.19

こんにちは!前越です。

事の始まり

「Discordで毎日決まった時間に通知を送りたいな〜」と思ったのがことの始まりです。

でも、そのためにサーバーをホスティングするのはちょっと大げさだし、GAS(Google Apps Script)やAWSを使う手もあるけど、あまり複雑にはしたくない...。

そんなとき友人に「GitHub Actions でできるんじゃない?」と教えてもらい、調べてみたところ...えっ、できるじゃん!!!
GitHubだけで完結できて、cron設定で定期実行もできる。これは便利すぎる!ということで、実際にDiscord Webhookと組み合わせて定期通知システムを作ってみたので、その方法を共有します。

Discord Webhookとは?

Discord Webhookは、外部のアプリケーションからDiscordチャンネルにメッセージを送信するための仕組みです。
botアカウントを作成しなくても、URLにPOSTリクエストを送るだけでメッセージを投稿できるのが特徴です。
https://discord.com/developers/docs/resources/webhook

Discord Webhookの準備

まず、Discordで通知を受け取るためのWebhook URLを取得します。

わかりやすいブログがあったのでこちらを参考にして取得してきてください!!!
https://dev.classmethod.jp/articles/lambda-discord-daily-task/

このURLは後で使うので、メモしておきましょう!

通知プログラムの実装

src/main.ts を作成して、Discordへメッセージを送信するコードを書いていきます。

コードの内容
src/main.ts
/**
 * Discord Webhookにメッセージを送信する関数
 */
async function sendDiscordMessage(webhookUrl: string, message: string): Promise<void> {
  try {
    const response = await fetch(webhookUrl, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        content: message,
      }),
    });

    if (!response.ok) {
      throw new Error('メッセージの送信に失敗しました');
    }

    console.log('メッセージを送信しました:', message);
  } catch (error) {
    console.error('メッセージの送信に失敗しました:', error);
    throw error;
  }
}

/**
 * メイン処理
 */
async function main(): Promise<void> {
  const webhookUrl = process.env.DISCORD_WEBHOOK_URL;

  if (!webhookUrl) {
    throw new Error('環境変数 DISCORD_WEBHOOK_URL が設定されていません');
  }

  const message = 'ここに送信したいメッセージを記述';

  await sendDiscordMessage(webhookUrl, message);
}

main().catch((error) => {
  console.error('エラーが発生しました:', error);
  process.exit(1);
});

Discord Webhook APIへのPOSTリクエストは思ったより簡単で、content フィールドにメッセージを入れるだけで送信できました。

GitHub Actionsの設定

.github/workflows/notify.yml を作成して、定期実行の設定を行います。

.github/workflows/notify.yml
name: Discord Notifier

on:
  # 定期実行(cronスケジュール)
  schedule:
    - cron: '0 0 * * *'  # 実行したい時刻に変更してください

jobs:
  notify:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      - name: Send notification
        run: npm start
        env:
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}

cronスケジュールについて

GitHub Actionsの cronUTC(協定世界時) で指定する必要があります。
日本時間(JST)はUTC+9なので、変換が必要です。

JST UTC cron式
06:00 21:00(前日) '0 21 * * *'
12:00 03:00 '0 3 * * *'
18:00 09:00 '0 9 * * *'

動作確認

待つこと数時間...
スクリーンショット 2026-08-19 18.24.54
※スクショは上記のコードとは関係ない自作のアプリになります

無事通知されてましたね!

実際に使ってみると、設定した時刻ぴったりには実行されないことに気づくと思います。
cronで設定した時間よりも 10分から30分 ほど遅れて通知されることが毎回ありました。

いろいろ調べてみたところ、実行負荷が高い時間の場合遅れて実行されるみたいです。
なので通知したい時間に余裕を持たせた方が良いでしょう。

https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule

実行負荷が高い時間帯には、イベントscheduleの実行が遅れる場合があります。負荷が高い時間帯には、毎時開始時が含まれます。負荷が十分に高い場合、キューに登録されているジョブの一部が破棄される可能性があります。遅延の可能性を減らすには、ワークフローの実行時間を別の時間帯に設定してください。

感想

GitHub上だけで定期通知システムを作れるのは本当に便利で、作ってよかったなと思います。
Webhookを使ったこういった一方向の通知システムであれば、同じような構成でサクッと作れるので、ぜひ皆さんも試してみてはいかがでしょうか。

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事