この記事は公開されてから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等と違って料金がかからないので検討してみてください。
参考サイトなど
- AWS SDK for Java javadoc: http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/
- Amazon SNS公式ドキュメントリンク: http://aws.amazon.com/jp/documentation/sns/