aws boto sns - 通过设备令牌获取 endpoint_arn

Posted

技术标签:

【中文标题】aws boto sns - 通过设备令牌获取 endpoint_arn【英文标题】:aws boto sns - get endpoint_arn by device token 【发布时间】:2014-03-06 14:22:45 【问题描述】:

目前,如果我们想使用以下方式将设备添加到 SNS 应用程序:

ep = SNSConnection.create_platform_endpoint(app_arn,device_token,user_data)

有一个选项是该设备已在过去添加。 为了验证设备是否已添加,我们使用:

def is_device_registered(device_token):
        list_of_endpoints = SNSConnection.list_endpoints_by_platform_application(AC.INPLAY_CHAT_APPLICATION_SNS_ARN)
        all_app_endpoints = list_of_endpoints['ListEndpointsByPlatformApplicationResponse']['ListEndpointsByPlatformApplicationResult']['Endpoints']
        for ep in all_app_endpoints:
            ep_device_token = ep['Attributes']['Token']
            if device_token == ep_device_token:
                endpoint_arn =  ep['EndpointArn']
                print 'Found an endpoint for device_token: %s, entry:%s' % (device_token,endpoint_arn)
                return endpoint_arn
        return None

效率非常低,无法扩展。

是否有一个 boto sns 函数可以获取 device_token 并返回 endpoint_arn(如果存在)? (如果不是,则无)。

【问题讨论】:

嘿阿米特 - 你有没有找到最好的方法来处理这个?您是存储端点 arn 还是每次使用令牌查找它?如果您找到了“正确”的方法,请回答您自己的问题 我们可以选择将它存储在 DB/Redis 中,但由于数据存储在 AWS SNS 中,我们认为使用 API 从那里检索它会很有用(在这种情况下为 boto) 【参考方案1】:

亚马逊会在错误消息中为您提供 arn。你可以从那里解析它。不是最佳的,但可以节省一些数据库查找。

错误:SNS 错误 - 无法为用户订阅 SNSInvalidParameter:无效参数:令牌原因:端点 arn:aws:sns:us-east-[ARN 密钥的其余部分] 已存在,具有相同的令牌,但属性不同。这是一些准备好正则表达式的咖啡

if err?
  log.error "SNS ERROR - Could not subcribe user to SNS" + err
  #Try to get arn from error

  result = err.message.match(/Endpoint(.*)already/)
  if result?.length
    #Assign and remove leading and trailing white spaces.
    result = result[1].replace /^\s+|\s+$/g, ""
    log.debug "found existing arn-> #result "

【讨论】:

这应该是接受的答案。我将发布基于@fino 答案的 Django / Python 版本。 10x @fino - 我们希望解决方案能在 boto API 中。 这不是很可笑吗?如果错误的格式发生变化怎么办? 天哪,它运行良好。我不再需要列出 200 万个端点!!!! 看到这个答案有点老 - 这方面有什么变化吗?在不将端点 arns 复制到您自己的数据库的情况下,这仍然是您能做的最好的吗?这真的不是一个好的解决方案,因为它完全依赖于永远不会改变的错误字符串。【参考方案2】:

与@fino 的答案相同,但为 Django 编写代码。希望对您有所帮助。

import re

try:
    sns_connection = sns.connect_to_region(...)
    response = sns_connection.create_platform_endpoint(...)
    arn = response['CreatePlatformEndpointResponse']['CreatePlatformEndpointResult']['EndpointArn']
    return arn

except Exception, err:
    print err
    #try to get arn from error
    result_re = re.compile(r'Endpoint(.*)already', re.IGNORECASE)
    result = result_re.search(err.message)
    if result:
        arn = result.group(0).replace('Endpoint ','').replace(' already','')
        print arn
        return arn
    return ''

【讨论】:

10x @JohnPang。 - 我们希望解决方案将在 boto API 中。

以上是关于aws boto sns - 通过设备令牌获取 endpoint_arn的主要内容,如果未能解决你的问题,请参考以下文章

多个设备令牌目标指向 AWS SNS 中的单个 Android 设备

AWS iOS SDK,服务配置为`nil

Zabbix借助AWS SNS触发短信告警

AWS SNS 推送通知请求返回“DeviceTokenNotForTopic”

使用 AWS SNS 向特定 APNS 令牌发送推送通知

AWS S3 通过 boto - 检查磁盘空间