Java 获取具有发布权限的AWS帐户的SNS主题列表

Java 获取具有发布权限的AWS帐户的SNS主题列表,java,amazon-web-services,amazon-sns,Java,Amazon Web Services,Amazon Sns,有没有办法找到给定AWS帐户ID具有发布(或任何其他)权限的SNS主题列表 我的用例如下所示: 服务器程序允许不同的客户端将消息发布到它拥有的SNS主题上。服务器程序在各个AWS地区都有这些SNS主题 在每个AWS地区,每个客户端都被授予SNS主题的“发布”权限 客户机被赋予主题的名称,并且基于区域,它必须派生主题ARN并发布消息 我希望避免按AWS区域维护这些主题的ARN,并将它们分发到客户机配置中,我想知道客户机是否有办法通过AWS提供的一些API(而不是以AWS:${region}:sns

有没有办法找到给定AWS帐户ID具有发布(或任何其他)权限的SNS主题列表

我的用例如下所示:

  • 服务器程序允许不同的客户端将消息发布到它拥有的SNS主题上。服务器程序在各个AWS地区都有这些SNS主题
  • 在每个AWS地区,每个客户端都被授予SNS主题的“发布”权限
  • 客户机被赋予主题的名称,并且基于区域,它必须派生主题ARN并发布消息

  • 我希望避免按AWS区域维护这些主题的ARN,并将它们分发到客户机配置中,我想知道客户机是否有办法通过AWS提供的一些API(而不是以
    AWS:${region}:sns:${topicName}的形式形成基于主题名称和AWS区域的主题ARN

    我假设ListTopicsResult只返回您可以访问的主题的主题ARN

    import java.util.List;
    导入com.amazonaws.auth.AWSCredentials;
    导入com.amazonaws.auth.BasicAWSCredentials;
    导入com.amazonaws.services.sns.amazonsClient;
    导入com.amazonaws.services.sns.model.ListTopicsRequest;
    导入com.amazonaws.services.sns.model.ListTopicsResult;
    导入com.amazonaws.services.sns.model.Topic;
    公共类测试{
    公共静态void main(字符串[]args){
    AWSCredentials credentials=新的基本凭证(args[0],args[1]);
    AmazonSClient snsClient=新的AmazonSClient(凭据);
    ListTopicsResult ListTopicsResult=snsClient.listTopics();
    字符串nextToken=listTopicsResult.getNextToken();
    List topics=listTopicsResult.getTopics();
    //ListTopicResult仅包含100个主题,因此请使用下一个标记获取
    //接下来的100个主题。
    while(nextToken!=null){
    listTopicsResult=snsClient.listTopics(nextToken);
    nextToken=listTopicsResult.getNextToken();
    topics.addAll(listTopicsResult.getTopics());
    }
    //显示所有主题ARN
    用于(主题:主题){
    System.out.println(主题);
    /*
    *在这里执行您的操作
    */
    }
    }
    }
    
    我知道这是一篇老文章,但值得向其他访问者提及的是,上面的代码有一个bug。当调用
    snsClient.listTopics()时,必须使用
    nextToken
    ,否则你将有一个无限循环(假设你有100多个主题)。如果调用snsClient.listTopics()返回最多100个主题,为什么会有一个无限循环?因为
    nextToken
    不会传递给后续的
    listTopics()
    调用。因此,每次循环迭代时,它只会列出前100个主题(并且有一个nextToken)。while循环中的调用应该是
    listTopicsResult=snsClient.listTopics(nextToken);