CloudWatch からダウンロードしておいたメトリクスを S3 にアップロード

過去 2 週間分しか取得できない CloudWatch のメトリクスを、 毎日ダウンロードするようにスクリプトを書いた。

tnakamura.hatenablog.com

このメトリクスはいずれツールを使って分析に使いたいので、 ローカルにだけ保存しておくのは心もとない。 念のためバックアップしておきたい。

というわけで、S3 にアップロードするスクリプトも書いたのでメモしておく。

# ログの出力先
# メトリクスもこの下に保存されている
logdir=/var/log/your_app_name/perform
today=`date -u +%Y/%m/%d`
logfile=${logdir}/cloudwatch.log

# アップロード先のバケット
bucket=your_bucket_name

# アップロードするメトリクス
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}
}

# メトリクスをアップロード
function upload_metrics() {
  instance_id=${1}

  for metric in $metrics; do
    metric_file=${logdir}/${instance_id}/${today}/${metric}.json
    upload_url=s3://${bucket}/performlogs/${instance_id}/${metric}/${today}/${metric}.json

    if [ -f ${metric_file} ]; then
      write_log "${metric_file}  S3 にアップロードします。"

      # S3 にアップロード
      aws s3 cp ${metric_file} ${upload_url}

      write_log "${upload_url} にアップロードしました。"
    fi
  done
}

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