Honoで作ったCloudflare Workersアプリに、スケジュールタスクを追加する

HonoはAPI機能に特化したフレームワークで、Cloudflare Workersで使用できます。Honoを使う場合、Cloudflare Workersでは環境変数やbindingsを処理してくれるので非常に便利です。また、Cloudflare WorkersでHonoを使用しない場合、fetch関数をexportする必要があります。しかし、Honoではその仕組みを持っており、fetchだけをHonoにすることで、APIやcronジョブを動かすことができます。さらに、Honoにはscheduleなどの関数を追加することもできます。HonoはREST APIの提供に特化しているため、scheduleなどの機能は他のプラットフォームでデプロイする際に問題が発生する可能性があります。そのため、fetch関数に集中して再利用可能な処理やバインドなどを追加するのが良いと思われます。

広告ここから
広告ここまで

目次

    かなりの小ネタですが、知っていると便利かなと思ったのでまとめました。

    HonoはAPI機能に特化しているフレームワーク

    当たり前といえば当たり前なのですが、Honoを使う場合、Cloudflare WorkersはAPIを提供するために使うことになります。

    たとえばこんな感じですね。Expressライクで、Cloudflareの環境変数・bindingsなどをよしなに処理してくれるのはとてもありがたい存在です。

    import { Hono } from 'hono'
    
    const app = new Hono()
    
    app.get('/', (c) => c.text('Hello Hono!'))
    export default app

    Cloudflare WorkersをHonoなしで作ったことがある方は、Cloudflare WorkersでAPIを作る際に、fetch関数をexportする必要があることをご存知かと思います。Honoも内部的にはこの仕組みを持っていて、通常export default appと書く部分は、次のように書き換えることもできます。

    export default {
        fetch: app.fetch
    }

    fetchだけHonoにすることで、scheduledなども利用できる

    export defaultする中身を、Cloudflare Workersが要求する実装にすれば、Honoの有無に関わらず必要なAPIやcronジョブを動かすことができます。ということは、export defaultの中身に、fetch以外のハンドラーを追加することで、Honoとバッチ・cronジョブなどを同居できます。

    export default {
        fetch: app.fetch,
        scheduled: async (event, env, ctx) => {
            ctx.waitUntil(doSomeTaskOnASchedule());
          },
    }

    関数の型をつける場合は、Exportする関数用の型がユースケースごとに用意されていますので、それを使いましょう。

    const scheduled: ExportedHandlerScheduledHandler = async (event, env, ctx) => {
        ctx.waitUntil(doSomeTaskOnASchedule());
      }
    export default {
        fetch: app.fetch,
        scheduled
    }

    おわりに

    Hono自体はREST APIの提供に特化していますので、Pull RequestやIssueなどでschedule等に対応してもらうのは違うかなぁと思っています。それをするとAWS LambdaやDenoなどにデプロイした時はどうなるの?みたいな議論もでてきそうですし。

    それよりは、fetch関数の提供に集中してもらいつつ、再利用したい処理やBindなどがある場合は、scheduleなどの関数を差し込んでやるほうがよいかなと思います。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark