2013-11-20 101 views
2

有沒有辦法找到給定AWS賬戶ID具有PUBLISH(或任何其他)權限的SNS主題列表?獲取AWS賬戶的SNS主題列表,並具有發佈權限

我的使用情況如下:

  1. 服務器程序,允許不同的客戶端將消息發佈到一個SNS主題,它擁有。服務器程序在各個AWS區域中具有這些SNS主題。
  2. 在每個AWS區域中,每個客戶端都被授予SNS主題的「發佈」權限。
  3. 客戶端被賦予了主題的名稱,並基於該地區,它必須派生主題ARN併發布消息。

我想避免維持這些主題的ARNS,通過AWS區域,並在客戶端配置分發它們,並想知道如果有一個客戶端爲:基於該主題名稱的主題ARN的一種方法, AWS的地區,通過AWS提供了一些API(而不是形成ARN爲aws:${region}:sns:${topicName}

回答

2

我假設ListTopicsResult只會返回話題的話題ARNS您可以訪問。

import java.util.List; 

import com.amazonaws.auth.AWSCredentials; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.services.sns.AmazonSNSClient; 
import com.amazonaws.services.sns.model.ListTopicsRequest; 
import com.amazonaws.services.sns.model.ListTopicsResult; 
import com.amazonaws.services.sns.model.Topic; 

public class TestSNS { 
    public static void main(String[] args) { 
     AWSCredentials credentials = new BasicAWSCredentials(args[0], args[1]); 
     AmazonSNSClient snsClient = new AmazonSNSClient(credentials); 

     ListTopicsResult listTopicsResult = snsClient.listTopics(); 
     String nextToken = listTopicsResult.getNextToken(); 
     List<Topic> topics = listTopicsResult.getTopics(); 

     // ListTopicResult contains only 100 topics hence use next token to get 
     // next 100 topics. 
     while (nextToken != null) { 
      listTopicsResult = snsClient.listTopics(nextToken); 
      nextToken = listTopicsResult.getNextToken(); 
      topics.addAll(listTopicsResult.getTopics()); 
     } 

     // Display all the Topic ARN's 
     for (Topic topic : topics) { 
      System.out.println(topic); 
      /* 
      * perform your actions here 
      */ 
     } 
    } 
} 
+0

我知道這是一個古老的但是值得一提的是其他訪問者上面的代碼有一個bug,一個必須調用'snsClient.listTopics()'時使用'nextToken',否則你將有一個無限循環(假設你有超過100個主題)。 –

+0

爲什麼會有無限循環,如果調用snsClient.listTopics()返回最多100個主題? – user1538903

+0

,因爲'nextToken'不會傳遞給後續的'listTopics()'調用。因此,每當循環迭代時,它只會列出前100個主題(並且存在nextToken)。 while循環內的調用應該是'listTopicsResult = snsClient.listTopics(nextToken);' –

相關問題