JavaでSNSサブスクリプションを登録削除する方法

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
email 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のエンドポイントにする場合はセキュリティ考慮する必要があると思われます。

クリックしてsns-dg.pdfにアクセス

サブスクリプション登録時に属性を設定できるか

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クラスになります。

コメント

タイトルとURLをコピーしました