AWS SNS 按名称获取主题

AWS SNS get topic by name

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

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

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

谢谢。

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

A​​RN 是不可变的。它在 SNS 主题的生命周期内不会改变。特别是,根据 the documentation,SNS 主题的 ARN 采用以下格式:

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

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

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

如果主题已经可用,那么您可以使用 "createTopic" 方法作为 follows.With 如果请求者已经拥有具有指定名称的主题,则返回该主题的 ARN 而无需创建新话题。在 AWS Java SDK 中,代码将如下所示。

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

然后使用CreateTopicResult可以获取Topic ARN并发布消息

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