我开始使用AWS SNS向我的应用发送推送通知。今天,为了获得我想要发送推送通知的主题,我需要加载所有主题 - 使用SNS客户端函数listTopics() - 并检查每个主题以查看ARN是否具有我正在查找的主题的名称对于。
我认为这是获取主题ARN的一种非常低效的方式,我想知道是否有一种最有效的方法来获取此信息,例如函数getTopicByName或其他东西。
如果没有,我想知道ARN是否是不可变的,我是否可以将ARN主题存储在我的数据库中?
感谢。
答案 0 :(得分:11)
如果您知道该主题已经存在,或者您不关心它是否已创建,那么更直接的方法就是调用CreateTopic
。给定名称,CreateTopic
将返回现有主题,包括ARN。
答案 1 :(得分:6)
如果主题已经可用,那么您可以使用“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"));
答案 2 :(得分:5)
我不知道如何以名义查找SNS主题。
ARN是不可变的。它不会在SNS主题的生命周期中发生变化。特别是,根据the documentation,SNS主题的ARN采用以下格式:
arn:aws:sns:region:account-id:topicname
因此,SNS主题的ARN更改的唯一方法是更改名称(在这种情况下,您的名称查找也会中断),或者删除主题并在新区域或其中重新创建一个完全不同的帐户,在这种情况下,它不再是真正相同的主题。