【AWS】CloudWatch で、EC2 上にある プロセスを監視することを考える

 ■ はじめに

 EC2(OS:CentOS7)内のウィルスソフトのプロセスを Amazon CloudWatch で監視したい。
調べてみると、以下の「当初調べてみたサイト」が見つかった。

 しかし、よくよく調べてみると、
「mon-put-data」などの「Amazon CloudWatch Command Line Interface」は、
2017/11/07からサポートが終了しているらしい。
(以下の公式サイト「Amazon CloudWatch Command Line Interface」を参照)

という訳で、別の方法を考えてみた。

当初調べてみたサイト

http://hiratake55.hatenadiary.jp/entry/20130127/1359301757
http://higehiki.hateblo.jp/entry/2014/04/21/175223
http://toatoshi.hatenablog.com/entry/2013/06/13/192824
 公式サイト「Amazon CloudWatch Command Line Interface」
https://docs.aws.amazon.com/AmazonCloudWatch/latest/cli/CLIReference.html

より抜粋 
As of November 7, 2017, we are no longer supporting this CloudWatch command line interface
 with new functionality and it is no longer available for download.

 ■ CloudWatchに関する基礎知識

 * 調査前に前提知識として、CloudWatchの基本概念を学ぶ
 * 詳しくは、以下のサイトを参照のこと。

https://dev.classmethod.jp/cloud/amazon-cloudwatch-keywords/

 メトリクス(Metrics)

 * 時間ごとのデータ集合を表す

 ネームスペース(Namespaces)

 * 複数のメトリクスをまとめてコンテナ(箱)で管理する概念

 ユニット(Units)

 * 単位

Seconds,Microseconds,Milliseconds
Bytes,Kilobytes,Megabytes,Gigabytes,Terabytes
Bytes/Second etc
Bits,Kilobits,Megabits,Gigabits,Terabits
Bits/Second etc
Percent
Count,Count/Second
None

 ■ 実現方法を考える

 * 「AWS CLI」の「CloudWatch Metrics API : put-metric-data」で実現する

 公式サイト

CloudWatch Metrics API「put-metric-data」
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html

Publishes metric data points to Amazon CloudWatch.
CloudWatch associates the data points with the specified metric.
If the specified metric does not exist, CloudWatch creates the metric.
When CloudWatch creates a metric, it can take up to fifteen minutes
 for the metric to appear in calls to list-metrics .

【直訳】
メトリックスデータをAmazon CloudWatchに発行します
CloudWatchは、そのデータと特定のメトリックスを関連付けます
もし、特定のメトリックスが存在しない場合、CloudWatch はそのメトリックスを作成します。
CloudWatch がメトリックスを作成した時、そのメトリックスがメトリックス一覧に表示するまでに
15分以下掛かります。

一覧
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/index.html#cli-aws-cloudwatch

 ■ 環境構築

【1】 IAM ユーザ作成
【2】 AWS CLI のインストール
【3】 Cloud Watch に転送するスクリプトを設定
【4】 スクリプトの定期実行
【5】 マネジメントコンソールから確認

設定環境

 * OS : CentOS7

 【1】 IAM ユーザ作成

[1-1] AWSログイン後に [IAM]-[ユーザー]-[ユーザーを追加]を選択
[1-2] 「ユーザーを追加」で以下を入力すると、「次のステップ:アクセス権限」ボタン押下
 + ユーザー名:任意のユーザー名
 + アクセス種類:「プログラムによるアクセス」にチェック入れる
[1-3] IAMユーザー名のアクセス権限において、
      「CloudWatchFullAccess」にチェックを入れ、「次のステップ:確認」ボタン押下
[1-4] 「ユーザーの作成」ボタン押下
[1-5] 「表示」リンク押下で「アクセスキーID」「シークレットアクセスキー」を
       コピーしたりして取っておき、「閉じる」ボタン押下(後で使う)

 【2】 AWS CLI のインストール

http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

[2-0] AWS CLI がインストールされているか確認(コマンドが受け付けたらアンインストール)
~~~~~
aws --version

sudo yum remove -y aws-cli
~~~~~

[2-1] pip のインストール
~~~~~
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
~~~~~

[2-2] pip を使用して AWS CLI をインストール 
~~~~~
sudo pip install awscli

# 確認
aws --version
~~~~~

[2-3] AWS CLI設定
~~~~~
sudo aws configure

AWS Access Key ID [None]: 【AWS アクセスキー ID】
AWS Secret Access Key [None]: 【AWS シークレットアクセスキー】
Default region name [None]: ap-northeast-1
Default output format [None]: json
~~~~~

[2-4] CloudWatch Metrics APIの「list-metrics」を実行
~~~~~
sudo aws cloudwatch list-metrics
~~~~~

 【3】 Cloud Watch に転送するスクリプトを設定

[3-1] Cloud Watch に転送するスクリプトを設定する
~~~~~
sudo mkdir -p /opt/aws/cloudwatch

sudo vi /opt/aws/cloudwatch/cloudwatch_for_virusscan.sh
# 内容は、以下『CloudWatch に送信するシェル・スクリプト[cloudwatch_for_virusscan.sh」』を参照

sudo chown root:root /opt/aws/cloudwatch/cloudwatch_for_virusscan.sh
sudo chmod 755 /opt/aws/cloudwatch/cloudwatch_for_virusscan.sh
~~~~~

[3-2] スクリプトを直接実行し、エラーにならないことを確認
~~~~~
sudo /opt/aws/cloudwatch/cloudwatch_for_virusscan.sh
~~~~~
CloudWatch に送信するシェル・スクリプト[cloudwatch_for_virusscan.sh」 
#!/bin/bash

# 値を設定
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%S.000Z)
PROCESS_NAME="clamav"
METRIC_NAME="ProcessNumberOf${PROCESS_NAME}"
HOST_NAME=$(hostname)
NAMESPACE="Sample/Ec2/${PROCESS_NAME}"
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
DIMENSIONS="Hostname=${HOST_NAME},InstanceId=${INSTANCE_ID}"
VALUE=$(ps aux | grep -v grep | grep -v "$0" | grep ${PROCESS_NAME} | wc -l)
UNIT="Count"
REGION="ap-northeast-1"

# for debug
echo "TIMESTAMP : ${TIMESTAMP}"
echo "PROCESS_NAME : ${PROCESS_NAME}"
echo "METRIC_NAME : ${METRIC_NAME}"
echo "HOST_NAME : ${HOST_NAME}"
echo "NAMESPACE : ${NAMESPACE}"
echo "INSTANCE_ID : ${INSTANCE_ID}"
echo "DIMENSIONS : ${DIMENSIONS}"
echo "VALUE : ${VALUE}"
echo "UNIT : ${UNIT}"
echo "REGION : ${REGION}"

# 通知
aws cloudwatch put-metric-data --metric-name "${METRIC_NAME}" --namespace "${NAMESPACE}" --dimensions "${DIMENSIONS}" --value "${VALUE}" --unit "${UNIT}" --region "${REGION}" --timestamp "${TIMESTAMP}"

 【4】 スクリプトの定期実行

[4-1] 作成したスクリプトを crontab に登録し、定期実行する( 5 分ごとにスクリプトを実行)

sudo crontab -u root -e
~~~~~
*/5 * * * * /opt/aws/cloudwatch/cloudwatch_for_virusscan.sh >> /var/log/cloudwatch_for_virusscan.log 2>&1
~~~~~

 【5】 マネジメントコンソールから確認

[5-1] AWS Management Console で送信されたアラートを Web 上から確認

 ■ 補足

 プロセスをカウントするコマンド

ps aux | grep -v grep | grep 【対象プロセス名(ex. clamav, httpd)】 | wc -l

スクリプト内でプロセス名が正確にわかっている場合(「grep -v "$0"」「grep -w」 を利用する)

ps aux | grep -v grep | grep -v "$0" | grep -w 【対象プロセス名(ex. clamav, httpd)】 | wc -l

 カスタムメトリックスの削除
http://stackoverflow.com/questions/23229268/how-do-you-delete-an-aws-cloudwatch-metric

だと、明示的に削除する方法はないらしく、2週間放置するしかないとか。

 アラームの作成・削除

 * 以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2018/02/13/234005

 参考文献

https://www.magtranetwork.com/aws/amazon_cloudwatch_output_custom_metrics.html
https://qiita.com/na0AaooQ/items/9dc3649e0bf4b0193ef9
https://qiita.com/yiida-tempus/items/dce022689f5f11ecebcc
https://siguniang.wordpress.com/2014/12/19/publish-custom-metrics-to-cloudwatch-with-awscli/
https://qiita.com/cs_sonar/items/c2f7435ad0057f660eaa

関連記事

CloudWatch で、EC2 上にある プロセスのアラームを作成する
https://dk521123.hatenablog.com/entry/2018/02/13/234005