CloudWatch のメトリクスをダウンロードするスクリプト

AWS CLI で CloudWatch のメトリクスを取得できるけど、 過去 2 週間までしかさかのぼれないみたいだ。 2 週間よりも前のメトリクスを見たくなったときに備えて、 あらかじめダウンロードしておく必要があるな。

そういうわけで、1 日分のメトリクスをダウンロードする bash スクリプトを書いてみた。 このスクリプトを cron で毎日実行してローカルに保存しておく。

# ログの出力先
# メトリクスもこの下にダウンロードする
logdir=/var/log/your_app_name/perform/
today=`date -u +%Y/%m/%d`
logfile=${logdir}cloudwatch.log

# aws コマンドに渡すパラメータ
namespace=AWS/RDS
statistics=Average
starttime=`date -u -d '1 days ago' +%Y-%m-%dT%TZ`
endtime=`date -u +%Y-%m-%dT%TZ`
metrics="CPUUtilization DatabaseConnections FreeStorageSpace FreeableMemory ReadIOPS WriteIOPS ReadLatency WriteLatency DiskQueueDepth NetworkTransmitThroughput NetworkReceiveThroughput"

# ログ出力
function write_log() {
  echo -e "`date -u +%Y-%m-%dT%TZ` ${1}\r\n" >> ${logfile}
}

# CloudWatch のメトリクスをダウンロード
function download_metrics() {
  instance_id=${1}

  # ログフォルダが無ければ作る
  instance_logdir=${logdir}${instance_id}/${today}
  [ ! -d ${instance_logdir} ] && mkdir -p ${instance_logdir}

  for metric in $metrics; do
    write_log "${instance_id}/${metric} を取得"
    aws cloudwatch get-metric-statistics \
      --namespace ${namespace} \
      --dimensions Name=DBInstanceIdentifier,Value=${instance_id} \
      --metric-name ${metric} \
      --statistics ${statistics} \
      --start-time ${starttime} \
      --end-time ${endtime} \
      --period 300 > ${instance_logdir}/${metric}.json
    done
}

# RDS インスタンス取得
ids=`aws rds describe-db-instances | jq -r '.DBInstances[].DBInstanceIdentifier' | perl -pe 's/\r\n/ /g'`
for id in ${ids}; do
  download_metrics ${id}
done