(^p^)ブログ

いろいろなことがかかれていきます 編入関連の質問はTwitter,@mast15yamachiにて

AWSでミスって45万の請求が来た話

この記事はmast Advent calendar

adventar.org

の24日目の記事です。

この聖なる日の前夜に,(追記:この日予定が入ったので記事の公開を前倒ししました)mast3編でもっともキラキラしてない男が記事を書きます。

 

 

 

 

自己紹介

名前:やまち

所属:mast15・3編、zeyo17、元某東京の私大生、機械・材料系専攻出身

特技:デスボイス

特徴:9mmのボーカルに似ている、これまで痛風を5回患っている、よわい(3編最弱

趣味:昼寝

将来仕事にしたいこと:昼寝

 

 

普段はPythonで自分の興味のある諸々をかたかたしたり、変態力の高い友人の妄想を形にするようなクソゲーゲーム作りを細々やってるヒキニートです。

 

今回のお話はタイトルの通り素人がAWSでミスを犯して身に覚えのない45万相当の請求を食らい、1週間ほど食事が喉を通らなかった話です。

*1

 

先に申し上げておきますが、

 

本記事でお話しする不幸は自分が馬鹿を幾つも重ねた結果であって、AWS 自体は怖くない、素晴らしいサービスだということは言っておきたいです。

 

本文中には多少ふざけた言葉選びが散見されるかもしれませんが、私は全力で AWSさんに感謝 をしております。

 

本記事をご覧になったmastのみなさんが今後クラウドサービスを使ったサービス開発をするときに、筆者と同じ轍を踏まないことを切に願っております。

 

また、筆者は極度のバカで豆腐メンタルのIT初心者です。

知識のある方にとっては「初心者ってここまで無知なもんか」と気分が悪くなる記事です。ご容赦ください。

 

AWSとは

aws.amazon.com

もうすでに知ってる人はたくさんいるかと思われますが、

AWSとは世界最大手のクラウドサービスであり、仮想マシン(EC2)やストレージ(S3)、データベース(AmazonRDS)をはじめとした幅広いサービスを提供しています。

 

AWSを使うことになった経緯

事の始まりは「なんかアプリつくろーぜ」的な流れに参加し、iosアプリケーションを開発することになったのがきっかけでした。

私はWinユーザーであるうえに、Swiftのことはさっぱりわからなかったので、

もっぱらサーバーサイドの開発に従事していました。(pythonです)

 

このアプリケーションは音声認識を必要としていて、

録音の機能が必須でした。

サーバーはherokuを使っていましたが、heroku単体では音ファイルのアップロードはできないということが判明し、

S3にクライアントからファイルを一回アップロードしてからそれを今度はheroku側で処理する、という方式をとっていました。

 

開発が行き詰まっていたところに、S3という救世主が現れたことによって

実装したい機能が実現し、喜んでいたのもつかの間、悲劇が起こりました。

 

 

AWSからの通知

朝起きたらこんなメールが届いていました。

f:id:yamatch:20171219220159p:plain

 

なんだこれ・・・英語できない私でも不幸のお知らせってことはわかるぞ・・・

要するに「おまえの垢、のっとられとるで」的な内容だろ。

 

 

 

「ま、またまたぁ~ご冗談を~(笑)」

とか笑い飛ばしながら、震える手で請求画面を見ると・・・

 

 

 

 

 

 

f:id:yamatch:20171219221012p:plain

 

 

 

 

いやいやいや、これ450円だろ?.5fとかいれてんだろ?とか思いつつも、点がふたつある小数なんて存在しないことに気づく。ああ・・・45万円か・・・

 

 

f:id:yamatch:20171219221012p:plain

しばし真顔の後、どうしてこうなったのかすぐに原因を究明すべく各所に回りました。

 

おかしいところを探した結果、今回のアプリケーションに必要のないEC2が、インスタンスを全リージョン全力で回されていたことがわかりました。*2

おそらく流行りのビットコインマイニングにでも使われたのでしょう。

 

どうやら起こったミスとしては

・クライアント側のメンバーのgithubにシークレットキーをそのままのっけたswiftコードをうpしてしまっていた(githubに誤ってうpされたシークレットキーをクローリングする悪い奴らがたくさんいます。うpしたら最期です。)

 

・シークレットキーが管理者権限アクセス可能なものとなっていた(外したつもりが外せてなかったっぽい)

 

 

その後の対処

まず、クライアント側のメンバーのGitHubリポジトリごと削除してもらいました。
そして、公開してしまったアクセスキーとシークレットキーを削除、

また、身に覚えのないEC2インスタンスの削除と、すべてのやるべきことを済ませ、

あとは全力でAWSサポートに返金要求という名の命乞い(もはや比喩ではない)をしました。

 

Let's 命乞い

すべての作業を済ませ、AWSサポート側にメールをします。

 

メールから抜粋

 Hello, AWS support

Thank you for giving me information. These work is already completed. (deleteing key, stopping EC2 instances,and so on.) And now,I've got $3,828 payment request, but I didn't use so much AWS resources. I'm so confused, Please contact me as soon as you find out about it.

 

(^p^)「なんか身に覚えのないものごっつい請求来て困っています、どうにかできませんか?」

 

AWSサポート「・・・」

 

(^p^)「おーいこの件どうなりました?」

 

AWSサポート「・・・」

 

(;^p^)「あの返事・・・」

 

AWSサポート「・・・」

 

こんな感じですぐに返信が来ず、非常に胃の痛い時間を過ごしました。

 

 

このままではらちが明かなかったので、サポートのプランをBasic($0、現地時間の営業時間のみしか対応できない)→Developer(月$30,24時間対応可)のプランにしました。

45万の請求来てるからこのくらいの課金なんていまさらどうってことありません。

 

 

そうしてすぐにサポートから返事をもらい、「基本的にこのようなケースでは支払い義務は発生するが、今回に限り特別に対処することも検討する」とのことで返信を頂きました。

 

すべての行程を終えたあとは支払い免除されることを祈るのみです。

このときのメンタルはまるでパトラッシュです。

 

 

「免除されなかったら情報系の仕事やるのやめてふつうのサラリーマンになろう」

「免除されなかったらどうやって金の当てをつけよう?友人に土下座して回るかな、いっそ闇金かな」

みたいな今思えばしょうもないことを考えていました。

 

そしてついに・・・

 

 

 

f:id:yamatch:20171220225714p:plain

「支払い免除リクエストを出しました。請求チームが動きます。」

請求書をみると・・・

f:id:yamatch:20171220231412p:plain

6593円、つまり・・・

 

無事45万円の支払いを免除していただきました。

 

もうAmazonに一生頭があがらないです。

安堵で思わず泣きました。

お忙しい中対応してくださったAWSサポートの担当者には本当に本当に感謝の気持ちでいっぱいです。

 

そして迷惑をかけたチームのメンバーには申し訳ない事をしたと思っております。

そんななかでも彼らは解決策を探してくれたりして、感謝感謝です。 

 

今後の対策

これからAWSを使うときは、同じ失敗をしないようにしなければいけません。

今回のようなミスを今後防ぐには

  • アクセスキーを発行するときは、AWSアカウントではなく、操作権限を絞ったIAMアカウントのものを発行する(要するに、特定のサービスのみを使えるようにする)、管理者権限は絶対につけない
  • Githubにシークレットキーをハードコーディングしたコードは絶対にうpしない、やむを得ずどうしてもうpしたいときはprivateリポジトリにあげる(awsが用意したgit-secretsなるプライベートキーをcommitさせないツールなんてものもあるらしいです)*3
  • AWSの請求アラート(ある金額になったり、無料枠を超えそうになったらメールで警告してくれる機能)は必ずつける
  • チームで開発するとき、何かアクションを起こすときはすぐに報告、まずそうなことがあったらまずチームメンバーに相談、そして解決策をとにかくググって調べる

 ということを徹底していきたいです。

 

今は無事S3を使って音声認識のシステムを無事使える状態にしてあります。

今後こういったことを守り、アプリケーションを使っていきたいです。

 

 終わりに

この記事を通して皆さんに何を伝えたいかというと、

「無知と油断は身を滅ぼす」ということです。

アクセスキーペアの重要性の話はコンピュータリテラシーやネットワーク、セキュリティの講義で耳にたこができるほど説明されます。

それにもかかわらず、アクセスキーがいかに大切なものなのかを知らずにいた「無知」、

そして「こうしとけば大丈夫やろ~」「まさか自分がそんな不正利用に遭うわけがない」という「油断」、

こうしたある種の傲りがあったからこそ、今回のような事件は起きてしまったのだと思います。

 

このようなしくじりを

起こしようがないようにする「知識の習得」、

起きそうなときにも踏みとどまってしくじりを防ぐ「細心さ」

が必要なのかな、と思いました。

 

今回運よくAWSサポートさんに助けていただきましたが、何度も同じ対応をしてくれることはありません。

次同じことを起こしたらおそらく自腹です。

 

失敗は起きたとしても1度に納めなければいけません。

2度同じ失敗を繰り返せばその時こそ身を滅ぼします。

 

と自戒も込めて皆さんには伝えたいです。

 

 

(;ω;)

ほかのmastの人がすごくためになる記事だったり、なにかに全力で取り組みその裏を見せる素晴らしい記事を書いている中、私はこういうクソみたいなしくじりしか書けないことが本当悔しいし、力不足を感じます。

 

自分は音の信号処理だったり音楽データに関するプログラミングだったりのことを勉強中なので、今後このようなmastの皆で記事を書くような機会があれば、音処理沼に引き込めるようなファビュラスな記事を書ければ、と思います。

 

では。

 

p.s

痛風の話はまたどこかでしたいと思います。

 

 

 

 

 

*1:このような話は何番煎じかわかりませんが書きます

*2:CPU64個、メモリ256GBのインスタンス(一番サイズが大きいやつ)が全リージョン合計200個ぐらい回ってて大草原だった

*3:ほかに何か対策があったら教えてほしいです。