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
などの関数を差し込んでやるほうがよいかなと思います。