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