Terminalzuordnung von der Serverseite zu Amazon SNS (Python + Boto3)

Aufgabe

Wenn Sie ein Terminal mit einem Thema mit SNS verknüpfen möchten, gibt es ein Beispiel für den direkten Zugriff auf SNS von einem Smartphone-Terminal mit sdk, wobei Sie jedoch die Zukunft berücksichtigen (z. B. das Verwalten von Token auch auf der DynamoDB-Seite), den Server Als ich versuchte, es auf der Seite zu tun, gab es überraschend wenige Fälle, also fasste ich es zusammen.

Dieses Mal ist das Push-Benachrichtigungsziel ein Smartphone, das ist also die Voraussetzung. Die Implementierung erfolgt ebenfalls in Lambda, aber ich denke nicht, dass dies von Lambda abhängt.

Überblick

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)

Das grobe Verfahren ist

  1. Registrieren Sie den Endpunkt in der Anwendung
  2. Abonnieren Sie den Endpunkt für das Thema

Es wird sein. Bitte registrieren Sie sich und erwerben Sie die ARN der Anwendung und des Themas, die hier angezeigt werden, im Voraus über das Dashboard auf der AWS-Seite.

Registrieren Sie den Endpunkt in der Anwendung

handler.py


def add_endpoint(application_arn, token):
    # token(boto3 doc auszug) :
    # 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

Rufen Sie hier an, auch wenn es bereits hinzugefügt wurde. Token ist ein von APNS oder FCM (GCM) erhaltenes Token. create_platform_endpoint () gibt die Informationen des vorhandenen Endpunkts zurück, ohne einen neuen hinzuzufügen, wenn der Endpunkt bereits hinzugefügt wurde. In jedem Fall können Endpunktinformationen abgerufen werden. Abonnieren Sie diese also basierend auf diesen Informationen.

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.

Abonnieren Sie den Endpunkt für das Thema

Das ist ein bisschen mühsam.

Sie können subscribe () einfach ausführen, um sich anzumelden. Im Falle einer Abmeldung ist jedoch SubscriptionArn des Zielterminals erforderlich. Dieses Mal führe ich subscribe () einmal aus, um SubscriptionArn abzurufen, und verwende es dann, um unsubscribe () auszuführen.

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

Frage

Dies ist der letzte Weg, um das Abonnement Arn zu erhalten, aber selbst wenn Sie sich das Handbuch ansehen, können Sie keine so gute Methode finden. Bitte weisen Sie darauf hin, ob es eine geeignete Methode gibt.

Erneut testen

Ich habe zum Zeitpunkt der Ausführung einen etwas unklaren Fehler erhalten, daher habe ich das boto3-Handbuch und den Code überprüft, aber ich denke, dass es einfacher ist, wie folgt zu schreiben. Das Umschreiben hat den Fehler jedoch nicht verbessert, daher denke ich, dass der Client ein Client auf niedriger Ebene ist.

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

Terminalzuordnung von der Serverseite zu Amazon SNS (Python + Boto3)
Push-Benachrichtigung vom Python-Server an Android
[Amazon Linux] Wechsel von der Python 2-Serie zur Python 3-Serie
Versuchen Sie es mit Pythons Webframework Django (1) - Von der Installation bis zum Serverstart
Kopieren Sie Daten von Amazon S3 mit Python (boto) in Google Cloud Storage.
[Python] Senden Sie das von der Webkamera aufgenommene Bild an den Server und speichern Sie es
Senden Sie eine Nachricht von Slack an einen Python-Server
So messen Sie die Leitungsgeschwindigkeit vom Terminal aus
[Python] Ich werde FTP auf den FTP-Server hochladen.
[Python] So entfernen Sie doppelte Werte aus der Liste
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Änderungen von Python 3.0 zu Python 3.5
Senden Sie Protokolldaten vom Server an Splunk Cloud
Ich wollte die Python-Bibliothek von MATLAB verwenden
So starten Sie Jupyter Notebook sofort vom Terminal aus
Ich habe die Python-Version von 2 auf 3 erhöht, aber jedes Mal, wenn ich das Ubuntu-Terminal neu starte, bleibt die Version 2.
Abfrage von Python an Amazon Athena (unter Verwendung des benannten Profils)
ODBC-Zugriff auf SQL Server von Linux mit Python
Python-Skript, das den Status des Servers über den Browser überprüfen kann
[Postgresql] SSH-Verbindung zum externen DB-Server vom Client
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Programm zur Beurteilung, ob es nach dem westlichen Kalender ein ruhiges Jahr ist [Python]
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Extrahieren Sie den Wert, der einem Wert am nächsten kommt, aus einem Listenelement in Python
Post von Python nach Slack
Flirte von PHP nach Python
Anaconda aktualisiert von 4.2.0 auf 4.3.0 (python3.5 aktualisiert auf python3.6)
Ich habe vom Terminal getwittert!
Wechseln Sie von Python2.7 zu Python3.6 (centos7)
Stellen Sie von Python aus eine Verbindung zu SQLite her
Ich habe etwas mit Python gemacht, das sich JETZT LADEN auf dem Terminal von links nach rechts bewegt
Eine einfache Möglichkeit, die Amazon-Produkt-API in Python aufzurufen
Wiederholen Sie mit While. Skript zum Twittern oder Suchen vom Terminal aus
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
Klicken Sie in Python auf die New Relic-API, um den Status des Servers abzurufen
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
[Python + Heroku] Vom Zustand ohne Python zur Anzeige von etwas mit Heroku (Teil 2)
Ändern Sie die aktive Version in Pyenv von Anaconda in einfaches Python
Rufen Sie Matlab von Python zur Optimierung auf
Überlassen Sie die mühsame Verarbeitung Python
Post von Python auf Facebook Timeline
[Lambda] [Python] Von Lambda auf Twitter posten!
Existenz aus Sicht von Python
Im Python-Befehl zeigt Python auf Python3.8
So erhalten Sie die Python-Version
Stellen Sie von Python aus eine Verbindung zur utf8mb4-Datenbank her
Python (vom ersten Mal bis zur Ausführung)
Poste ein Bild von Python auf Tumblr
Verwenden Sie die Flickr-API von Python
So greifen Sie über Python auf Wikipedia zu
Python, um von einer anderen Sprache zu wechseln
Versuchen Sie es mit Amazon DynamoDB von Python
[Python] Ändere das Alphabet in eine Zahl
Hat sich nicht von Python 2 auf 3 geändert
Aktualisieren Sie Mac Python von 2 auf 3
Ermitteln Sie mit Selenium + PhantomJS + Python die Breite des Div auf der Serverseite
Ich konnte den Thermodrucker "PAPERANG" aus Python (Windows10, Python3.6) drucken.