AWS SNS根据名称获取主题

18
我开始使用 AWS SNS 发送推送通知到我的 app。现在,为了获取我想要发送推送通知的主题,我需要加载所有主题 - 使用 SNS 客户端函数 listTopics() - 并检查每个主题,以查看 ARN 是否有我要查找的主题名称。
我认为这是一个非常低效的获取主题 ARN 的方式,我想知道是否有更有效的方法来获取这些信息,比如一个 getTopicByName 函数或其他东西。
如果没有,我想知道 ARN 是否不可变,并且是否可以将主题 ARN 存储在我的数据库中?
谢谢。
4个回答

16

我不知道任何通过名称查找SNS主题的方法。

ARN是不可变的。它将在SNS主题的生命周期内不会改变。特别地,根据文档,SNS主题的ARN格式如下:

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

因此,SNS主题的ARN唯一更改的方式是更改名称(此时名称查找也会失败),或者删除主题并在新区域或完全不同的帐户中重新创建它,这样它就不再是相同的主题了。


谢谢,最后一个问题,ARN规则适用于任何ARN(主题、端点、应用程序等)吗? - GodFather
是的,他们不应该改变。 - Mark B

16
如果你已经知道主题是否存在或者不在乎它是否被创建,那么更直接的方法是调用 CreateTopic。通过提供名称,CreateTopic会返回现有主题,包括ARN。

1
似乎在使用CloudFormation模板创建主题时出现了问题。尽管已授予对所有SNS资源的访问权限,但仍然收到未经授权的错误。 - n1ru4l

8
如果主题已经存在,则可以使用以下方式使用“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"));

3
尽管使用SnsClient.createTopic()方法的给定答案可以工作,但它们还需要运行此代码的角色具有sns:CreateTopic策略,这可能不是理想的选择。

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