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

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

CloudWatch Logsの料金(おさらい)

執筆(2016年12月)時点での東京リージョンでのCloudWatch Logsの利用料金は以下のとおりです。

  • $0.50 : 取り込み GB あたり
  • $0.03 : 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でも参照はできるんですが、データとして情報をまとめて欲しいときは、コマンドラインから情報を取得したいですよね。

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