Association de terminal du côté serveur à Amazon SNS (python + boto3)

Tâche

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.

Aperçu

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

  1. Enregistrer le point de terminaison dans l'application
  2. Abonnez le point de terminaison au sujet

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.

Enregistrer le point de terminaison dans l'application

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.

Abonner le point de terminaison au sujet

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']
        )

Question

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.

Retester

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()

Recommended Posts

Association de terminal du côté serveur à Amazon SNS (python + boto3)
Notification push du serveur Python vers Android
[Amazon Linux] Passage de la série Python 2 à la série Python 3
Essayez d'utiliser le framework web de Python Django (1) - De l'installation au démarrage du serveur
Copier des données d'Amazon S3 vers Google Cloud Storage avec Python (boto)
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
Envoyer un message de Slack à un serveur Python
Comment mesurer la vitesse de la ligne depuis le terminal
[Python] Je vais télécharger FTP sur le serveur FTP.
[Python] Comment supprimer les valeurs en double de la liste
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Changements de Python 3.0 à Python 3.5
Envoyer les données du journal du serveur vers Splunk Cloud
Je voulais utiliser la bibliothèque Python de MATLAB
Comment lancer instantanément Jupyter Notebook à partir du terminal
J'ai augmenté la version Python de 2 à 3, mais chaque fois que je redémarre le terminal ubuntu, la version reste 2.
Requête de Python vers Amazon Athena (à l'aide du profil nommé)
Accès ODBC à SQL Server depuis Linux avec Python
Script Python qui peut vérifier l'état du serveur à partir du navigateur
[Postgresql] Connexion SSH au serveur de base de données externe à partir du client
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
Programme pour juger si c'est une année calme du calendrier occidental [Python]
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
Extraire la valeur la plus proche d'une valeur à partir d'un élément de liste en Python
Publier de Python vers Slack
Flirter de PHP à Python
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
J'ai tweeté depuis le terminal!
Passer de python2.7 à python3.6 (centos7)
Connectez-vous à sqlite depuis python
J'ai fait quelque chose avec python qui NOW LOADING se déplace de gauche à droite sur le terminal
Un moyen simple d'accéder à l'API produit Amazon en Python
Répétez avec While. Script pour tweeter ou rechercher depuis le terminal
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
Accédez à l'API New Relic en Python pour obtenir l'état du serveur
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
[Python + heroku] De l'état sans Python à l'affichage de quelque chose avec heroku (partie 2)
Changer la version active dans Pyenv d'Anaconda en Python ordinaire
Appelez Matlab depuis Python pour optimiser
Laissez le traitement gênant à Python
Publication de Python sur la chronologie Facebook
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Existence du point de vue de Python
Dans la commande python, python pointe vers python3.8
Comment obtenir la version Python
Connectez-vous à la base de données utf8mb4 à partir de python
Python (de la première fois à l'exécution)
Publier une image de Python sur Tumblr
Utilisez l'API Flickr de Python
Comment accéder à wikipedia depuis python
Python pour passer d'une autre langue
Essayez d'utiliser Amazon DynamoDB à partir de Python
[Python] Changer l'alphabet en nombre
N'a pas changé de Python 2 à 3
Mettre à jour Mac Python de 2 à 3
Obtenez la largeur du div côté serveur avec Selenium + PhantomJS + Python
J'ai pu imprimer l'imprimante thermique "PAPERANG" depuis Python (Windows10, Python3.6)