こんにちは。村主です。

前回(↓)の記事の反響が多かったので、少し掘りげて技術的なところを書きます。

muranonushi.hatenablog.jp

今回の趣旨

前回の「内部の見える化のための、リソース系の情報取得」を実装する。

リソース系の情報をCloudWatchにPutしてみよう

1. EC2作成

EC2作成手順はあちこちにあるのでGoogle先生に聞いてください。
注意点は、EC2作成時にIAMロールを付与してください。

2. IAMロール割り当て

EC2作成時に割り当てるIAMロールのポリシーは以下でOKです。

IAMロールを割り当ててないEC2で行う場合は、IAMを発行の上で
アクセスキー・シークレットキーを発行し、ポリシー付与などの対応ください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1449132764000",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:PutMetricData"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
3. サンプルスクリプトの実行

cloudwatchへ送信するためのサンプルスクリプトを用意しました。
サンプルスクリプトに以下の引数を渡すことで動きます。

このスクリプトcronで5分置きなどで実行すると、
cloudwatchの[カスタムメトリックス]という項目にメトリクスが飛んでいきます。

サンプルスクリプト
#!/bin/sh

# default
INSTANCEID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%S.000Z)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')

# metrics
while getopts n:m:c: opt
do
   case ${opt} in
    n)
        NAMESPACE=${OPTARG};;
    m)
        METRICNAME=${OPTARG};;
    c)
        COMMAND=$(eval ${OPTARG});;
    *)
  exit 1;;
  esac
done

# put metrics
aws cloudwatch put-metric-data --dimensions InstanceId=$INSTANCEID --timestamp $TIMESTAMP --region $REGION --namespace $NAMESPACE --metric-name $METRICNAME  --value $COMMAND --unit Count
実行例
./metric-put.sh -n process -m process_httpd -c "ps aux|grep [h]ttpd |wc -l"
使い方
オプション 使い方
-n 名前グループを付けてください process
-m メトリックの名前を付けてください process_httpd
-c ここにコマンドを記載ください。数値のみ扱えます。 ps aux | grep [h]ttpd | wc -l
スクリプトの説明
# default awsコマンドを実行するために必要な情報を取得(インスタンスID、タイムスタンプ、リージョン情報)
# option 引数に渡すためのオプション定義
# put metrics awsコマンドでcloudwatchにメトリクス送信

上記はApacheのプロセス数でしたが、もちろん以下のような色々な値を取ることができるので、思いついたものを記載します。
(数値化出来るものはcloudwatchに送信することが可能です。)

その他サンプル
  • sshプロセスの有無
./metric-put.sh -n process -m process_sshd -c "ps aux|grep [s]shd |wc -l"
  • sshログインユーザ数
./metric-put.sh -n sshd -m user_count -c "w -h |wc -l"
  • 特定ファイルの有無(有れば0、無ければ1)
./metric-put.sh -n file -m file_check_index.html -c "test -f /var/www/html/index.html ;echo $?"
  • 特定ディレクトリの容量
./metric-put.sh -n directory -m dir_size_var_www -c "du -s /var/www/ |awk '{print $1}'"

上記をヒントにシステム毎に必要なメトリクスを取得し、システムの状態を外から見えるようすることで、
SSHログインをしない設計に近づくかと思います。

上記のような内容も、可能な限り汎用性を保ってください。。。
個別要件だけが増えていくのだけは避けるように切に願います。
(汎用性を重点に設計をシンプルにし、システム特有のもののみ変数化するイメージで)

なお、今回はCloudWatchへのメトリクス送信例ですが、システム内部の情報を外出しして見える化出来れば、
muninでもgrafanaでも使いやすいものであれば何でも良いかと思います。

以上、

元記事はこちら

運用でSSHログインをしないための設計ポイント(リソース取得編)【cloudpack大阪ブログ】