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)監修のもと掲載しています。
元記事は、こちら