Airbnb の earnings / transaction history CSV を Google Cloud Storage 経由で受け取り、Cloud Run 上の Ruby サービスで BigQuery に継続取り込みする。
このリポジトリでは、CSV の正規化、重複排除、BigQuery への staging + MERGE、任意の Slack 通知までを扱う。
想定入力と現実装から読み取れる前提:
- 日本語ヘッダを英語のスネークケースへマッピングする
Airbnb remitted taxとAirbnbが納税する自動設定された税金は同一列として扱う- 日付は
MM/DD/YYYY形式を前提にDATEへ変換する - 金額列は
BigDecimalで BigQueryNUMERIC互換へ正規化する - 空文字は
NULLとして扱う - 未知ヘッダは raw 名のまま保持しつつ warning を出す
- 各行の内容から
row_idを計算し、同一ファイル再投入時の重複を防ぐ
このリポジトリで継続的に扱う対象:
- Airbnb CSV の取り込み要件整理
- Cloud Run サービスの HTTP エントリポイント
- CSV 正規化ロジック
- BigQuery 取り込みと
MERGE - デプロイ手順
- テストと運用ドキュメント
- Ruby + Rack/Puma + Cloud Run の小さな構成を維持する
- CSV の元情報を落としすぎず、分析しやすい英語カラムへ正規化する
- BigQuery では staging table 経由でロードし、本番テーブルへ
MERGEする - 重複排除は自然キーではなく
row_idベースで行う - 未知ヘッダや失敗は握り潰さず、ログで検知できるようにする
- Slack 通知は optional とし、未設定でも本体処理は動くようにする
- テストは
Minitestで維持し、bundle exec rake testを標準コマンドにする - カバレッジは 80% 以上を維持目標とする
- Airbnb から earnings CSV をダウンロードする
- CSV を GCS バケットへアップロードする
- Eventarc が Cloud Run サービスへ object finalized イベントを配送する
- サービスが GCS から CSV を取得する
- CSV を正規化し
row_idを付与する - BigQuery staging table へ JSON Lines としてロードする
- 本番テーブルに対して
row_idベースのMERGEを実行する - 成功時または失敗時にログを残し、必要に応じて Slack 通知する
- Airbnb API からの自動ダウンロード
- CSV 以外の入力形式への対応
- ダッシュボード自動作成
- 会計システムや仕訳システムとの直接連携
- BigQuery 集計ビューの自動生成
- Airbnb の CSV 列構成は予告なく変わる可能性がある
- 現実装は空文字を
NULL化するが、N/A相当値の追加正規化は今後の余地がある CSV.parseは現状liberal_parsingを使っていないため、崩れた CSV には弱い可能性がある- 未知列を raw 名のまま保持すると、既存 BigQuery schema と不一致になりうる
- ゲスト名や予約関連情報など、取り扱いに注意が必要なデータを含む
row_idを重複排除キーとして維持するMERGEは初版では insert-only とし、既存行の更新は行わない- structured CloudEvent と raw payload の両方を受け付ける
- BigQuery へのロード前に schema で型を明示する
- optional な通知機構は本体ロジックから分離したまま保つ
ghコマンドは必ずネットワーク権限付きで実行する- 公開 OSS として、GitHub の Issue と Pull Request はタイトル・本文ともに英語で作成する