はじめに
こんにちは。人材領域でレコメンドシステムの機能開発をしている羽鳥です。
突然ですがクイズです。500GBの Google BigQuery のテーブルを pandas.read_gbq を使って行単位の1000並列でロードした場合の課金額はいくらになるでしょうか。
正解は約33.5万円です。(2022/6/14時点の1ドル=134円で計算した場合) 1TBあたり5ドル1 * 134円 * 0.5TB * 1000回 = 335,000円
GCPに限らずクラウドサービスではその製品に対する理解が浅かったり、誤解があったりするとすぐにこのような事態に陥ります(私もその一人です)。 本記事ではGCPでの意図せぬ請求を発生させないためのtipsを紹介しようと思います。
APIの上限設定
まずはなんと言ってもAPIのリクエスト数に制限をかけておくことでしょう2。 GCPではAPIのリクエスト数に上限を設けることが可能です。APIのリクエスト数に上限を設けることで、例えばGCPの無料枠を超えた課金が発生することを防ぐことが可能になります。
操作自体はGUIから設定可能で簡単な上、「1日あたり」、「1分あたり」、「あるユーザーごとの1分あたり」など細かな粒度で設定することができます。 先程のBigQueryの例などでは、BigQuery Analysis(データ取得)のAPIに制限を入れておけば大きな課金は防げたことになります。
予算通知
APIの上限設定と合わせて予算通知を設定しておくのも有効です3。
大きめのジョブをうっかり流してしまったような場合の他にも、定期的に高頻度でAPIをコールしているような場合や、大きい資材をストレージに置いている場合は、気が付かぬうちにじわじわと課金額が上がって行くことになるかと思います。 このような場合にも予算通知を設定しておけば、メールやSlack経由で課金額の異常に気が付くことができます。
ただ、予算通知を設定していたとしても1分でテーブルを1000回叩くようなケースだと、通知が届く前に異常な課金が発生してしまうことになるので、そこには相変わらず注意が必要です。 ちなみに冒頭の例がまさにそれに該当しており、ジョブを流した数時間後には課金額が以下のようになっておりました。
Cloud Functionsを用いた課金上限の設定
厳しい予算制約の元で開発を行っているときには「予算上限を超えたら該当プロジェクトの使用を停止したい」というユースケースもあることでしょう。
そのような場合にはCloud Functionsを構成することによってプロジェクト単位で使用を停止することが可能です4。
もちろん「プロジェクト単位での使用停止」はかなり影響が大きいので、もう少し細かい粒度で管理したいこともあると思います。 そのような場合はCloud Functionsの中身を修正することで、細かいサービス単位での使用停止も制御することが可能です5。
例えば大きめのインスタンスを立てて長時間学習を回しておくような場合には、予算を超えてしまった場合にCompute Engineだけを落とし、ストレージやBigQueryのテーブルはそのままにしておくなどということもできるようになっています。
最後に
今回はGCPで意図せぬ課金を発生させてしまわないような事前の対策についてお伝えしました。 上記の対策をすべて行っていれば想定以上の課金は発生する可能性はかなり小さいのではと思います。
ただ、備えていてもいつ起こるかわからないのが事故というものです。 万が一が発生してしまった場合は一刻も早くすべてのAPIを止めてサポートに連絡しましょう6。
一緒に働きませんか?
当社では新卒・中途ともに様々な職種のエンジニアを募集しています。ご興味ある方は是非以下の採用ページをご覧ください。
-
https://cloud.google.com/skus/?currency=USD&filter=1DF5-1F98-1DD1&hl=ja ↩︎
-
https://cloud.google.com/billing/docs/how-to/notify#cap_disable_billing_to_stop_usage ↩︎
-
https://cloud.google.com/billing/docs/how-to/notify#selectively_control_usage ↩︎
-
https://cloud.google.com/support?hl=ja ちなみに私のケースでは日本語で対応していただけました。 ↩︎
人材領域のレコメンドシステムの改善を担当
羽鳥冬星
kaggleとスマブラSPが好きです