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 设备