AWS SNS按名称获取主题


AWS SNS get topic by name

我开始使用AWS SNS向我的应用程序发送推送通知。今天,为了获得我想发送推送通知的主题,我需要加载所有主题——使用SNS客户端函数listTopics()——并检查每个主题,看看ARN是否有我要查找的主题的名称。

我认为这是一种非常低效的获取主题ARN的方法,我想知道是否有最有效的方法来获取这些信息,比如函数getTopicByName或其他什么。

如果不是,我想知道ARN是否是不可变的,我是否可以将主题ARN存储在我的数据库中?

谢谢。

如果您知道主题已经存在,或者不关心它是否已创建,那么更直接的方法就是简单地调用CreateTopic。给定一个名称,CreateTopic将返回现有主题,包括ARN。

我不知道有什么方法可以按名称查找SNS主题。

ARN是不可变的。它不会改变SNS的生活话题。特别是,根据文件,SNS主题的ARN采用以下格式:

arn:aws:sns:region:account-id:topicname

因此,SNS主题的ARN更改的唯一方法是更改名称(在这种情况下,按名称查找也会中断),或者删除主题并在新的区域或完全不同的帐户中重新创建它,在这种情况中,它将不再是真正的同一主题。

如果主题已经可用,那么您可以使用"createTopic"方法,如下所示。这样,如果请求者已经拥有指定名称的主题,则返回该主题的ARN,而不创建新主题。在AWS Java SDK中,代码如下所示。

    AWSCredentialsProvider provider = new ProfileCredentialsProvider();
    AmazonSNS sns = AmazonSNSClientBuilder.standard().withCredentials(provider).build();
    CreateTopicResult createRes = sns.createTopic("HelloTopic");

然后,通过使用CreateTopicResult,您可以获得主题ARN并发布消息

sns.publish(new PublishRequest(createRes.getTopicArn(), "Hello World"));

尽管这里给出的使用SnsClient.createTopic()方法的答案是有效的,但它们也要求运行此代码的角色具有sns:CreateTopic策略,这可能并不理想。