Google Apps ScriptとCloud Tasksを組み合わせてAPIレートリミットを制御しながら1クリックで安定運用する
株式会社コロプラ / 尾崎隆一郎
メンバー / バックエンドエンジニア / 従業員規模: 501名〜1,000名 / エンジニア組織: 101名〜300名
アーキテクチャ
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
あるGASを使ったシステム内で外部 API のレートリミットを守りながら大量のリクエストを安全に処理したく、Cloud Tasks を導入しました。
元々のシステムのフローは「スプレッドシート→ Google Apps Script(以下 GAS) → Cloud Run(生成処理) → GAS → スプレッドシート(結果書き込み)」という構成でした。
このシステムには2つの制限がありました。1つ目は GAS 側の仕様で、1実行あたりのタイムアウト制限があるため、長時間の処理が実行できません。2つ目は呼び出し先 API のレートリミットで、リクエストが集中すると制限に引っかかり実行できません。
さらに、非エンジニアでも使えるように、スプレッドシートのボタンを1クリックすれば処理が走る構成にするという要望がありました。レートリミットに達した場合でも操作を弾くのではなく、自動的に上限内で処理が流れてほしい、という点が重要でした。
これらを踏まえて作成したシステムのフローは「スプレッドシート → GAS → Cloud Tasks(キュー) → Cloud Run(生成処理) → スプレッドシート(結果書き込み)」という構成です。
どのような状態を目指していたか
そのため、外部 API への大量リクエストを安全かつ効率的に処理できる構成を目指していました。
比較検討したサービス
- Pub/Sub
比較した軸
同時実行数を調整できるかどうかを重視しました。API 側のレートリミットを守りつつ、処理待ちが積み上がりすぎない運用にしたかったためです。
選定理由
キュー単位で同時実行数や配信レートを直接設定できる点が決め手でした。
Pub/Sub でも近い制御はできますが、Cloud Tasks は max_concurrent_dispatches でキューごとの同時実行数を直感的に設定でき、dispatchDeadline(タスクのタイムアウト上限)も最大 30 分まで対応しています。スプレッドシート起点の複数リクエストでも、受け側に過負荷をかけずに処理できます。
導入の成果
導入前は、リクエストが集中すると外部 API のレートリミットに引っかかり、手動での再実行が必要なケースがありました。
Cloud Tasks を導入したことで以下が変わりました。
- スプレッドシートのボタン1クリックでリクエストがキューで制御されながら流れるようになり、安定稼働するようになりました
- Cloud Tasks のリトライ制御により、タイムアウトや API エラーが起きても自動でリトライされるため、継続的に処理できる状態を保てています
導入時の苦労・悩み
Cloud Tasks 自体の機能というより、実行主体と権限の整理に時間がかかりました。
最初に発生したのはタスク作成時の 403 です。当初 GAS 実行ユーザーに Queue Adminを付与していました。ですが、このロールはキュー管理用でタスク追加権限がないため、正しくは Cloud Tasks Enqueuer が必要でした。
その後も 403 が続きました。Cloud Tasks が Cloud Run を呼び出す際は、GAS 実行ユーザーではなく専用のサービスアカウントが使われます。GAS 実行ユーザーがそのサービスアカウントに成り代わる権限(Service Account User)を持っていなかったことが原因でした。
最終的な権限構成は以下のとおりです。
- GAS 実行ユーザー
- キューに対して:
Cloud Tasks Enqueuer - サービスアカウントに対して:
Service Account User
- キューに対して:
- Cloud Tasks に紐づくサービスアカウント
- Cloud Run に対して:
Cloud Run Invoker
- Cloud Run に対して:
どのアイデンティティにどのロールが必要かの整理に手間取りましたが、専用サービスアカウントを用意して役割を分離することで解消しました。詳細は Cloud Tasks の IAM アクセス制御 も参考になります。
導入に向けた社内への説明
上長・チームへの説明
今回の対象は社内向けのシステムで、外部影響やリスクが限定的だったため、サービス選定自体は私個人で技術判断しつつ、インフラチームに相談の上導入を進めました。今回のシステム要件にあっているかつ弊社で普段から使っている Google Cloud製品ということもあり、特に説明は求められませんでした。
活用方法
よく使う機能
配信レート制限
キューの同時実行数の上限を設定しています。API 側のレートリミットに合わせて値を調整することで、過負荷をかけずに処理が流れるようになりました。
リトライ制御とバックオフ設定
タスク失敗時の最大試行回数と再試行の間隔を設定しています。タイムアウトや API エラーが起きても自動でリトライするため、手動で対応が必要なケースを減らせています。
ツールの良い点
- 同じ Google Cloud 製品の Cloud Run との連携が簡単で、認証周りも Google Cloud 製品の IAM の仕組みに乗れます。権限設定の際も、普段使っている Workspace のメールアドレスをそのまま IAM に登録できるため、開発側からすれば「このアドレスに権限を付与してほしい」と伝えるだけで済みます。既存の Google アカウント管理の延長で扱えるため、新しいユーザー管理の仕組みを用意する必要がありません。
ツールの課題点
Cloud Tasks は at-least-once 配信を保証するため、メッセージの消失を防ぐトレードオフとして稀にタスクが重複実行されることがあります。重複実行で不具合が起きないよう、冪等性を持った設計にしておく必要があります。
キューに溜まったタスクが必ず入った順序で実行されるわけではないため、リクエスト順に依存した処理は書かない方が安全です
ツールを検討されている方へ
Google Cloud を普段から使っている方は、認証の統合をスムーズにできるため導入しやすいと思います。
また、キューイングシステムのメンテナンスコストを減らしたいというケースにも向いています。
株式会社コロプラ / 尾崎隆一郎
メンバー / バックエンドエンジニア / 従業員規模: 501名〜1,000名 / エンジニア組織: 101名〜300名
株式会社コロプラ / 尾崎隆一郎
メンバー / バックエンドエンジニア / 従業員規模: 501名〜1,000名 / エンジニア組織: 101名〜300名
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法


