🚰

Cloudflare Workersを使って定期的なタスク自動化を実質無料で行う(不要な画像、アカウントの定期削除など)

2024/05/06に公開

Cloudflare Workersなら定期的なタスクを自動化 Google Cloud Schedulerのような機能を実質無料で実行できます(1日あたり最大100,000リクエストまで)

実際に自分のサービスで使っている例

Cron 実行履歴(不要な画像の定期削除)


自分の扱っているサービスの場合1日1度不要な画像の処理を定期実行するので1日1リクエスト
30日で30リクエスト

リクエスト


サブリクエストを含めると先月(4月6日から〜5月6日まで)
1ヶ月あたり90リクエスト

1日あたり最大100,000リクエスト以内なので無料で使える!

Cloudflare Workersの料金体系(2024/5/6現在)


2024年5月時点の料金体系

最新の料金情報はCloudflareの公式ウェブサイトで確認してください。
https://developers.cloudflare.com/workers/platform/pricing/#workers

基本プラン

  • Free: Cloudflare Workersの無料プランでは、1日あたり最大100,000のリクエストが許可されています。これは、開発や小規模なプロジェクトに適していますが、Cron Triggersはこの無料枠に含まれるリクエスト数にカウントされます。

  • Standard: このプランでは、より高いリクエスト数と長いCPU実行時間が許可されており、より大規模なアプリケーションや企業に適しています。料金は使用したリクエスト数と実行時間に基づいて計算されます。5ドル払えば1000万リクエストCPU時間30秒伸びます。

Cron Triggers(Cron処理)の料金

Cron Triggersの実行は、リクエストとしてカウントされ、使用したリクエスト数に応じて料金が発生します。したがって、定期的にAPIを叩くスクリプトを実行する場合、そのリクエスト数は無料枠または有料プランの枠内でカウントされます。

Cron Triggersも無料枠の中で使える!

使用例

Workerが毎時1回のAPIリクエストを行い、毎日24回実行されるとします。1ヶ月(30日)でのリクエスト数は720回となります。このリクエスト数ならば、無料枠内でカバーされるため、追加の料金は発生しません。しかし、より頻繁に実行するか、複数のWorkersを使用する場合は、有料プランのリクエスト数や実行時間を超える可能性があり、その場合は追加料金がかかります。

Cron Triggersも無料枠の中で使えて、かつ無料枠が1日あたり最大100,000リクエストもあるのでこのような処理も無料で使える。

なので早速作ってみよう!

Cloudflare Workers

定期的にAPIを叩くためのCloudflare WorkersとCron Triggersを使用した実装例 
この例では、定期的に外部のAPIを呼び出し、その応答をログに記録します。実際の用途に応じて、APIの呼び出し結果をデータベースに保存したり、メールで通知したりすることも可能です。

ステップ 1: Cloudflare Workerスクリプトの作成

まず、Cloudflare Workersのダッシュボードで新しいWorkerを作成し、以下のスクリプトを使用します。このスクリプトは、指定されたURLからAPIを叩き、結果をコンソールに出力します。

addEventListener('scheduled', event => {
  event.waitUntil(handleScheduledEvent(event))
})

async function handleScheduledEvent(event) {
  try {
    // ここにAPIのURLを設定します
    const apiUrl = "https://example.com/api";
    const response = await fetch(apiUrl);
    const data = await response.json();
    
    // APIからの応答をログに記録します
    console.log(`API Response: ${JSON.stringify(data)}`);
  } catch (error) {
    // エラーが発生した場合は、それをログに記録します
    console.error(`Error fetching API: ${error}`);
  }
}

このスクリプトでは、fetch APIを使用して外部のAPIを呼び出し、応答をJSON形式で受け取っています。addEventListenerで'scheduled'イベントをリスンし、Cron Triggerによって定期的にこのイベントが発生すると、handleScheduledEvent関数が呼び出されます。

ステップ 2: Cron Triggerの設定

Workerスクリプトを保存してデプロイした後、Cron Triggerを設定して定期的にこのWorkerが実行されるようにします。

  1. Workerのダッシュボードで「Triggers」タブを開きます。
  2. 「Add cron trigger」をクリックし、必要なスケジュールをCron式で入力します。例えば、「毎日午前9時に実行」したい場合は、0 9 * * *と入力します。

ステップ 3: デプロイとテスト

設定を完了し、Workerをデプロイします。Cron Triggerに設定した時間になると、Cloudflare Workersが自動的に外部APIを叩き、応答をログに記録します。CloudflareのWorkersダッシュボードや開発者ツールを使って、実行結果を確認できます。

この例を基に、特定のAPIから定期的にデータを取得して処理する、さまざまな自動化タスクを実装できます。APIの呼び出し先や処理の内容は、実際の用途に応じて自由にカスタマイズしてください。

実際に自分のサービスで使っている実装(不要な画像の定期削除)

Cron トリガー

delete-unused-images.js
addEventListener('scheduled', event => {
  event.waitUntil(handleScheduledEvent(event))
})

async function handleScheduledEvent(event) {
  try {
    const url = 'https://example.com/api/xxxx/xxxxxxx'; // 画像削除用のAPIのURL
    const response = await fetch(url, {
      method: 'DELETE',
      headers: {
        'X-Scheduler-Token': 'xxxxxxxx'  // 認証や特定の情報をAPIに提供するためのヘッダー
      }
    });

    if (!response.ok) {
      console.error(`Error: ${response.statusText}`);
      return;
    }

    console.log('Successfully triggered the xxxxxxxx endpoint');
  } catch (err) {
    console.error(`Failed to trigger the endpoint: ${err}`);
  }
}

このスクリプトでは、fetch APIを使用して特定の外部APIからDELETEリクエストを送信し、不要な画像を削除する操作を行います。addEventListenerを用いて'scheduled'イベントをリスンし、Cloudflare WorkersのCron Triggerによって定められたスケジュールに従って定期的にこのイベントが発動すると、handleScheduledEvent関数が実行されます。

Worker


5/6の状況

リクエストのカウントが増える理由

1日1回のWorkerの実行でもサブリクエストが9回になる場合、その理由はWorkerが1回の実行で複数の外部API呼び出し(サブリクエスト)を行っている可能性があります。たとえば、以下のようなシナリオが考えられます:

  1. 複数のAPIエンドポイントへのリクエスト: Workerがデータを取得したり、アクションをトリガーしたりするために、複数の異なるAPIにリクエストを送る必要がある場合。
  2. エラーハンドリングとリトライ: APIからエラーレスポンスが返された時に、Workerがリトライメカニズムを持っている場合、同じリクエストを数回試みることがあります。
  3. データの依存関係: 初めのAPI呼び出しの結果に基づいて、追加のAPI呼び出しが必要となる場合(例: 初めにユーザーデータを取得し、そのデータを用いて別のリソースから情報を取得する)。

これらの要因により、1回の実行中に複数のサブリクエストが発生することがあります。各サブリクエストは、Cloudflare Workersの使用量やコストの計算において個別にカウントされるため、これが使用料に影響を与えることもあります。

リクエストとサブリクエスト

リクエスト:
Cloudflare Workersにおける「リクエスト」とは、外部からWorkerに送信されるHTTPリクエストのことを指します。例えば、ユーザーがウェブサイトにアクセスする際にWorkersに対してリクエストが送信されます。

サブリクエスト:
「サブリクエスト」とは、Workerが処理の一環として他の外部のURLに対して行うHTTPリクエストのことを指します。例えば、WorkerがAPIを呼び出すためにfetch()関数を使用して別のサービスにHTTPリクエストを送信する場合、このリクエストはサブリクエストとしてカウントされます。

補足

一応Google Cloud Schedulerでも無料枠3個分、定期的なタスクを自動実行出来ます


Cloud Scheduler無料枠使っていない人は無料枠3個使い切ってからやるのもいいと思います。
こっちのが設定が楽なので、構築は早いです。

Google Cloud Scheduleの料金体系(2024/5/6現在)


2024年5月時点の料金体系

https://cloud.google.com/scheduler?hl=ja

どちらにせよ無料枠無くなったらCloudflare Workersで実装するので同じですが笑

結論:Cloudflare Workersを使ってジョブスケジューラ(Google Cloud Scheduler)の様な機能を実質無料で使える

Discussion