【问题标题】:Boto - AWS SNS how to extract topic's ARN numberBoto - AWS SNS 如何提取主题的 ARN 号
【发布时间】:2015-07-14 03:37:41
【问题描述】:

创建 AWS SNS 主题时:

a = conn.create_topic(topicname)

或获取已创建的主题:

a = conn.get_all_topics()

结果是:

{u'CreateTopicResponse': {u'ResponseMetadata': {u'RequestId': u'42b46710-degf-52e6-7d86-2ahc8e1c738c'}, u'CreateTopicResult': {u'TopicArn': u'arn:aws:sns:eu-west-1:467741034465:exampletopic'}}}

问题是如何获取主题的 ARN 作为字符串:arn:aws:sns:eu-west-1:467741034465:exampletopic?

【问题讨论】:

    标签: python amazon-web-services boto amazon-sns


    【解决方案1】:
    import boto
    
    def get_account_id():
        # suggested by https://groups.google.com/forum/#!topic/boto-users/QhASXlNBm40
        return boto.connect_iam().get_user().arn.split(':')[4]
    
    def topic_arn_from_name(self, region, name):
        return ":".join(["arn", "aws", "sns", region, get_account_id(), name])
    

    【讨论】:

    • 如果您想跨帐户发布,这可能行不通,对吧?
    【解决方案2】:

    当您创建一个新主题时,boto 会返回一个 Python 字典,其中包含您在上面描述的数据。要将主题 ARN 作为字符串获取,只需在字典中引用该键,如下所示:

    a = conn.create_topic(topicname)
    a_arn = a['CreateTopicResponse']['CreateTopicResult']['TopicArn']
    

    虽然有点笨拙,但确实有效。

    list_topics 调用返回一个不同的结构,基本上是这样的:

    {u'ListTopicsResponse':
      {u'ListTopicsResult':
        {u'NextToken': None,
         u'Topics': [
          {u'TopicArn': u'arn:aws:sns:us-east-1:467741034465:exampletopic'},
          {u'TopicArn': u'arn:aws:sns:us-east-1:467741034465:footopic'}
         ]
        },
      u'ResponseMetadata': {u'RequestId': u'aef821f6-d595-55e1-af14-6d3a8064536a'}}}
    

    在这种情况下,如果您想获取您将使用的第一个主题的 ARN:

    a = conn.list_topics()
    a_arn = a['ListTopicsResponse']['ListTopicsResult']['Topics'][0]['TopicArn']
    

    【讨论】:

    • 这里要注意的一点是,一遍又一遍地调用create_topic 是一个幂等操作。如果该帐户的主题已存在,则将不创建一个新主题。调用 create_topic 似乎是检索主题 ARN ID 的最佳方法。
    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2020-07-13
    相关资源
    最近更新 更多