タイトルからだと分かり難いかもしれませんが、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