CloudWatchでVyOSのカスタムメトリクスを取ってみた

CloudWatch

クラメソダー市田です。

最近、VyOSをよく利用するのですが、VyOSのカスタムメトリクスを取ることができないか検証してみたので、その方法をご紹介します。

取得方法

すぐに思いつく取得方法は次の2つかと思います。

  1. マニュアルの手順で取得
  2. AWS CLIで取得

今回はAWS CLIで取得する方法をご紹介します。こちらの方が楽です。
マニュアル通りの方法で取得することも可能ですが、以下の理由から採用しませんでした。

  • 必要なPerlモジュールなどを入れないといけないが、Debian用パッケージが入るようにしないといけないとかつらい。
  • aws-cliで取った方が楽。

IAM Roleの準備

インスタンスを作成する前に、CloudWatchにデータをputできるようにポリシーを作成します。
今回は、下記の内容にしました。

{
    "Version": "2012-10-17",
    "Statement": [
        {           
            "Sid": "Hoot24PutMetricData",
            "Effect": "Allow",
            "Action": [ 
                "cloudwatch:PutMetricData"
            ],
            "Resource": [ 
                "*" 
            ]
        } 
    ]
}

AWS CLIインストール

IAMの準備ができたらMarketplaceからVyOSのAMIを選択して、vyosのインスタンスを起動させます。先ほど作成したIAM Roleの指定を忘れないようにします。

VyOSにはvyos@IPアドレスでログインします。

$ ssh -i <秘密鍵> vyos@<VyOSのIPアドレス>

ログインできたら、AWSのドキュメントにあるコマンドを実行します。

# インストールスクリプトのダウンロードと実行
vyos@VyOS-AMI:~$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
vyos@VyOS-AMI:~$ sudo python get-pip.py

# pipでAWS CLIをインストール
vyos@VyOS-AMI:~$ sudo pip install awscli

AWS CLI のインストールと設定

これで/usr/local/bin/awsにインストールできました。

vyos@VyOS-AMI:~$ which aws
/usr/local/bin/aws

カスタムメトリクス用のスクリプトの設置

今回は、下記のようなスクリプト(memoryUsage.sh)でメモリー使用量を取ってみます。

#!/bin/bash

log() {
  echo $1 | logger -t cw-monitoring
}
usage=$(free | head -n 3 | tail -n 1 | awk '{a = $3/($3 + $4)*100; print a}')
instanceId=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
region=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')

cw_opts="--namespace CustomMetrics/VyOS"
cw_opts=${cw_opts}" --metric-name MemoryUtilization"
cw_opts=${cw_opts}" --dimensions InstanceId=${instanceId}"
cw_opts=${cw_opts}" --unit Percent"
cw_opts=${cw_opts}" --region ${region}"
cw_opts=${cw_opts}" --value ${usage}"

# wait for 0 - 15 seconds to disperse API request.
sleep $(($RANDOM % 15))

counter=0
MAX_RETRY=3

while :; do
  # Error Retry
  /usr/local/bin/aws cloudwatch put-metric-data ${cw_opts}
  if [ $? -ne 0 ]; then
    if [ "${counter}" -ge "${MAX_RETRY}" ]; then
      echo "failed"
      exit 1
    fi
  else
    break
  fi

  counter=$((counter + 1))
  sleep 10
done

exit 0

このスクリプトをcw-monというユーザでcronで実行します。(ユーザ名は任意です。)
まずはユーザを作成します。

vyos@VyOS-AMI:~$ sudo useradd cw-mon

次に、このスクリプトを適当な場所に設置します。
今回は、/opt/monitoring/memoryUsage.shにしました。

/opt/monitoringディレクトリは存在しないので作成します。

vyos@VyOS-AMI:~$ sudo mkdir /opt/monitoring

設置できたら権限とオーナーを修正します。

vyos@VyOS-AMI:~$ sudo chown cw-mon:cw-mon /opt/monitoring/memoryUsage.sh
vyos@VyOS-AMI:~$ sudo chmod 744 memoryUsage.sh

最後にcw-monユーザで先ほどのスクリプトをcronに登録します。
cw-monユーザにスイッチしてスクリプトを設置します。

vyos@VyOS-AMI:~$ sudo su cw-mon

なお、cronの編集エディタがデフォルトでnanoエディタですが、個人的に使いづらかったので、viに変更しています。

sh-4.1$ EDITOR=vi
sh-4.1$ export EDITOR

以下の内容でcronに登録します。

*/5 * * * * /opt/monitoring/memoryUsage.sh

これでCloudWatchを見ると、下記のように「CustomMetrics/VyOS」をプルダウンで選択できるようになっていると思います。
そこでメモリー利用量が取得できていれば成功です。

CloudWatcのグラフ

最後に

VyOSはDebianベースのソフトウェアルータなので簡単に取得できそうだなと思っていましたが、公式ドキュメントの内容でやろうとしてみると中々辛かったです。
今回の内容のようにVyOSでカスタムメトリクスを取るときは、AWS CLIで取得することをお勧めします。

以上になります。