AWS SNS - 如何通过主题名称获取主题ARN

17

在我的应用程序中,我需要向指定的主题名称发送消息。该主题已由其他人创建,并且在配置文件中他们只提供了主题名称。我的工作是将消息推送到给定的主题名称中。是否有一种方法可以通过主题名称在Java中获取主题ARN?

5个回答

14

答案所述,使用createTopic(topicName)是一种更直接的方法。如果主题已经被创建,它只会返回主题ARN。


我认为这是这个问题的最佳答案! - harley
虽然答案在技术上是正确的,但它并没有遵循最小权限原则。如果你想要遵循这个原则,你应该更好地浏览主题列表或根据模式创建ARN。 - Tobias Stangl

11

我有两种方法来完成这个任务。ARN的格式总是相同的。因此,您可以订阅“arn:aws:sns:<region>:<account>:<name>”,其中:

区域信息从Regions.getCurrentRegion()中获取。请注意,这是一个比较费时的调用,并且您需要处理不在EC2 / Elastic Beanstalk实例上的情况。

账户信息从AmazonIdentityManagementClient.getUser().getUser().getArn()中获取。您需要从中解析出账户号码。同样要注意,如果不在EC2环境中,也需要进行特殊处理。

名称就是您想要的。

更简单的方法是遍历主题并查找ARN中所需名称。您将使用AmazonSNSClient listTopics方法来完成此操作。请记住,该方法仅返回前100个主题-您需要适当地循环遍历整个主题列表。


1
这可能是您需要的。提供主题并从可用主题中获取它。
import json
import boto3

def lambda_handler(event, context):
    try:

        topic =  event['topic'] 
        subject = event['subject']
        body = event['body']
        subscriber = event['subscriber']
        
        sns_client = boto3.client('sns')
        
        sns_topic_arn = [tp['TopicArn'] for tp in sns_client.list_topics()['Topics'] if topic in tp['TopicArn']]
        
        sns_client.publish(TopicArn = sns_topic_arn[0], Message=body,
            Subject=subject)
        
    except Exception as e:
        print(e)

你在函数中传递的 event 参数是什么? - alltej

0
如果您有创建主题的权限,可以尝试这个: link 如果您没有权限,可以尝试这个:
private static Optional<Topic> getTopicByName(SnsClient snsClient, 
                                              String topicName) {
    for (val topicsResponse : snsClient.listTopicsPaginator()) {
        if (topicsResponse.hasTopics()) {
            for (val topic : topicsResponse.topics()) {
                // Arn format => arn:aws:sns:region:account-id:topic-name
                val arn = topic.topicArn();
                val sp = arn.split(":");
                if (topicName.equals(sp[sp.length - 1])) {
                    return Optional.of(topic);
                }
            }
        }
    }
    return Optional.empty();
}

-5
你可以创建一个包含主题和其主题ARN的表。
当你创建一个主题时,可以通过控制台或使用API检索主题ARN。
这样就不需要循环或尝试匹配模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接