2011年6月23日木曜日

SQSのキューのサイズをCloudWatchに登録

スズキです。

"Auto Scaling"でSQSのキューのサイズ(メッセージの数)に応じて、
EC2インスタンスを増やすような仕組みを作る必要があり、
その準備として、SQSのキューのサイズをCloudWatchに登録する部分を作ってみました。

AWSアカウントはIAMユーザーを利用することとすると、
SQSとCloudWatchの許可ポリシーを付与する必要があります。

SQSはコチラで紹介したものを使い、
CloudWatchに関しては下記を利用すればOKです。

{
    "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のキューの作成やメッセージの登録はコチラで紹介しています)

▼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に登録されていることが確認できます。

次はSQSキューを処理するEC2インスタンス作成です。
--------
http://www.suz-lab.com

0 コメント: