Si vous souhaitez lier un terminal à un sujet avec SNS, il existe un exemple d'accès direct à SNS à partir d'un terminal smartphone à l'aide de sdk, mais en considérant l'avenir (comme la gestion des jetons côté dynamoDB également), le serveur Quand j'ai essayé de le faire sur le côté, il y avait étonnamment peu de cas, alors je l'ai résumé.
Cette fois, la cible de notification push est un smartphone, c'est donc la prémisse. De plus, l'implémentation se fait dans Lambda, mais je ne pense pas que cela dépende de Lambda.
handler.py
import boto3
def lambda_handler(event, context):
application_arn = 'arn:aws:sns:us-east-1:999999999999:notify_sample'
topic_arn = 'arn:aws:sns:us-east-1:999999999999:notify_sample'
endpoint = add_endpoint(application_arn, token)
subscribe_token(topic_arn, endpoint['EndpointArn'], is_subscribe)
La procédure approximative est
Ce sera. Veuillez vous inscrire et acquérir l'ARN de l'application et du sujet apparaissant ici à l'aide du tableau de bord côté AWS à l'avance.
handler.py
def add_endpoint(application_arn, token):
# token(extrait de boto3 doc) :
# For example, when using APNS as the notification service, you need the device token.
# Alternatively, when using GCM or ADM, the device token equivalent is called the registration ID.
client = boto3.client('sns')
endpoint = client.create_platform_endpoint(
PlatformApplicationArn=application_arn,
Token=token
)
return endpoint
Appelez ici même s'il a déjà été ajouté. token est un token obtenu auprès d'APNS ou FCM (GCM). create_platform_endpoint () retourne les informations du point final existant sans en ajouter un nouveau si le point final a déjà été ajouté. Dans tous les cas, des informations sur les terminaux peuvent être obtenues, abonnez-vous donc en fonction de ces informations.
The CreatePlatformEndpoint action is idempotent, so if the requester already owns an endpoint with the same device token and attributes, that endpoint's ARN is returned without creating a new endpoint.
C'est un peu compliqué.
Vous pouvez simplement exécuter subscribe () pour vous abonner, mais en cas de désabonnement, SubscriptionArn du terminal cible est requis. Cette fois, j'exécute subscribe () une fois pour obtenir SubscriptionArn, puis je l'utilise pour exécuter unsubscribe ().
handler.py
def subscribe_token(topic_arn, endpoint_arn, is_subscribe):
client = boto3.client('sns')
subscription = client.subscribe(
TopicArn=topic_arn,
Protocol='application',
Endpoint=endpoint_arn
)
if not is_subscribe:
client.unsubscribe(
SubscriptionArn=subscription['SubscriptionArn']
)
C'est la dernière méthode pour obtenir l'abonnement Arn, mais même si vous regardez le manuel, vous ne pouvez pas trouver une aussi bonne méthode. Veuillez indiquer s'il existe une méthode appropriée.
J'ai examiné le manuel de boto3 et révisé le code parce que j'ai eu une erreur un peu floue au moment de l'exécution, mais je pense qu'il est plus simple d'écrire comme suit. Cependant, la réécriture n'a pas amélioré l'erreur, donc je pense que le client est un client de bas niveau.
handler.py
def add_endpoint(dry_run, application_arn, token):
sns = boto3.resource('sns')
platform_application = sns.PlatformApplication(application_arn)
endpoint = platform_application.create_platform_endpoint(
Token=token
)
return endpoint.arn
def subscribe_token(dry_run, topic_arn, endpoint_arn, is_subscribe):
sns = boto3.resource('sns')
topic = sns.Topic(topic_arn)
subscription = topic.subscribe(
TopicArn=topic_arn,
Protocol='application',
Endpoint=endpoint_arn
)
if not is_subscribe:
subscription.delete()