💪

日本の祝日を取得できるAPIをSupabaseを使って作ってみた

2024/11/10に公開
2

結論

SupabaseのEdge Functionを使って日本の祝日を年単位で取得できるAPIをサーバーレスで作ってみました。1955年から2025年までカバーしています。Supabaseを使った理由は後述。

Supabase上にデプロイしているのでお試しに触れます。(予告なくプロジェクト止まる場合がございます。ご容赦願います。)

例):2024年の祝日一覧取得
URL
https://gsscqnnnbuymbvdzaawj.supabase.co/functions/v1/japanese-holiday-api/2024

レスポンス(長いので折り畳みしてます)
{
  "holidays": [
    {
      "holidayDate": "20240101",
      "holidayName": "元日"
    },
    {
      "holidayDate": "20240108",
      "holidayName": "成人の日"
    },
    {
      "holidayDate": "20240211",
      "holidayName": "建国記念の日"
    },
    {
      "holidayDate": "20240212",
      "holidayName": "振替休日"
    },
    {
      "holidayDate": "20240223",
      "holidayName": "天皇誕生日"
    },
    {
      "holidayDate": "20240320",
      "holidayName": "春分の日"
    },
    {
      "holidayDate": "20240429",
      "holidayName": "昭和の日"
    },
    {
      "holidayDate": "20240503",
      "holidayName": "憲法記念日"
    },
    {
      "holidayDate": "20240504",
      "holidayName": "みどりの日"
    },
    {
      "holidayDate": "20240505",
      "holidayName": "こどもの日"
    },
    {
      "holidayDate": "20240506",
      "holidayName": "振替休日"
    },
    {
      "holidayDate": "20240715",
      "holidayName": "海の日"
    },
    {
      "holidayDate": "20240811",
      "holidayName": "山の日"
    },
    {
      "holidayDate": "20240812",
      "holidayName": "振替休日"
    },
    {
      "holidayDate": "20240916",
      "holidayName": "敬老の日"
    },
    {
      "holidayDate": "20240922",
      "holidayName": "秋分の日"
    },
    {
      "holidayDate": "20240923",
      "holidayName": "振替休日"
    },
    {
      "holidayDate": "20241014",
      "holidayName": "スポーツの日"
    },
    {
      "holidayDate": "20241103",
      "holidayName": "文化の日"
    },
    {
      "holidayDate": "20241104",
      "holidayName": "振替休日"
    },
    {
      "holidayDate": "20241123",
      "holidayName": "勤労感謝の日"
    }
  ]
}

Supabase選定理由

当初触ったことのあるAWSのLamba+API Gatewayの構成で作ろうかと思いましたが、RDSの値段がお手軽価格を超えてたのでコストの面で断念。
代替の構成を調べてたところ耳にしたことはあるSupabaseを調べていくうちに簡単なものを作るのに良さそうなのと無料プランがあったので勉強がてら触ってみました。

システム構成図

SupabaseのEdge FunctionとDatabaseを使用。
すごくシンプルです。
クライアントからの受付をEdge Functionで行い、祝日データの取得はDatabaseから行います。
プロダクションで使う場合はもっと考慮すべき部分が出てくるかと思いますが、勉強用なので簡易構成にしています。

japanese-holiday-api drawio

Supabaseを実際に触ってみて

Edge FunctionはFirebase のCloud Functions for Firebaseに近しいノリだったので、
すんなり頭に入ってきました。Firebase触ったことある方は抵抗なく使えると思いました。
Supabase is an open source Firebase alternative.と公式に書いてあるだけあります。

DBについてはFirebaseはNoSQL(Cloud Firestore)ですが、SupabaseはRDS(PostgreSQL)なのでRDS知っていれば普通に使えます。

プロジェクト作成と実装について

Supabaseのアカウント登録が必要ですが特に詰まるところはないかと。
公式ドキュメントがしっかりしているので、公式ドキュメント読みながらやればできるかと思います。
JavaScript使いましたがC#やFlutter、Python、Swift、Kotlinもサポートしているとのことです。
https://supabase.com/docs

実装についてはローカル環境がSupabase CLIでサクッと作れるのでデバッグしやすかったです。
ローカルではdockerを裏で起動しており管理画面もローカル環境上で操作できて便利でした。
https://supabase.com/docs/guides/local-development

JavaScriptのランタイムとしてDenoを使っていました。
Denoを触るのは初めてでしたがnpm使わないのは新鮮でした。

DBの管理について

今回は時短とテーブル1個のため管理画面からサクッと作りました。
データの投入を管理画面からCSVインポートでできるので便利すぎます。
https://supabase.com/docs/guides/database/overview

デプロイについて

Supabase CLIのコマンドで一発でできます。お手軽すぎる。
https://supabase.com/docs/guides/functions/deploy

【追記】
GitHub Actionsの説明ページがあったのでそちらを参考にデプロイを自動化しました。
GitHub Actions便利でいいですね。
https://supabase.com/docs/guides/functions/examples/github-actions

実際触ってみて

機能面の観点で言うと思ったより簡単にできました。
セキュリティや非機能要件を考えたときには実際に業務で使うのに適しているかはまだ判断しかねますが、個人的にはFlutterもサポートされているので個人開発する時には採用しても良さそうという所感です。
StorageやAuthなど今回使っていない機能もあるので今後の動向を見つつ定期的にキャッチアップしていきたいと思いました。

おまけ

サンプルコードをGitHubに公開しています。
https://github.com/kzk1122/japanese-holiday-api

GitHubで編集を提案

Discussion

MeguriMeguri

Supabaseを選んだ理由や実際の構成についての解説が、他の開発者にとっても非常に役立ちそうです。ありがとうございます。