在我的应用程序中,我需要将消息发送到给定的主题名称。该主题已由其他人创建,在配置文件中,它们仅提供主题名称。我的工作是推送给定主题名称中的消息。有没有办法在java中按主题NAME获取主题ARN?
答案 0 :(得分:7)
如此answer所述,使用createTopic(topicName)是更直接的方法。如果以前创建了主题,它将只返回主题ARN。
答案 1 :(得分:6)
我已经完成了以下两种方式之一。 ARN始终是相同的模式。所以,你可以订阅" arn:aws:sns :::"其中:
region来自Regions.getCurrentRegion()。请注意这一点,因为它有点贵,而且您需要处理不在EC2 / Elastic Beanstalk实例上。
帐户来自AmazonIdentityManagementClient.getUser()。getUser()。getArn()。您必须从中解析帐号。关于不在EC2环境中的相同警告。
名字就是你拥有的。
更简单的方法是遍历主题并在ARN中查找所需的名称。您将使用AmazonSNSClient listTopics方法执行此操作。请记住,该方法仅返回前100个主题 - 您希望正确循环整个主题列表。
答案 2 :(得分:0)
这可能是您需要的。提供主题并从可用主题中获取它。
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)
答案 3 :(得分:-1)
您可以做的是创建一个包含主题及其topicArn的表。
主题arn可以通过控制台检索,也可以在创建主题时使用api。
这种方式无需循环或尝试匹配模式。