Auto ScalingでSQSのキューサイズ(メッセージの数)に応じて、EC2インスタンスを増やすような仕組みを作る必要があり、その準備として、SQSのキューサイズをCloudWatchに登録する部分を作りました。
AWSアカウントはIAMユーザーを利用する点と、SQSとCloudWatchの許可ポリシーを付与する必要があります。
SQSはIAMのSQSとSimpleDBが利用出来るポリシーで紹介したものを使い、CloudWatchに関しては下記を利用すれば大丈夫です。
{ "Statement": [{ "Action": "cloudwatch:*", "Effect": "Allow", "Resource": "*" }] }
コードは下記のようになります。
まずは、共通設定系になります。
▼common.php
define("AWS_KEY" , "AAAAAAAA"); define("AWS_SECRET_KEY" , "SSSSSSSS"); define("CP_SQS_URL_CRAWL", "https://sqs.ap-northeast-1.amazonaws.com/000000000000/crawl"); date_default_timezone_set("Asia/Tokyo");
実際のSQSのキューサイズを取得し、CloudWatchに登録するものは下記となります。
(SQSのキューの作成やメッセージの登録は、PHPでSQSの利用で紹介しています)
▼put-queue-size-to-cloudwatch
require_once("/opt/cloudpack/bin/common.php"); require_once("/opt/aws/php/sdk.class.php"); $sqs = new AmazonSQS(); $sqs->set_region(AmazonSQS::REGION_APAC_NE1); $queue_size = $sqs->get_queue_size(CP_SQS_URL_CRAWL); $timestamp = date("c"); $metrics = array(array( "MetricName" => "queue_size", "Timestamp" => $timestamp, "Value" => $queue_size, "Unit" => "Count" )); $cw = new AmazonCloudWatch(); $cw->set_region(AmazonCloudWatch::REGION_APAC_NE1); $response = $cw->put_metric_data("crawl", $metrics); print($timestamp . " "); if($response->isOK()) { print("n"); } else { print($response->body->Error->Message . "n"); }
※ CloudWatchの登録に関しては、NagiosとCloudWatchを組み合わせてみたも参考になると思います。
上記スクリプトの出力結果は下記となります。
// 正常終了 2011-06-23T17:39:13+09:00 // 異常終了 2011-06-23T17:38:56+09:00 The parameter MetricData.member.1.MetricName is required.
ここまで用意できたら、cronで5分おきに上記スクリプトを実行するようにします。
... # crawl */5 * * * * root /opt/cloudpack/bin/put-queue-size-to-cloudwatch >>/var/log/crowl.log 2>&1
時間をおいてから、AWS Management Consoleで確認してみると、下記のように、SQSキューのサイズがCloudWatchに登録されていることが確認できます。