AWSの料金を見積もる

# はじめに
AWSの料金を見積もる機会があったのですが、
色々なサイトをぐるぐるしてしまったので使ったものはまとめておこうと思います。

算出したサービスは以下になります。
・EC2
・EBS
・S3
・Athena


それぞれについて見て行きます。

# EC2
EC2の料金算出には以下の情報が必要です。
・インスタンスタイプ
・インスタンスの購入方法

インスタンスタイプは、CPUに最適化されているC系、メモリに最適化されているM系、汎用なT系と区別されていて、
世代番号と、CPUコア数とメモリによるスペックの区分がある模様です。
「T2 Medium」「c4.large」とかがあるみたいです。
インスタンスの購入方法は以下の3つになります。

1.オンデマンド購入
2.リザーブドインスタンス
3.スポットインスタンス

購入方法毎に料金が変わるので、別途にみていきます。

#### オンデマンド購入
最もベーシックな購入方法です。
個人でやっている方などはこの買い方が多いかと思います。
特に事前作業はなしにインスタンスを立ち上げて、
使った分だけ課金されるタイプです。

下記ページを見てもらえれば指定した期間での料金を算出してくれます。

 [EC2Instances.info Easy Amazon EC2 Instance Comparison](https://www.ec2instances.info/?region=ap-northeast-1&cost_duration=monthly&reserved_term=yrTerm3Standard.partialUpfront)

#### リザーブドインスタンス
インスタンスを事前に購入する方法です。
事前購入なのでその分お安く使うことができます。
企業などで導入している場合はこの買い方が多いかもしれません。

ちなみに、リザーブドインスタンスの購入金額とか知らんわって方もいるかと思いますが、
AWSマネジメントコンソールのEC2のメニューからリザーブドインスタンスとして購入しているインスタンス一覧を見ることが可能です。
クリックをしてもらうとリザーブドインスタンスとして購入したものの一覧があるので、
該当のインスタンスをクリックすれば詳細タブ内に前払い価格が記載されています。


![2019-11-07_103148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/be29c52a-a688-22ae-3c52-7f3c5126e3bb.png)

なお、前払い価格は一定期限使用権を購入しているので、
月額料金などを算出する場合は、前払い価格から、購入台数と購入期間を割ってあげる必要があります。


#### スポットインスタンス
スポットインスタンスとは未使用のインスタンスを低額で使用できるものです。
ただし、EC2スポットサービスによって中断されることがあるので、
そういったリスクを許容できるサービスでのみ使用可能です。

なお、こちらの料金はスポット料金というものがあり、
今回の調査対象ではなかったので割愛します。


# EBS
EBSはストレージなので、ストレージのサイズから料金が決まります。
インスタンスに紐づくストレージを確認する場合、
以下のルートデバイス、ブロックデバイスをクリックします。
するとEBSIDが表示されるのでさらにクリックすることでEBSの詳細画面に遷移し、
サイズとボリュームタイプを確認することができます。

![2019-11-07_105202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/b3c115a5-2283-31ba-9aa7-d797d5d78031.png)


サイズを確認できたら、
以下のページから該当のボリュームタイプの1GBあたりの料金を調べ、
サイズとかけてあげればOKです。

 [Amazon EBS の料金](https://aws.amazon.com/jp/ebs/pricing/)

# S3
いくつか方法があるので、
ケースバイケースで使いわけが必要です。
基本は使用している総バイト数×S3の1GBあたりにかかる料金となります。
S3の1GBあたりにかかる料金は以下から確認が可能。

 [Amazon S3 の料金](https://aws.amazon.com/jp/s3/pricing/)

### GUIで出す場合（特定のバケットだけ算出した場合など）
該当バケットに入り算出したいディレクトリをクリック、
しばらくすると合計と各ディレクトリのサイズが算出されます。

![2019-11-07_110823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/c218ffc6-e81f-42d5-bb4b-eae76a7b180e.png)

### AWS CLIで算出する場合
以下の記事が参考になります。安定のクラスメソッドさん。

 [AWS CLIを使ってS3上にあるファイル数とファイルサイズの合計を取得する](https://dev.classmethod.jp/cloud/aws/aws-cli-count-s3-filesize/)

```bash

aws s3 ls s3://[バケット名]/[フォルダ名]/  --recursive --human --sum
```


### 定期的に料金監視する場合
CloudWatchで見られるそうです。
こちらも安定のクラスメソッドさん。

 [【新機能】S3のファイル数とバケットサイズがCloudWatchに追加されました](https://dev.classmethod.jp/cloud/s3-cloudwatch/)

CloudWatchにあるということはCLIでも取得できるということです。

lsでバケット一覧を取得してfor文を回し各容量を取得します。


```bash
#!/bin/sh

# デフォルトリージョンを指定
REGION="ap-northeast-1"

# 集計開始日時
start_time="2019-11-04T00:00:00Z"
# 集計終了日時
end_time="2019-11-04T23:59:59Z"
# 集計単位
period=86400 #1日

# アクセスキー等をexport
export AWS_ACCESS_KEY_ID="★アクセスキーを入れる★"
export AWS_SECRET_ACCESS_KEY="★シークレットキーを入れる★"
export AWS_DEFAULT_REGION=${REGION}

# バケット一覧を取得
bucket_name_list=(`aws s3 ls | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} //g'`)

# バケット名の配列でループ
for bucket_name in ${bucket_name_list[@]}
do

  # バケット指定で容量を取得
  bucket_size_info=`aws cloudwatch get-metric-statistics --region ${REGION} --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=${bucket_name} Name=StorageType,Value=StandardStorage --statistics Sum -
-start-time ${start_time} --end-time ${end_time} --period ${period}`

  # バケットの容量を取得
  bucket_size=`echo ${bucket_size_info} | jq -r '.Datapoints[].Sum'`

  # バケット名と使用量を表示
  echo "　　${bucket_name}：${bucket_size}"
done

```

なお、S3はグローバルだと思っていたのですが、
実はリージョン情報を持っているので、
東京以外のリージョンも含めてすべて算出となる場合は、

容量取得の前にリージョン情報を取得する必要があります。

```bash

# バケットのリージョン情報を取得
region_info=`aws s3api get-bucket-location --bucket ${bucket_name}`
# バケットのリージョン名を取得
region_name=`echo ${region_info} | jq -r '.LocationConstraint'`
```

# Athena
Athenaは1TBスキャン毎に料金がかかります。
 [Amazon Athena の料金](https://aws.amazon.com/jp/athena/pricing/)
そのため、スキャンしたTB数×上記料金という算出方法となります。

スキャンしたTB数ですが、
AWS CLIでquery-execution-idから参照することが可能です。

なお、query-execution-idは今回アプリケーションログから取得しました。
現状該当期間の全ヒストリーをCLIでごにょごにょするといったものはないようなので、
もしご存知の方がいれば教えて頂けますと幸いです。。

アプリケーションログからcatとgrepでID一覧をファイル化した後、
以下を実行しました。

```bash

#!bin/bash

for i in $(cat queryidList.txt); do
    scansize=`aws athena get-query-execution --query-execution-id ${i} | jq '.QueryExecution.Statistics.DataScannedInBytes'`
    echo ${scansize} >> scansize.txt
done
```
これでスキャンサイズ一覧が取得可能です。


# 終わりに
今回はメジャーサービスだけの算出でしたが、
その他のサービスも算出していきたいなと思います。
CLIなどでこんな情報も持ってるんだという点や、
このくらいの料金感覚なのかというのが知れてよかったです。