Amazon SNSをColdFusion10とAWS SDK for javaの組み合わせで操作する #2 | publish

2013.08.22

前回subscribeまでを体験しましたので、今回はpublishを実際にやってみます。

動作させた環境

  • Windows7 64Bit
  • ColdFusion10 デベロッパー版
  • AWS SDK for java 1.5.3

Amazon SNSを使う(publish)

AWS SDK for java 1.5.4が既にリリースされていますが、1.5.3で検証を続けることにします。
AWS SDK for java 1.5.4では新しいmethodであるsetTargetArnが追加されていますが、そのmethodは使わずにpublishの検証を進めたいと思います。

手順

  1. トピックのあるリージョンを設定
  2. メッセージの設定
  3. このメッセージが発行されたトピックのARNの設定
  4. publishAPIをコール

今回実行したpublishのサンプルソースは以下の通りです( aws_sns_publish.cfm )

<cfcontent type="text/html; charset=utf-8">
<cfprocessingdirective pageEncoding="utf-8" suppressWhitespace="true">

<cflock scope = "Session" timeout = "30" type = "Exclusive">
    <cfset aws_AK = #accessKeyId#>
    <cfset aws_SK = #secretAccessKey#>
</cflock>

<cfoutput>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Coldfusion + AWS SDK for java SNS publish Sample</title>
</head>

<body>

<cfset awscreds = createObject("java","com.amazonaws.auth.BasicAWSCredentials").init(aws_AK,aws_SK)>
<cfset SNSClient = createObject("java","com.amazonaws.services.sns.AmazonSNSClient").init(awscreds)>

<!--- RegionをEUに指定 --->
<cfset sns_region = SNSClient.setEndPoint("https://sns.eu-west-1.amazonaws.com/")>

<!--- 初期化 --->
<cfset SNSPublishRequest = createObject("java","com.amazonaws.services.sns.model.PublishRequest").init()>
<cfset snstest = SNSPublishRequest.setMessage("aws sns sample publish message from Coldfusion10!")>
<!--- aws sdk for java 1.5.4 からは setTargetArn というmethod が追加されていました --->
<!--- Management Console にログインしてSNSのTOPICを確認してpublish対象となるTopic ARNを指定します。
      arn:aws:sns:eu-west-1:xxxxxxxxxxxx:tsukumaTOPIC の様にTopic ARNはなっています。 --->
<cfset snstest = SNSPublishRequest.setTopicArn("ここにはTopic ARNを指定します。")>

<!--- publishする --->
<cfset sns_publish_test = SNSClient.publish(SNSPublishRequest)>

<!--- 確認用にAmazon Resource Name(ARN)を表示させる --->
<cfdump var="#snsres.getTopicArn()#">

</cfoutput>
</cfprocessingdirective>      
<cfsetting enablecfoutputonly="false">

</body>
</html>

上記のテンプレートを実行した後、下記の様なメールが到着します。

aws_sns6

CFMLテンプレート内で指定したメッセージ内容の【 aws sns sample publish message from Coldfusion10! 】が正しくセットされてメール通知されていることが確認できました。

せっかくなので通知先をSQSにしてみましょう。SQSへの通知は無料なのでお得?
前回使ったCFMLテンプレート( aws_sns_createtopic.cfm )で『通知先をemailで設定する場合』という部分の2行をコメントにしてSQSにする行を追加します。

<!--- 通知先をemailで設定する場合 --->
<!---
<cfset snstest = SQSsubscribeRequest.setProtocol("email")>
<cfset snstest = SQSsubscribeRequest.setEndpoint("プッシュ通知したいメールアドレスを指定")>
--->

<!--- 通知先をSQSで設定する場合 --->
<cfset snstest = SNSsubscribeRequest.setProtocol("sqs")>
<!--- Management Consoleにログインして前回使用したキューを確認してそのキューのARNを指定します。 --->
<!--- arn:aws:sqs:eu-west-1:xxxxxxxxxxxx:tsukuma-SQSTest のようなARNになっているかと思います --->
<cfset snstest = SNSsubscribeRequest.setEndpoint("ここは通知したいキューのARNを指定します")>
  1. 前回EMail通知用で aws_sns_createtopic.cfm を実行して作成されたTOPICとSubscriptionは削除します。
  2. 1で不要なものを削除してから、SQSに通知先を変えた状態の aws_sns_createtopic.cfm のテンプレートを実行します。
  3. aws_sns_publish.cfm を再度実行してpublishします。

SQSに通知先を設定した場合でSNSのTopic OwnerとSQSのQueue Ownerが同じ場合はsubscribeの確認ステップが省略されるのでそのままPendingConfirmationにならずに購読完了状態になります。また下記スクリーンショットでProtocolがSQSになっていることも確認できます。

aws_sns7

Management ConsoleにログインしてSQS側も確認してみました。メッセージも指定した通りのものが入っていて、正しくSQS側に通知されていることが確認できますね。

aws_sns8

まとめ

ようやくAmazon SNSがなんなのかが実際に体験してみて理解できました。SQSとSNSは手軽に使えるサービスなのでシステムを作っていく場合には是非活用できるようにしたいと思います。