以前、@j3tm0t0さんが公開されたNagiosのプラグイン、check_cloudwatchとほぼ同様のプラグインをCloudWatchとの通信をPHPで行うものを作成してみました。
(元祖check_cloudwatchはコマンドラインツールを利用しています)
下記のように利用できます。
# ./check_cloudwatch > -c 20 > -w 10 > -f credential.yml > -r ap-northeast-1 > -n AWS/EC2 > -m CPUUtilization > -s Average > -u Percent > -d InstanceId > -v i-xxxxxxxx CloudWatch CRITICAL - AWS/EC2 CPUUtilization Average InstanceId i-xxxxxxxx: 25.092 Percent;| data=25.092;10;20;0;
コードは下記のようになっています。 (エラー処理は不完全な状態です。)
require_once("/opt/aws/php/latest/sdk.class.php"); // define status $ok = array("code" => 0, "name" => "OK"); $warning = array("code" => 1, "name" => "WARNING"); $critical = array("code" => 2, "name" => "CRITICAL"); $unknown = array("code" => 3, "name" => "UNKNOWN"); // set option $option = getopt("c:w:f:r:n:m:s:u:d:v:"); $critical_size = $option["c"]; $warning_size = $option["w"]; $credential = yaml_parse_file($option["f"]); $region = $option["r"]; $namespace = $option["n"]; $metrics = $option["m"]; $statistics = $option["s"]; $unit = $option["u"]; $name = $option["d"]; $value = $option["v"]; // init cw $cw = new AmazonCloudWatch($credential["accessKey"], $credential["secretKey"]); $cw->set_region($region); date_default_timezone_set("Asia/Tokyo"); // get metric statistics $response = $cw->get_metric_statistics( $namespace, $metrics, "-10 minutes", "now", 300, $statistics, $unit, array( "Dimensions" => array( array("Name" => $name, "Value" => $value) ) ) ); $data = (float)$response->body->GetMetricStatisticsResult->Datapoints->member->$statistics->to_string(); // check status if($data > $critical_size) { $status = $critical["code"]; } elseif($data > $warning_size) { $status = $warning["code"]; } elseif($data > 0) { $status = $ok["code"]; } else { $status = $unknown["code"]; } // output status $output = " - ${namespace} ${metrics} ${statistics} ${name} ${value}: ${data} ${unit};| data=${data};${warning_size};${critical_size};0;"; switch($status) { case $ok["code"]: print("CloudWatch " . $ok["name"] . $output); exit($ok["code"]); case $warning["code"]: print("CloudWatch " . $warning["name"] . $output); exit($warning["code"]); case $critical["code"]: print("CloudWatch " . $critical["name"] . $output); exit($critical["code"]); case $unknown["code"]: print("CloudWatch " . $unknown["name"] . $output); exit($unknown["code"]); } print("CloudWatch " . $unknown["name"] . $output); exit($unknown["code"]);
AccessKey、SecretKeyは下記のファイルにまとめています。
accessKey: “XXXXXXXXXXXXXXXXXXXX”
secretKey: “ssssssssssssssssssssssssssssssssssssssss”
さらにブラッシュアップした際には、再度紹介しようと思います。