AWS SDK for Javaを使う#Amazon SNS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

いまやクラウドサービスの代表格とも言えるAmazonですが、EC2やS3をはじめとして、さまざまなサービスを提供しています。
数年前に私も少しだけEC2やS3を使用したことがあるのですが、最近はあまりさわっていませんでした。
しかし今回AWSについての調査をきっかけに、各種AWSサービスについて復習&AWS SDKでの動作確認をしていきたいと思います。

今回はいろいろなプロトコルで通知を行うことができるサービス、Amazon SNSです。

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.2
  • Java : 1.6.0_26
  • Scala : 2.9.1 final
  • SBT : 0.11.2

なお、AWSへの登録は終わっているものとします。

Amazon SNS

Amazon Simple Notification Service (Amazon SNS) は、クラウドからの通知を簡単に実現するためのサービスです。
このサービスはアプリケーションからメッセージを発行し、直ちに受信者またはその他のアプリケーションに伝えることが可能です。
以前ご紹介したAmazon SQSは、メッセージをputした後ポーリングでキューの監視をする必要がありましたが、これは任意のトピックをsubscribeしておくだけでメッセージをプッシュ形式で受信可能です。
また、受信するメッセージの形式は、http(https)、email、Amazon SQSなどを使用することが可能です。

今回はAmazon SNSを用いて、メッセージ受信と送信をおこなってみましょう。

実行環境のセットアップ

以前と同じくsbt + scala + aws-sdk-javaをセットアップしておきましょう。

Amazon SNSサンプル作成

今回はemailで通知を行います。まずはトピックを作成して subscribeするクラスを作成します。
src/main/scalaディレクトリに、SnsSub.scalaファイルを作成してください。
ここではトピックの作成とemailでのsubscribe登録を行なっています。

import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.services.sns.AmazonSNSClient
import com.amazonaws.services.sns.model.CreateTopicRequest
import com.amazonaws.services.sns.model.CreateTopicResult
import com.amazonaws.services.sns.model.SubscribeRequest
import com.amazonaws.services.sns.model.PublishRequest

import scala.collection.JavaConversions._


object SnsSubscribe extends App{
  // アクセスキー
  val accessKey = "アクセスキー"
  // シークレットキー
  val secretKey = "シークレットキー"

  val credentials = new BasicAWSCredentials(accessKey,secretKey)

  val sns = new AmazonSNSClient(credentials)

  val topic = new CreateTopicRequest("MyTopic")
  val res = sns.createTopic(topic)

  val arn = res.getTopicArn();
  println("arf=" + arn);

  val subscribeRequest = new SubscribeRequest()
  subscribeRequest.setTopicArn(arn)
  //通知プロトコルはemailを選択.endpointは通知先emailアドレス
  subscribeRequest.setProtocol("email");
  subscribeRequest.setEndpoint("通知したいメールアドレス");

  sns.subscribe(subscribeRequest);
}

SnsSub.scalaではemailで通知を受け取るようにSubscribeRequestを設定しています。
setEndpointには通知をしたいメールアドレスを指定してください。
記述ができたらsbtを起動してトピックを作成します。出力されたarnを覚えておいてください、
また、この時点でAWS Management ConsoleでAmazon SNSを確認してみると、トピックとSubscriptionsが登録されているのがわかります。

$ sbt
>run

次にメッセージをpublishするSnsPub.scalaを作成します。PublishRequestのコンストラクタに、先程確認したarnを指定します。

import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.services.sns.AmazonSNSClient
import com.amazonaws.services.sns.model.CreateTopicRequest
import com.amazonaws.services.sns.model.CreateTopicResult
import com.amazonaws.services.sns.model.SubscribeRequest
import com.amazonaws.services.sns.model.PublishRequest

import scala.collection.JavaConversions._

object SnsPublish extends App{

  // アクセスキー
  val accessKey = "アクセスキー"
  // シークレットキー
  val secretKey = "シークレットキー"

  val credentials = new BasicAWSCredentials(accessKey,secretKey)

  val sns = new AmazonSNSClient(credentials)

  val publishRequest = new PublishRequest("確認したarn","MyTopic")
  publishRequest.setMessage("publish message!");
  sns.publish(publishRequest);
	
}

PublishRequestにメッセージをセットし、publishメソッドを呼ぶと、指定したarnをsubscribeしているクライアントに対してメールが送信されます。
こちらのクラスも実行してください。設定したメッセージと共にメールがくるはずです。

まとめ

今回はemailでの通知サービスを使用してみました。
Amazon SNSではemail以外でもhttpやAmazon SQSを使用して通知することもできます。
とくにSQSの場合、httpやemail等と違って料金がかからないので検討してみてください。

参考サイトなど