RDSのデータ転送料金と時間帯ごとのデータ転送量を正確に把握する

# 概要

以下の調査作業をしたときの控えです。データ転送料金の内訳を把握するのはかなり面倒なのでもう少し簡単にしたい。。。

- （問題発生）AWS請求を参照したら想定外の data transfer 料金が発生していた
- （発生源調査）Cost Explorerを参照してどのAWSサービスで発生しているか？を調査したところRDSのデータ転送でした
- （詳細把握）当該サービスのReportをCSV形式で取得して1時間ごとの転送量を把握しました。
- （原因調査・対処）詳細データを元に仮説をたて、HTTPサーバのアクセスログ等を調査して原因を特定＆対処

# 問題発生

あるアカウントで想定外の data transfer 料金が発生していました。詳細をみたら ```data transfer out beyond the global free tier``` という課金が発生していました。データ量は約1週間で17GB。先月までは1ヶ月で4GBくらいでしたが、そんなに増える心当たりがありません。

![](https://i.gyazo.com/cecd018b2e86c11f03fd3fd78bc865f7.png)
![](https://i.gyazo.com/49d7d8131f7a989527042ad0e501d382.png)

# 発生源調査

請求を見ただけではどのAWSサービスで発生しているのかがわからないので調査します。（これがドリルダウンで簡単に特定できればいいのですが・・・）
アプローチは様々だと思いますが、Cost Explorerを見てみました。
するとRDS料金が高くなっています。RDSインスタンスはリザーブド（全前払い）で本来は請求されないのでどうやらRDSのデータ転送が膨らんでいるようです。
金額は大したことないのですが気持ちが悪い（例えば乗っ取り被害にあっていたら莫大な請求が発生する可能性）ので緊急調査を行いました。

![](https://i.gyazo.com/b1109ae27bcbae5679eae787b28edce9.png)

# 詳細把握

課金対象はRDSのデータ転送と特定できてましたが、このRDSは私の自宅とWebサービスをホスティングしているサーバからしかアクセスできず、さらに主要なアクセス元であるサーバは同一アベイラビリティーゾーン内にあるEC2なので課金されません。何が原因なのかわかりません。。。

[料金 - Amazon RDS for MySQL | AWS](https://aws.amazon.com/jp/rds/mysql/pricing/)より抜粋
> Amazon RDS と Amazon EC2 のインスタンス間のデータ転送は、同一アベイラビリティーゾーン内であれば無料です。

そこで、「いつ？どれくらい？」を把握するために、Reportを取得しました。

## RDSのReport取得


[Billing Management Console](https://console.aws.amazon.com/billing/home#/)のメニューから```Report```を選択して、Other Reportsに表示された**AWS Usage Report**を選択するとレポートの読み込み待ちになるのでしばらく待ちます。

![](https://i.gyazo.com/53022cb3d35c6db84d5eef623796e872.png)

**しばらく待ちます（30秒くらい）**
![](https://i.gyazo.com/e3ed39f37049528781b9efab993747ce.png)

## レポーティング対象サービスを選択

![](https://i.gyazo.com/4f744664bbf8646f8e4316053d95b836.png)

## 取得条件を選択
期間は「今回の請求」、レポートの粒度は１時間を選択しました。（他には日と月が選択可能）
取得したい形式（xml or CSV)でダウンロードします。今回はCSVダウンロードしました。
![](https://i.gyazo.com/6d86854fd1e91407fafe9367826bfc19.png)

## Excelに取り込み
CSV形式なのでそのままExcelで開くこともできるのですが、この場合、以下の問題があります。

- レポートの日付が MM/dd/yy形式なので、Excelが日付を間違えて認識する。
- 例えば2018年11月9日は、11/09/18となっておりExcelは2011年9月18日と認識してしまう

これを回避するために以下の手順を踏みます。

- ダウンロードしたファイルの拡張子をtxtに変更
- Excelで開く
- 取り込みウィザードの「データ形式」の選択で、日付フィールドを文字列として指定する。

![](https://i.gyazo.com/ea8596a45a868627a434e3d3d42f47b0.png)
![](https://i.gyazo.com/33c776d8a03c72c7a89a52af425283a8.png)
### 日時フィールドを文字列として指定
これで完了です。
![](https://i.gyazo.com/b64d9a9bd436b08b31273681529208fc.png)

## 課金対象のデータ転送データのみ参照する

今回、問題になっている```data transfer out beyond the global free tier```は、UsageType列で以下の名称として記載されているので、Excelのフィルターで絞り込みます。これで問題のデータ転送が「いつ？どれくらい？」発生したのか把握できます。

```
<リージョン略称>-DataTransfer-Out-Bytes
```
例）APN1-DataTransfer-Out-Bytes

![](https://i.gyazo.com/e38f5a410ab5929b61a365c2e072509c.png)
![](https://i.gyazo.com/c250ed179b69e891278a047935eccfde.png)

なお、このデータをグラフ化したものと同じ形のものは、RDSインスタンスのコンソールで確認できます。（コンソールでは、いつ？はわかりますが、どれくらいの転送量であるかを把握できません）

![](https://i.gyazo.com/70783863f98d653b4f4b977d62b60533.png)

Excelでグラフ化したものと同じ形になっているのがわかります。
![](https://i.gyazo.com/4d4b25170696a04a7a2cec07b6a29057.png)

# 原因調査・対処

いつ、どのくらい？はレポートでわかるのですが、どこからのリクエストで？というのはわからないので、ここからは仮説をたててWebサーバのアクセスログなどで調査しました。

結局、今回は、AWSでないサーバでホスティングしているWebサイトのデータベースを深く考えずにRDSに配置したのが原因でした。
そのWebサイトにBotが大量アクセスしてきて転送量が膨らんでいました。（データベースをローカルに構築して対処）

RDSを使うWebサービス・サイトをAWS以外のサーバでホスティングするときは慎重に・・・。汗

ご参考になれば幸いです。