やること
- SQS をポーリングする Ruby スクリプト作ります
- Supervisor で上記のスクリプトをデーモン閣下します
- メッセージを適当に SQS に投げます
- Apache が起動するでしょう…
SQS をポーリングする Ruby スクリプト
以下のような感じ。メッセージを JSON で投げると start / stop / status を実行出来るようにしてます。
sqs.rb
#!/usr/bin/env ruby
require 'aws-sdk'
require 'json'
AWS.config(
:access_key_id => 'AKxxxxxxxxxxxxxxxxxx',
:secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
)
queue_url = "https://sqs.ap-northeast-1.amazonaws.com/1234567890123/hoge-test"
sqs = AWS::SQS.new
while true
receive = sqs.queues[queue_url].receive_message()
if receive != nil
message = JSON.load(receive.body)
action = message['action']
case action
when "start"
puts "Stating httpd..."
output = system("sudo /etc/init.d/httpd start")
open("/tmp/hoge.txt","w"){|f|
f.write output
}
when "stop"
puts "Stopping httpd..."
output = system("sudo /etc/init.d/httpd stop")
open("/tmp/hoge.txt","w"){|f|
f.write output
}
when "status"
output = system("/etc/init.d/httpd status")
open("/tmp/hoge.txt","w"){|f|
f.write output
}
end
end
end
すいません、色々とベタ書きをお許し下さい。sqs.rb とかいうファイル名で適当な場所に置いておきます。
Supervisor で上記のスクリプトをデーモン閣下
先ほどの Supervisor が起動している環境に…以下のように設定を追記します。
/etc/supervisord/conf/sqs.conf
[program:sqs]
command = /usr/bin/ruby /path/to/sqs.rb
process_name = sqs
autostart = true
autorestart = true
ようこそ魔界へ
デーモン閣下
設定したら supervisorctl reload で設定を反映させます。
supervisorctl reload
ちゃんとデーモン閣下しているか確認します。
hoge RUNNING pid 18777, uptime 0:04:20
sqs RUNNING pid 18776, uptime 0:04:20
supervisor>
ちゃんと sqs のスクリプトがデーモン閣下しているようです。
apache 起動
以下のようにリモートホスト(ちゃんとクレデンシャルされている環境)から…
aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/1234567890123/hoge-test --message-body '{"action":"start"}'
暫くすると…Apache が起動してます。(紙面でお知らせ出来ないのが残念です = 後で載せます)
apache 停止
以下のようにリモートホスト(ちゃんとクレデンシャルされている環境)から…
aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/1234567890123/hoge-test --message-body '{"action":"stop"}'
暫くすると…Apache が停止してます。(紙面でお知らせ出来ないのが残念です = 後で載せます)
意外に簡単に…
Supervisor を使えば意外に簡単にキューをポーリングするスクリプトをデーモン閣下することが出来ました。また、メッセージの JSON を解析させて非同期処理も行えることも確認しました。以前に検証した fluentd を使うパターンとうまい使い分けをしたいものです。
元記事は、こちら