2011年6月24日金曜日

SQSのキューのメッセージがなくなたらEC2インスタンスをシャットダウン

スズキです。

タイトルが意味不明だと思いますが、やりたいことは、
SQSのキューのメッセージを処理し続けて、
メッセージがなくなったらシャットダウンするようなインスタンスを作ってみた
ということです。
※ OSはCentOS(5.6)です。

まず、下記のようなPHPスクリプトを用意します。

▼ 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");

▼ receive-message
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);

// キューのメッセージが0で無い限り繰り返し
while($sqs->get_queue_size(CP_SQS_URL_CRAWL) != 0) {
  $response = $sqs->receive_message(CP_SQS_URL_CRAWL);
  if(isset($response->body->ReceiveMessageResult->Message)) {
     var_dump($response->body->ReceiveMessageResult->Message->Body);
     sleep(60); // ここに実際の処理を記述
     $sqs->delete_message(CP_SQS_URL_CRAWL, $response->body->ReceiveMessageResult->Message->ReceiptHandle);
  }
}

// メンテナンス用に"User Data"が設定されていたらシャットダウンしないように
$curl = curl_init("http://169.254.169.254/1.0/user-data");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_exec($curl);
if(curl_getinfo($curl, CURLINFO_HTTP_CODE) != 200) {
  exec("/sbin/shutdown -h now");
}

curl_close($curl);

上記のスクリプトを起動時に実行するため、下記のように"/etc/rc.local"に記述します。

▼ /etc/rc.local
...
# For Crawl
/opt/cloudpack/bin/receive-message >>/var/log/crawl.log 2>&1

次は、このEC2インスタンスを"Auto Scaling"です。
--------
http://www.suz-lab.com

0 コメント: