Site cover image

ふつうのITエンジニアの独り言

本業はAndroidとiPhoneのアプリ開発のエンジニアです。将来はフリーランスで海の近くで妻とのんびり暮らすことを夢見て、幅広くIT技術に触れていきたいと思います。このブログはその備忘録と私のポートフォリオとして活動記録を記すものです。

astro-notion-blogが定期的にビルドされて配信されるようにしたい(その2) ~GASからCloudflareへ~

目次


はじめに


 前回、”いいね”ボタンをCloudflareで実現することができました。いろんなことが出来るCloudflareですが、今回はCron triggerを使ったブログの定期ビルドを実現したいと思います。

 ちなみに、Cron triggerのCronとはCron式のことを指しており、定期的なスケジュールを指定するための書式のことです。書式に従って定義した時間に、任意の処理を実行することができます。

定期ビルドについて


 実は、少し前に定期ビルドをGoogle Apps Script(GAS)で実現しています。この記事では、Cloudflare PagesにWebhookを作成し、GASから毎日00:00~01:00の間にWebhookにリクエストを投げることで定期ビルドを実現していました。

 ですが、ブログを構成するシステムが分散していることが気になってきたので、Cloudflareに定期ビルドの機能も持たせることにしました。

Cloudflare Workersの実装


プロジェクトの新規作成

 プロジェクトの作成は、前回の”いいね”ボタンの作成のときと同様にこちらのサイトを参考に作成しました。

scheduled実装

 新規作成したプロジェクトの”/src/index.ts”に、定期実行したい処理を実装します。webhookUrlは、各自の環境に合わせたURLを設定するようにしてください。

export default {
  async scheduled(event, env, ctx) {
    // Webhook URL
    const webhookUrl = `https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/<WebhookのID>`; 

    const response = await fetch(webhookUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        event: "trigger",
      }),
    });

    if (!response.ok) {
      console.error("Webhook trigger failed:", response.statusText);
    }
  },
};

 今回はCron triggerで呼び出される処理を実装するため、必ず関数名はscheduledである必要があります。fetchとscheduledは、次のように使い分けられます。

関数名 用途
fetch HTTPリクエストを受け取るときに呼ばれる関数
scheduled cronトリガーで定期実行されるときに呼ばれる関数

Wrangler.jsoncの修正

 定期実行するためのタイマーの定義を行います。以下のように記述するとUTC時間の15:00にscheduledが実行されます。注意するのは、設定時刻はJSTではなくUTCである点です。日本時間の0:00に実行したかったので、UTCで15:00を設定しました。

	// cron トリガーの設定(UTCで指定)
	"triggers": {
		"crons": ["0 15 * * *"] 
	}

 Cron式については様々なサイトで説明されているの、ここでは割愛します。

デプロイ後のTriggerの確認

 作成したWorkerをデプロイすると、指定した時間にscheduledが呼び出されるようになります。triggerが設定されているか確認したい場合は、CloudflareのWorkers & Pagesからプロジェクトを選択し、設定を表示してください。トリガーイベントに設定が表示されていることが確認できました。

トリガーイベントに15:00のタイマーとscheduledが設定されていることが分かる。

まとめ


 GASで実現していた定期ビルドのトリガーイベントをCloudflareに移行することができた。これまでNotion + Cloudflare + GASで運用していたブログのシステム構成が、Notion + Cloudflareに集約できたので、今後のメンテナンスが簡単になります。

 一方でCloudflareではcron triggerは無料枠では5つまでしか使えないという制約があります。GASでは1スクリプトにつき20トリガーの設定ができ、別のスクリプトであれば制限数も別カウントになるので、cron triggerはあまり多様はできない点には気をつける必要がありそうです。今後も適材適所でGASも活用していきたいと思います。