【小ネタ】CloudWatch Logsの料金が高かったのでAWS CLIを使って調査した話

2016.12.29

西澤です。CloudWatch Logsは非常に便利で強力なサービスですが、ログ量が多くなる場合は課金に注意が必要です。今回AWS CLIで調査する機会があったので、その際の対応について簡単にまとめておきます。

CloudWatch Logsの料金(おさらい)

2020年2月時点での東京リージョンでのCloudWatch Logsの利用料金は以下のとおりです。

バージニアリージョンの料金が記載されているとの指摘を受けまして、下記料金を東京リージョンの最新の料金情報に合わせて訂正いたしました。大変申し訳ありません。

  • $0.76 : 取り込み GB あたり
  • $0.033 : GB あたりのアーカイブ/月

料金 - AWS CloudWatch | AWS

エクスポート時のデータ転送料金は置いておくと、"アーカイブ"の方はS3料金と大差がありませんが、問題となるのは"取り込みGBあたり"のところです。これが若干割高となっていますので、ログ量が多い場合に注意が必要です。

AWS CLIでLogGroupあたりの取り込みサイズを確認した

今回はこんなbashスクリプトを用意して調べてみました。CloudWatchの情報を取得する際の日付指定がいつも調べなければわからなかったので、Mac用とLinux用とdateコマンドをどちらも使えるようにしたのと、--statistics "Sum"にして、1日分をまとめつつ日付順にソートするあたりをAWS CLIを駆使して工夫しました。

#!/bin/bash
### AWS認証情報は設定済の前提
### 何日分遡って確認するかを指定
DAYSAGO=3

### MacかLinuxかの判定
if [ "$(uname)" == 'Darwin' ]; then
OS='Mac'
elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
OS='Linux'
else
echo "Your platform ($(uname -a)) is not supported."
exit 1
fi

### LogGroupの一覧を取得
LOG_GROUPS=$(aws cloudwatch list-metrics \
--namespace "AWS/Logs" \
--metric-name "IncomingLogEvents" \
--query "Metrics[].Dimensions[?Name==\`LogGroupName\`].Value" \
--output text)

### LogGroup単位で前日分からDAYSAGOに指定した日数だけ処理する
for LOG_GROUP in ${LOG_GROUPS}
do
ENDDAY=0
STARTDAY=$((ENDDAY+${DAYSAGO}))

### MacとLinuxでdateコマンドのオプションを指定
if [ "${OS}" == "Mac" ]; then
STARTTIME="$(date -u -v-${STARTDAY}d +%Y-%m-%dT00:00:00Z)"
ENDTIME="$(date -u -v-${ENDDAY}d +%Y-%m-%dT00:00:00Z)"
else
STARTTIME="$(date -u --date "${STARTDAY} days ago" +%Y-%m-%dT00:00:00Z)"
ENDTIME="$(date -u --date "${ENDDAY} days ago" +%Y-%m-%dT00:00:00Z)"
fi

### LogGroupごとに1日分のIncomingBytesの合計を出力
echo "### LogGroup: ${LOG_GROUP} ###"
aws cloudwatch get-metric-statistics \
--namespace "AWS/Logs" \
--dimensions Name=LogGroupName,Value="${LOG_GROUP}" \
--metric-name "IncomingBytes" \
--statistics "Sum" \
--start-time "${STARTTIME}" \
--end-time "${ENDTIME}" \
--period 86400 \
--query "reverse(sort_by(Datapoints,&Timestamp)[?Sum>\`0\`].{Sum:Sum,Timestamp:Timestamp})" \
--output text
done
  • 出力サンプル
$ ./get_cloudwatch_logs_incomingbytes_sum.sh
### LogGroup: LogGroupNameA ###
342.0 2016-12-28T00:00:00Z
342.0 2016-12-27T00:00:00Z
343.0 2016-12-26T00:00:00Z
### LogGroup: LogGroupNameB ###
2586.0 2016-12-28T00:00:00Z
2586.0 2016-12-27T00:00:00Z
2586.0 2016-12-26T00:00:00Z
### LogGroup: LogGroupNameC ###
179374.0 2016-12-28T00:00:00Z
196992.0 2016-12-27T00:00:00Z
171424.0 2016-12-26T00:00:00Z

まとめ

CloudWatchの情報をAWS CLIから取得する時に、毎度調べながらやっている状況だったので、未来の自分の為にまとめてみました。もちろんAWS Management Consoleでも参照はできるんですが、データとして情報をまとめて欲しいときは、コマンドラインから情報を取得したいですよね。

特に目を引くようなトピックでなくても、休みの空いた時間を使って記録ををブログにしていきますよ。どこかの誰かのお役に立てば嬉しいです。