share facebook facebook2 twitter menu hatena pocket slack

2011.06.27 MON

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

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

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。