🐨

Cloudflare WorkersでPagesを定期実行させる設定メモ

に公開

はじめに

Astroで構築したJamstackサイトをCloudflare Pagesで運用しています。
SSGでは、RSSフィードやGitHub APIなどのデータをビルド時にのみ取得しており、
一度ビルドすると次のビルドまでデータが更新されないという課題があります。
そのため、新しいブログ記事を投稿しても、GitHubでコントリビュートしても再ビルドしない限りサイトに反映されません。

この問題を解決するために以下の方法が考えられます。

  • GitHub Actionsのcronで定期的に空コミット→push

▶︎ GitHubに無駄なコミット履歴が残ってしまうので今回はなし

  • Cloudflare Workers + Pages Deployment APIを使った再ビルドをトリガー

▶︎ Cloudflare内で完結し、構成がシンプルになるためこの方法を採用。(以下で設定手順を解説します。)

前提

  • Node.js と npm が入っていること
  • wrangler(Cloudflare CLI)を使用する。
# npm で wrangler をインストールする
npm install -g wrangler

Wrangler プロジェクト作成

# プロジェクト作成
npm create cloudflare@latest
# Ok to proceed? (y):y
# In which directory do you want to create your application? : ./pages-deployer(任意)
# What would you like to start with?:Hello World example
# Which template would you like to use?:Scheduled Worker (Cron Trigger)
# Which language do you want to use?:TypeScript
# You're in an existing git repository. Do you want to use git for version control?:Yes(任意)
# Do you want to deploy your application?:No

index.tsの編集

以下のコードを src/index.ts に記述します。

export interface Env {
  ACCOUNT_ID: string;
  PROJECT_NAME: string;
  CF_API_TOKEN: string;
}

export default {
  async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext) {
    const { ACCOUNT_ID, PROJECT_NAME, CF_API_TOKEN } = env;

    const apiUrl = `https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/pages/projects/${PROJECT_NAME}/deployments`;

    const res = await fetch(apiUrl, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${CF_API_TOKEN}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({}),
    });

    if (!res.ok) {
      const errText = await res.text();
      console.error('Failed to trigger Pages build:', res.status, errText);
      return;
    }

    const data = await res.json();
    console.log('Pages build triggered successfully:', data);
  },
};

API経由でCloudflare Pagesの再デプロイを実行するWorkerです。
scheduled() はCron Triggerによって定期実行されます。

wrangler.jsoncの編集

wrangler.jsonc にスケジュールと環境変数を追加します。

{
	"name": "pages-deployer",
	"main": "src/index.ts",
	"compatibility_date": "2025-10-31",
	"triggers": {
		"crons": ["0 0 * * *"]
	}
}

Cloudflare API トークンを用意する

1. Dashboardを開く
2. My Profileを押下

3. API Tokensを押下

4. Tokenを作成する

テンプレート「Edit Cloudflare Workers」または「Custom Token」を選択する。
(今回は「Custom Token」の手順で進める)

①Token name
▶︎ 任意の名前を設定する。
②Permissions
▶︎ Account > Cloudflare Pages > Edit
③Account Resources
▶︎ デフォルトのまま
④Client IP Address Filtering
▶︎ デフォルトのまま
⑤TTL
▶︎ デフォルトのまま

各設定内容の詳細
設定項目 推奨設定 理由
Account Resources 「Include」→「Specific Account」→(対象アカウント選択) アカウント全体へのアクセスを許可するが、他アカウントには影響なし
Client IP Address Filtering 設定しない(空欄のまま) Cloudflare Workerからの実行なので、特定のIP制限は不要
TTL(トークンの有効期限) 無期限("No expiration")が基本 定期的なジョブで永続利用するため。ただしセキュリティ的に心配なら数か月でもOK


①〜⑤の設定が終わったら「Continue to summary」> 「Create Token」で生成されたトークンは後でWorkerのシークレットに設定するので控えておく。(CF_API_TOKEN)

環境変数を設定

wrangler でローカル環境変数を登録します。

# アカウントID(ダッシュボード右下などに表示)
npx wrangler secret put ACCOUNT_ID

# Cloudflare Pagesのプロジェクト名
npx wrangler secret put PROJECT_NAME

# 先ほど作成したAPIトークン
npx wrangler secret put CF_API_TOKEN

動作確認

手動で実行

npx wrangler deploy --test-scheduled

結果

コンソールに以下のようなログが出ればOK。

Pages build triggered successfully

Cloudflare Pages の「Deployments」タブでも、新しいデプロイが作成されているのを確認できます。

デプロイ

npx wrangler deploy

これでWorkersがCloudflare上にデプロイされます。

参考記事

Discussion