JavaでSNSサブスクリプションを登録削除する方法
SNSサブスクリプション登録
JavaでSNSサブスクリプションを登録してみます。※トピックは作成済みとします。
gradleの場合は、build.gradleに1文追加します。
build.gradle
implementation 'com.amazonaws:aws-java-sdk-sns:1.11.879'
AmazonSNSクライアントはAmazonSNSClientBuilderクラスから作成します。
package aws.sns; import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.AmazonSNSClientBuilder; import com.amazonaws.services.sns.model.SubscribeRequest; public class SubScriberRegister { public static void main(String[] args) { AmazonSNS snsClient = AmazonSNSClientBuilder.standard().withRegion("ap-northeast-1").build(); final SubscribeRequest subscribeRequest = new SubscribeRequest( "トピックのARN", "プロトコル", "プロトコルに対する値"); snsClient.subscribe(subscribeRequest); // サブスクリプション作成する System.out.println( "SubscribeRequest: " + snsClient.getCachedResponseMetadata(subscribeRequest)); } }
トピックのARNは、マネジメントコンソールから確認できます。
プロトコルとその値は以下の通りです。
プロトコル | 値 |
---|---|
http | delivery of JSON-encoded message via HTTP POST |
https | delivery of JSON-encoded message via HTTPS POST |
delivery of message via SMTP | |
email-json | delivery of JSON-encoded message via SMTP |
sms | delivery of message via SMS |
sqs | delivery of JSON-encoded message to an Amazon SQS queue |
application | delivery of JSON-encoded message to an EndpointArn for a mobile app and |
lambda | delivery of JSON-encoded message to an Amazon Lambda function |
“email”で確認しましたが、確認メールが送信されるので、Confirm subscriptionリンクをクリックして保留→確認済みにステータスが変更されます。
“lambda”の場合は、lambdaのエンドポイントを指定すると確認済みのステータスで作成されます。
一つのサブスクリプションで同一Lambdaを複数登録できるか
これは試しましたができませんでした。但し正常終了します。
SQSタイプがfifoは対応しているか
プロトコルを「sqs」、エンドポイントにfifoのarnを指定したところ、「FIFO SQS Queues can not be subscribed to standard SNS topics」となり対応していませんでした。
API Gateway(private)は対応しているか
現時点では対応していないようです。公開API GatewayはエンドポイントURLにすることが出きました。
公開APIをSNSのエンドポイントにする場合はセキュリティ考慮する必要があると思われます。
サブスクリプション登録時に属性を設定できるか
http,httpsプロトコルで”RawMessageDelivery”をtrueにしたかったのですが、このプロトコルはconfirmが必要なため、Javaでサブスクリプションを登録した際にエラーとなります。
以下エラーとなるソースです。
SubscribeResult result = snsClient.subscribe(subscribeRequest); // サブスクリプション作成 SetSubscriptionAttributesRequest attribute = new SetSubscriptionAttributesRequest( result.getSubscriptionArn(), "RawMessageDelivery", "true"); snsClient.setSubscriptionAttributes(attribute); // 属性登録、ここでエラーとなる
これは、result.getSubscriptionArn()の戻り値が”pending confirmation”となるためです。
プロトコルがlambdaの場合だと、result.getSubscriptionArn()の戻り値はARNの文字列が返ってくるので、サブスクリプション登録時に”FilterPolicy”を設定することが可能でした。
サブスクリプション登録時にフィルターポリシーを設定する
プロトコルによって一旦「保留」ステータスになってしまうプロトコルがあるので、http,https,emailなどで、サブスクリプション登録時にフィルターポリシーを設定することは出来ません。
但し、sqsなどだとあらかじめ標準のSQLを作成しておいて、サブスクリプション登録時にフィルターポリシーを設定することが可能です。
package aws.sns; import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.AmazonSNSClientBuilder; import com.amazonaws.services.sns.model.SetSubscriptionAttributesRequest; import com.amazonaws.services.sns.model.SubscribeRequest; import com.amazonaws.services.sns.model.SubscribeResult; public class SubScriberRegister { public static void main(String[] args) { AmazonSNS snsClient = AmazonSNSClientBuilder.standard().withRegion("ap-northeast-1").build(); final SubscribeRequest subscribeRequest = new SubscribeRequest( "トピックのARN", "sqs", "SQSのARN"); // トピックのARN,プロトコル,プロトコルに対する値 SubscribeResult result = snsClient.subscribe(subscribeRequest); // サブスクリプション作成 SetSubscriptionAttributesRequest attribute = new SetSubscriptionAttributesRequest( result.getSubscriptionArn(), "FilterPolicy", "{\"notifytype\":[\"TOP\",\"HOME\"]}"); // フィルターポリシーを設定 snsClient.setSubscriptionAttributes(attribute); // 属性登録OK } }
SNSサブスクリプション削除
次にサブスクリプションの削除をします。
UnsubscribeRequestクラスのインスタンスを作成します。コンストラクタでサブスクリプションのARNを指定します。
package aws.sns; import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.AmazonSNSClientBuilder; import com.amazonaws.services.sns.model.UnsubscribeRequest; import com.amazonaws.services.sns.model.UnsubscribeResult; public class SubScriberDelete { public static void main(String[] args) { AmazonSNS snsClient = AmazonSNSClientBuilder.standard().withRegion("ap-northeast-1").build(); UnsubscribeRequest request = new UnsubscribeRequest( "サブスクリプションのARN"); UnsubscribeResult result = snsClient.unsubscribe(request); // サブスクリプションの削除 System.out.println( "STATUS: " + result.getSdkHttpMetadata().getHttpStatusCode() // 200 + ", ARN: " + request .getSubscriptionArn()); // arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:topic:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee System.out.println("UnsubscribeRequest: " + snsClient.getCachedResponseMetadata(request)); } }
unsubscribeメソッドの引数にUnsubscribeRequestクラスのインスタンスを設定すればサブスクリプション削除されます。
戻り値はUnsubscribeResultクラスになります。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント