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