2013/10/02

初めてのAWSメモ(2):CloudWatchからSNS→SQS、AWS SDK for RubyでQueue取り出し

■やりたいこと

■参考にしたURL
AWS CloudWatch と Alarm を試してみる
SQSってなんじゃ?(AWSコンソールにSQS登場)
Rubyを使ってAmazon SNSとSQSを操作する:fanoutパターン
AWS SDK for RubyでSQSを操作する

■やったこと
1.SQSの設定
  SNSから通知するためのSQSを、先に作っておく。
  -- SQS NavigationからCreate new Queueをクリック
   -- 適当に名前付けてQueueを作っておく
   -- Detail画面からARNをメモしておく
   -- PermissionからAdd a Permissionで追加
    -- Allow Everybody Sendmessage(送信元をSNSに縛れるか?確認)

2.SNSの設定
(1)SNS NavigationからSNSのTopicを作る
  -- Create New Topic
   -- Nameを付与して作る
(2)作成したTopicに対してSubscriptionを設定する
  -- Create Subscription
   -- ProtocolはEmail、Endpointはメールアドレス
   -- 登録したメール宛に認証メールが来るので対応する
  -- もいっちょCreate Subscription
   -- ProtocolはAmazon SQS、Endpointは1.で作ったSQSのARN。
      (後で気づいたんだけど、Queue側からSubscribe Queue to SNS Topicで紐つけが出来た)
  -- TopicからPublish to this Topicでテストメッセージが送信可能。

3.CPU監視される側のEC2立ち上げ
(1)EC2からSNSにアクセスするために、IAM roleの設定を行う。
  なお、Launch済のEC2のIAM Roleを変更することは出来ないみたい。
  -- IAM Dashboard
   -- Roles -> Create New Role
    -- Amazon EC2に対しPower Usersを付与。
(2)IAM roleを設定したEC2を立ち上げる。
  -- EC2 Dashboard
   -- Instances -> Launch New Instance
    -- ほぼDefault、IAM Roleだけ(1)で作ったRoleを設定する。
  -- Elastic IPsでGlobal IPも振っておく。
(3)CloudWatchの設定。今回は「1分に1回CPU使用率を通知」したいんだけど、
  基本モニタリングでは5分に1回しか出来ないため、Deailed Monitoringを使う。
  追加料金かかります。
  -- EC2 Dashboardで対象のEC2を選択、Monitorningタブを表示
   -- Enable Detailed Monitoringをクリック
   -- Create AlermからAverage of CPU Utilizationを1分単位で通知にする。
    -- 負荷はテストなので10%以上に。
    -- send a notification toは1.で作成したSNSを指定。
(4)試しに負荷を上げてみる。yum installとか。


4.CPU監視する側のEC2立ち上げ
(1)EC2 DashboardからLaunch EC2でもう1台立ち上げる。
 IAM Roleの設定だけ忘れずに。
(2)このEC2からSQSをPollingして、Queueがあったらコンソールに表示したい。
(3)AWS SDK for Rubyのセットアップ
  $ sudo yum install ruby-devel rubygems gcc make libxml2-devel libxslt-devel
  $ sudo gem install aws-sdk
(4)AWS SDK for Ruby経由でSQSからMessageを拾って表示。一度表示したらQueueから削除。
 Access_keyとSecret_keyはアカウントオプションのSecurityから取得できる。
  (※追記:IAM Roke for EC2を設定してればアクセスキーとシークレットキーはいらない)

  $ vi get_sqs.rb

#!/usr/bin/ruby

require 'rubygems'
require 'aws-sdk'

access_key = 'アクセスキー'
secret_key = 'シークレットキー'
sss_endpoint = 'SQSのURI'
queue_url = 'queueのURL'
queue_name = 'queueの名前'

sqs = AWS::SQS.new(:access_key_id => access_key,
                   :secret_access_key => secret_key,
                   :sss_endpoint => sss_endpoint,
                   :queue_url => queue_url  ).client

while true
  message = sqs.receive_message(:queue_url => queue_url)[:messages][0]
  if message
    puts message[:body]
    sqs.delete_message(:queue_url => queue_url, :receipt_handle => message[:receipt_handle])
    puts "Waiting"
  end
  sleep 5
end

(5)$ ruby ./get_sqs.rb で実行。
(6)SNSからPublish to this Topicsでテストメッセージを送って、コンソールにMessageが表示されることを確認。
(7)監視される側のサーバでyumとか使って負荷を上げて、SNS→SQS→コンソールにメッセージが表示されることを確認する。

■感想
・CloudWatchを使った監視はとてもお手軽。5分より短い間隔で監視したいほどシビアな案件なんてそんなに無いので、基本モニタリング充分使えると思う。
・SQSとAWS SDKを使ってイベント駆動のアプリ作るのもなかなか面白そう。
・AWS SDKはもっといろんなことできそうなのでもっと調べたい。


Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝,玉川 憲,片山 暁雄,鈴木 宏康

日経BP社
売り上げランキング : 17216

Amazonで詳しく見る by AZlink