share facebook facebook twitter menu hatena pocket slack

2011.06.29 WED

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

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

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

鈴木 宏康

鈴木 宏康

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

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。