share facebook facebook2 twitter menu hatena pocket slack

2014.08.08 FRI

朝の 3 分ハッキング(2) Supervisor で Amazon SQS のキューをポーリングするスクリプトをデーモン閣下してメッセージに応じて Apache を非同期で起動したり停止したりする…

川原 洋平

WRITTEN BY川原 洋平

長いタイトルすいません。かっぱ@inokara)です。

やること

  • 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 を使うパターンとうまい使い分けをしたいものです。

元記事は、こちら