Google Maps APIで50万以上使っていた話

この記事は [Wano Group Advent Calendar 2019](https://qiita.com/advent-calendar/2019/wano-group) の7目の記事となります。

アドベントカレンダーに「なにか」書くといって7日を予約していたんですが、特にネタを考えてなかったら、前日にネタが降ってきたという話です。

※後日談を追加しました(2019/12/15)

## 始まりは経理担当者のSさんの指摘

ちょうど昨日(12/06)のことです。経理担当者のSさんに「Google Cloud Service から38,653円がクレジットカードの明細にあるのですが、証憑がないんですが…」と相談を受けました。月初は会社に対する請求の確認作業があり、請求書がない引き落としとかは問題になりますので、たまに確認されることがあります。

新しくサービスを開始する際に、AWSやGCPとか有料サービスのアカウントを新しく作る必要があったりすると、そんなことが起きたりします。要は経理担当にメールが届くように設定し忘れたりするなど、たいていはしょうもない理由です。

なんか、新しくGoogleのAPIとか使ったけかなぁ…あんまり覚えてないなぁ…。と、この時は、まぁ、たまにあることだよね、と気軽に思っていました。

しかし、Gmailで「after:2019/11/01 before:2019/11/02 Google invoice」と検索しますが、該当の金額のものが見つからない。しばらくいろいろと探しましたが全然見つからない。

## Googleに問い合わせる

途方にくれていましたが、課金に関する問い合わせがチャットでできることに気付き、チャットで聞いてみることにしました。
英語のみなのですが、以下、適当に日本語に直しています。時々担当者が日本語を混ぜてきましたので、その部分だけ太字にしてます。

ktat: 38,653円の請求がGoogle Cloud Serviceからきているのですが、情報を教えてくれますか？
担当者: しばらくお待ちください
ktat: カード番号下4桁とか教えたほうが良い？
担当者: **ありがとうございます**。後で聞くので大丈夫です。
担当者: 支払い情報をテンプレートに従って埋めてください
ktat: カード番号の下4桁とか名義人とかの情報を渡す
担当者: しばらくお待ちください
担当者: 見つかりました。GCPから該当の請求がありますが、あなたのアカウントではないです。
担当者：不正請求の連絡をするならこちらから。また、該当の管理アカウントにメールを送ります。
ktat: そのアカウントって、うちのドメインですかね？
担当者: **すみません**。該当のアカウントの情報はお伝えできません。

まぁ、当然のように何も教えてくれない。仕方がないので、一時的に会社のドメインに届くメールを自分にも送られるようにGsuiteで設定して、メールが届くのをしばらく待ちましたが、来ない。

ktat: メール送りました？
担当者: 送りました。
ktat: あー。うちのドメインじゃないようです。もうちょっと調べますね。ありがとうございました。
担当者: 他に何かありますか？
ktat: ないです。ありがとう。
担当者: **すごい**。また、何かありましたら、ご連絡ください。

という感じで、いったん終了。

しかし、「ありがとう」「すみません」は、わかるんですが、最後に、「すごい」って、言ってたのは、今思えば「Great」だろうか。突っ込んであげればよかった。

## まさか不正利用？

いや、しかし、そもそも、最近AWSは使ってるけど、Google系を新たに使ってないよな...と、うーんと、再度自問自答するものの、わからず。

メールに見つからないし、会社のドメインのメールでも登録されていない。まさか不正利用だろうか。にしては、額が少なすぎるし…。でもなぁ…。と、嫌な考えがめぐります。

## Google Drive を探す

ダメ元で、Google Drive で「gmail」と検索してみると、いくつかのスプレッドシートが見つかり、Google Maps API用のアカウント一覧みたいなのが見つかりました。

お客さんように複数のサイトがあり、その地図表示をするのにお客さん毎にAPIのアカウントは各それぞれでわけていました。そのアカウントの一覧をまとめていたスプレッドシートが見つかりました。

## 見つかった異常なグラフ

んー。3万も課金されるほどのMapのビューとかあったのかなぁ…。ないだろう…と思いつつも、念のため一つ一つチェックしていきました。

そして、最後のアカウントの支払い情報を確認していると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11040/88145fce-b510-0480-641a-9ca04e690777.png)


**「…ん？」**
**「50万？いやいや...そんなわけ…」**
**「見間違いじゃない…よね…？」**

と、何度か見なおしたもののどう見ても、50万オーバーしているのは一目瞭然です。
一目瞭然にもかかわらず、何度も見直してしまう、人間の悲しい性ですね。

動揺しつつも、とりあえず内訳を確認すると…、Geocoding APIがやたらたたかれている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11040/71ca4849-1f44-a000-f882-d10e5d93c281.png)

**1230002回**で**546,955円**。

うん、明らかにたたきすぎだね。

うん。3万どころじゃなかった。3万こえていたのは10月分で、10月後半から始まっていたのでそんなもので済んでたという話でした。11月は1ヶ月まるっと使っているので、こんな感じになってしまっていました。

## ようやく思い出す

ここに至って、そういやこないだリリースした機能でGeocoding API使ってたなぁ…、同じサービスでGoogle Maps API使ってたから、APIキーは同じのを使ってたはずだなぁ…と思い出す。

そして、コードを確認すると、住所が変更された場合にのみたたくようなチェックがされていない…。
そして、そのコードはcronに15分に1回実行されるように設定されており、1回で、数百回たたいている...。

あれ、チェックするように言ってなかったけな...。まぁ、コードレビューしてない僕が悪いな…。などといったことが頭によぎりました。

## 反省

しかし、巷で○○万溶かしたとか、他人事だと思ってたんですが、まさか自分事になるとは思ってませんでした。
というわけで、以下、反省点。

* コードレビューちゃんとしましょう。特に課金のかかわるところは。
* APIキーとったアカウントのメールは、普段チェックするメールに転送をかけておこう(Gmailの転送設定)
* APIの課金アラートを設定しておこう(コンソールから可能)

## この程度で済んでよかった

これ、気づかなかったら、100万とか150万とかどんどん課金され続けていたので、1ヶ月で気づけて良かったと前向きに考えておきます。

**Sさん本当にありがとう！！**

## ダメ元でお願いしてみる

なお、100%こちらが悪いのですが、ダメ元で減額してくれないかなぁと思って、Googleに問い合わせたところ、返事がきました。今までの使用頻度と著しく違うことは認識してくれたようで、より詳細な情報をくれといわれています。

これから返事を書きますが、どうなったかは後日書き足すかもしれません。

それでは、皆さんも課金のかかわるAPIにはお気を付けくださいませ。

## 後日談: サポートとのやり取り

後日談として、サポートとのやり取りについて簡単に記します。

### サポートからの質問

サポートから、下記の事項を質問されました。なお、やりとりは英語になります。

* Q1. 影響のあるプロジェクト
    * A. プロジェクトID
* Q2. 関係のある期間
    * A. APIを叩きまくっていた期間を報告
* Q3. どのAPIか
    * A. Geocoding API 
* Q4. バグの説明(該当部分のコードを含む)
    * A. 同じ住所について叩くべきではないけど、叩いてしまった。
    * 15分に1回という高頻度で叩いてしまっていたこと。
    * 実際のコードを貼り付け
* Q5. 誤ったリクエストの例
    * A. コードに含まれると回答
* Q6. DBやキャッシュを使わなかったことの確認
    * A. Q4の内容に加えて、DBに保存していたが、変更があったかなどのチェックを行わなかったということを説明。
* Q7. とりあえずの修正の内容
    * A. 一旦cronを停止したことと、今後は住所をチェックして、変更がない場合は叩かないようにすることを記載

### サポートからの返答

どうも、理解を示してクれた雰囲気がでており、追加の質問として、Geododedされたユニークなアドレス数を聞かれたので、返答しました。

### 最終的な返答

まさかの全額、返金されました。

マジか。

**Googleさーーーん、ありがとーーー!!!**

と、返事をしたかったが、チケットはCloseされていたので、返信はできなかった...。

みなさんも、自分の過失の場合でも、減免される可能性があるので、一度聞いてみても良いかもしれませんよ。

いや、ほんと、まじで良かったです。