プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon SNSとSQSの素敵な関係。或いは、Jenkinsからパトライトを光らせる。


 以前ご紹介しましたが、Amazon SNSはプッシュ型の通知サービスで幾つかのプロトコルに通知を送ることが出来ます。一方、Amazon SQSはPull型のサービスです。真逆のサービスに見えますが、この2つを組み合わせることにより応用範囲が劇的に広がります。今回は、そんな一例をご紹介します。


 Jenkinsはプラグインを追加することにより、様々な機能を追加することができます。既存のプラグインの中にも、AWSと連携するプラグインが幾つかあり、インスタンスの操作やCloudFormationの操作を行うものなどがあります。今回は、その中でSNS連携するプラグインを使います。

Amazon SNSのトピック作成



 Amazon SNSは、一つ一つの通知はTopicと呼びます。トピックの作成は簡単で、Create New Topicで名前を決めるだけで作れます。Topicが作成されると、一意のTopic ARNが決まります。この後で、Topicの詳細からプロトコルを選んでSubscriptionを作成することにより、実際の通知が出来るようになります。2013年3月現在で使えるプロトコルは、HTTP,HTTPS,Email,SQSがあります。今回は、SQS側からSNSと連携するので、スキップします。

Amazon SQSとSNSの連携



 次にSQSの作成を行います。SQS管理画面からCreate New Queueを行い、キュー名を決めて詳細設定を行います。設定の部分で特に気をつける必要がある部分は、Receive Message Wait Timeのところです。これ何の設定かというと、ロングポーリング機能と呼ばれる機能の設定です。キューが発生してからすぐに処理をするには、キューのリクエストをこまめにする必要があります。例えば、1秒に1回リクエストをするようにプログラムすると、(人間的な感覚では)即座に処理をしてくれます。一方で、SQSの料金体系はリクエスト数による従量課金です。リクエスト100万件につき 0.50 USDになります。格安です。しかし、1秒間に1回実行するとすると、1ヶ月で60*60*24*30となり約260万リクエストとなり、約1.3ドルとなります。これでも非常に安いのですが、一方でCPUを喰ったりと大変です。そこで、Receive Message Wait Timeを設定することにより、1リクエストあたり最大20秒間Waitしてくれるようになります。Wait中にキューが入れば即座にレスポンスを返すし、来なければ時間切れまでまつという代物です。つまり、使い勝手が殆ど変わらずにリクエスト回数を1/20に抑えることができます。ということで、出来れば使った方が良いと思います。


 キューを作成すると、その後で既存のSNSと連携します。対象のキューを選んだ上で、Queue ActionsのSubscribe Queue to SNS Topicで紐付け出来ます。


 作成したら、SNSの方からPublish to Topicでメッセージを送ってキューが溜まるか確認しましょう。SQS側のMessages Availableが1件増えていれば成功です。

Amazon SNS notifier plugin



 Amazon SNS notifier pluginは、その名の通りJenkinsからSNSにプッシュ通知をするプラグインです。残念ながら、失敗時のみ通知するという仕様になっております。プラグインは、必要に応じて作り替えればよいと思いますが、今回はそのまま使います。SNS Notifier Pluginをインストールすると、JenkinsのJenkinsの管理->システムの設定でデフォルトのSNSの通知先を指定出来るようになります。設定項目としては、SNSの通知先とAccessKey,SecretAccessKeyの3つです。ここで設定するAccessKeyの保持者であるユーザは、IAMのユーザで作成しましょう。そして、SNSの通知権限だけを与えるのが望ましいです。


システム設定画面


 全体設定が終わると、個別プロジェクトでの設定を行います。プラグインをインストールしておくと、ビルド後の処理の選択肢の中にAmazon SNS Notiferという項目が追加されているはずです。失敗時に通知したい場合は、それを選びます。またデフォルトの通知先から変更したい場合は、Topic ARNを指定します。


個別プロジェクトでの設定

Jenkinsのビルド失敗時、パトライトを光らせる



 さてここからAmazon SNSとSQSを使ったJenkinsとパトライトの連携です。構成としてはJenkinsのビルド失敗時に、プラグインを通してSNSから通知を出し、SQSにキューを作ります。パトライト側のネットワークにSQSをずっとPullし続けるプログラムを常駐させておいて、キューを受け取ったらパトライトを光らせます。(ちなみにこれは単なるデモの為なので、そんなに面倒くさいことをしなくてもAWS側のネットワークとパトライト側のネットワークがVPC等で直接やり取り出来れば、Jenkinsから直接光らせることが出来ます。)


 デモ用に、ビルド開始と同時に失敗するプロジェクトを用意しています。

まとめ



 ということで何が言いたいかというと、Jenkinsからの通知にSNSとSQSを使うことによりネットワーク的に離れた所でも色々な処理が出来るということです。もちろんJenkinsでなくても、ネットワーク的に離れたところに簡単に処理連携出来るというのは有難いはずです。またSQSを使うことにより処理側のスケールも簡単なので、もっと色々な使い方が出てくると思います。Let's try!!


 ちなみにこれが先日の三都物語でデモしようとして、失敗した内容です。


See Also:
マイナー三兄弟なAmazon SNS,SQS,SESを激しくお勧めする。
Amazon Simple Queue Service(SQS)の使い方
Selenium2.0 WebDriverで複数ブラウザのUIテスト もう一度、Selenium再入門
Jenkinsでビルド・パイプラインを構築する
[JenkinsとSelenium WebDriverでUI層のテストも自動化&永続化する:title=JenkinsとSelenium WebDriverでUI層のテストも自動化&永続化する]
春のJAWS-UG 三都物語の発表資料 開発環境としてのAWSを真面目に考える
マルチプロトコルの凄いやつ。Amazon SNS(Simple Notification Service)


参照:
Amazon Web Services ブログ: 【AWS発表】SQS キューとSNS 通知 の連携がより簡単になりました!
mikewatt/jenkins-snsnotify-plugin
Amazon Web Services ブログ: 【AWS発表】Amazon SQSに新機能が追加! ロングポーリング、リクエストバッチ処理/クライアントサイドでのバッファリング