[PYTHON] Erstellen wir eine Chat-Funktion mit Vue.js + AWS Lambda + Dynamo DB [AWS-Einstellungen]

Da wir diesmal die Chat-Funktion implementiert haben, werden wir einen Artikel als Memorandum hinterlassen.

Nach dem Erstellen von AWS Lambda werde ich einen Artikel über die Einstellungen auf der Vorderseite veröffentlichen. Die AWS-Seite wird mit der Konfiguration von "API Gateway + Lambda + DynamoDB" erstellt.

API-Gateway-Einstellungen

① API aus API Gateway erstellen

Drücken Sie "API erstellen" vom API-Gateway und drücken Sie Wir werden die WebSocket-API erstellen. 1_API_gateway.png 2_API_gateway.png

② API und Routenauswahlformel festlegen

Stellen Sie das Protokoll mit den folgenden Inhalten ein.

Protokoll: WebSocket

Artikel Inhalt
API-Name vue_chat_test
Routenauswahlformel $request.body.action
Erläuterung vue_chat_test

3_プロトコル-2.png

③ Stellen Sie den Root-Schlüssel ein

Nach dem Erstellen der API wechselt der Bildschirm zum Bildschirm zum Erstellen des Stammschlüssels. Dieses Mal setzen wir jeden Root-Schlüssel unten.

Schlüsselname Verwenden
$connect Wird verwendet, wenn der Client die WebSocket-Kommunikation startet
$disconnect Wird verwendet, wenn der Client die WebSocket-Kommunikation beendet
$default Wird verwendet, wenn kein entsprechender Stammschlüssel vorhanden ist
sendmessage Wird beim Senden einer Nachricht verwendet
getmessages Wird beim Abrufen einer Nachricht verwendet

Da der Stammschlüssel jedoch nur erstellt werden kann, wenn die Lambda-Funktion erstellt wurde, Erstellen Sie zunächst die dynamoDB-Tabelle und die Lambda-Funktion.

Erstellen Sie eine Tabelle mit dynamoDB

dynamoDB wird mit den folgenden Inhalten erstellt. Die Konfiguration ist eine Annahme eines Chats, in dem Sie die an Sie gesendeten Nachrichten sehen können.

Artikel Inhalt Tasteneinstellung
connection_id Verbindungs-ID Partitionsschlüssel
user_id Benutzeridentifikation
  • messages
Artikel Inhalt Tasteneinstellung
user_id Verbindungs-ID Partitionsschlüssel
created_at Erstelldatum Sortierschlüssel
message Botschaft
  • Beim Erstellen als Chat-Funktion Ich denke, Sie benötigen Informationen wie den Zimmerausweis, der ihn an wen gesendet hat, und Informationen lesen. Diesmal ist es eine einfache Chat-Funktion, daher werde ich es nur mit diesen Informationen machen.

Erstellen Sie die Lambda-Funktion

Die Laufzeit erstellt die folgende Lambda-Funktion mit Python3.8.

Funktion Inhalt Zugriffsberechtigungseinstellungen
OnConnect In der Verbindungstabelle
Verbindungs-ID / Benutzer-ID speichern
dynamoDB
OnDisconnect Datensatz in Verbindungstabelle löschen dynamoDB
SendMessage Nachricht speichern dynamoDB,ExecuteAPI
GetMessages Nachricht abrufen dynamoDB,ExecuteAPI
  • Die Zugriffsberechtigung wurde einmal mit der vollständigen Zugriffsberechtigung festgelegt
  • OnConnect
import json
import boto3

#Holen Sie sich die Tabelle von dynamoDB
dynamodb = boto3.resource('dynamodb')
connections = dynamodb.Table('connections')

def lambda_handler(event, context):

    #Holen Sie sich "connectionId, userId"
    connection_id = event.get('requestContext',{}).get('connectionId')
    user_id = event.get('queryStringParameters',{}).get('userId')

    #Zur Verbindungstabelle hinzufügen
    result = connections.put_item(
        Item={
            'connection_id': connection_id,
            'user_id': str(user_id)
        }
    )
    return { 'statusCode': 200,'body': 'ok' }
  • OnDisconnect
import json
import boto3

dynamodb = boto3.resource('dynamodb')
connections = dynamodb.Table('connections')

def lambda_handler(event, context):
    connection_id = event.get('requestContext',{}).get('connectionId')
    result = connections.delete_item(Key={ 'connection_id': connection_id })
    return { 'statusCode': 200, 'body': 'ok' }
  • SendMessage
import json
import boto3
import json
from boto3.dynamodb.conditions import Key, Attr
from datetime import datetime, timedelta, timezone

#Holen Sie sich die Tabelle von dynamoDB
dynamodb = boto3.resource('dynamodb')
connections = dynamodb.Table('connections')
messages = dynamodb.Table('messages')

#TimeZone-Einstellungen
JST = timezone(timedelta(hours=+9), 'JST')

def lambda_handler(event, context):

	#Parametererfassung
    body = json.loads(event["body"])
    user_id = body['user_id']
    message = body['message']
    
    #Erstellungsdatum und -zeit
    now = "{0:%Y-%m-%d %H:%M:%S}".format(datetime.now(JST))

    #In Nachrichtentabelle speichern
    messages.put_item(
        Item={
            'user_id': user_id,
            'message': message,
            'created_at': now
        }
    )

    #ApiGatewayManagementApi-Einstellungen
    domain_name   = event.get('requestContext',{}).get('domainName')
    stage         = event.get('requestContext',{}).get('stage')
    apigw_management = boto3.client('apigatewaymanagementapi',
                                    endpoint_url=F"https://{domain_name}/{stage}")
                                   
    #Zielbenutzerverbindung_ID abrufen
    connection_items = connections.scan(
		ProjectionExpression="connection_id",
        FilterExpression=Attr("user_id").eq(str(user_id))
	).get('Items')    
 
    if len(connection_items) == 0:
	    return { 'statusCode': 200,'body': 'ok' }

    #Nachrichteninformationen abrufen
    get_message_items = messages.query(
        KeyConditionExpression=Key("user_id").eq(str(user_id)) & Key("created_at").lte(now),
        ScanIndexForward=True
    ).get('Items')

    #Nachricht festlegen, wenn eine Nachricht vorhanden ist, leeres Array, wenn nicht
    content_all = [] if len(get_message_items) == 0 else get_message_items

	#Nachricht an den Zielbenutzer zurückgeben
    for item in connection_items:
        _ = apigw_management.post_to_connection(ConnectionId=item['connection_id'],
                                                    Data=json.dumps(content_all))

    return { 'statusCode': 200,'body': 'ok' }
  • GetMessages
import boto3
import json
from boto3.dynamodb.conditions import Key, Attr
from datetime import datetime, timedelta, timezone


#Tabellendefinition
dynamodb_client = boto3.client('dynamodb')
dynamodb = boto3.resource('dynamodb')
connections = dynamodb.Table('connections')
messages = dynamodb.Table('messages')

#TimeZone-Einstellungen
JST = timezone(timedelta(hours=+9), 'JST')

def lambda_handler(event, context):

    #Setzen Sie die Parameterinformationen auf Variable
    body = json.loads(event["body"])
    user_id = body['user_id']
    connection_id = event.get('requestContext',{}).get('connectionId')
    domain_name = event.get('requestContext',{}).get('domainName')
    stage       = event.get('requestContext',{}).get('stage')

    #Überprüfen Sie, ob die Verbindungs-ID übereinstimmt
    connection_items = connections.query(
        ProjectionExpression="connection_id",
        KeyConditionExpression=Key("connection_id").eq(connection_id),
        FilterExpression=Key('user_id').eq(str(user_id)),
    ).get('Items')

    if len(connection_items) == 0:
        return { 'statusCode': 500,'body': 'something went wrong' }
    
    #ApiGatewayManagementApi-Einstellungen
    apigw_management = boto3.client('apigatewaymanagementapi',
                                    endpoint_url=F"https://{domain_name}/{stage}")
    
    #Erfassungsdatum und -zeit
    now = "{0:%Y-%m-%d %H:%M:%S}".format(datetime.now(JST))

    #Nachrichteninformationen abrufen
    get_message_items = messages.query(
        KeyConditionExpression=Key("user_id").eq(str(user_id)) & Key("created_at").lte(now),
        ScanIndexForward=True
    ).get('Items')

    #Nachricht festlegen, wenn eine Nachricht vorhanden ist, leeres Array, wenn nicht
    content_all = [] if len(get_message_items) == 0 else get_message_items

    #POST eine Nachricht an die Verbindung
    _ = apigw_management.post_to_connection(
        ConnectionId=connection_id,
        Data=json.dumps(content_all)
    )
    
    return {
        'statusCode': 200,
        'body': 'ok'
    }

Verknüpfen des Root-Schlüssels und Lambda

Wir werden das erstellte Lambda mit dem Stammschlüssel von API Gateway verknüpfen.

Root-Schlüssel Lambda-Funktion
$connect OnConnect
$disconnect OnDisconnect
$default OnConnect
sendmessage SendMessage
getmessages GetMessages

4_ルートキーとLambdaの紐付け.png

Stellen Sie die erstellte WebSocket-API bereit

Nachdem der Stammschlüssel verknüpft wurde, stellen wir die WebSocket-API bereit. Dieses Mal wird der Künstlername mit "Test" erstellt.

5_デプロイ.png

Nach Abschluss der Bereitstellung erhalten Sie eine WebSocket-URL und eine Verbindungs-URL. Dies ist die URL, die für die Kommunikation mit der Rezeption erforderlich ist.

Damit sind die Einstellungen auf der AWS-Seite abgeschlossen, und schließlich werden wir nur den Vorgang überprüfen.

Bestätigter Betrieb der WebSocket-API mit wscat

Installieren Sie wscat

$ npm install -g wscat

Verwenden Sie wscat, um den Vorgang zu überprüfen und zu bestätigen, dass die Daten in dynamoDB gespeichert sind.

$ wscat -c [WebSocket URL]?userId=A

Connected (press CTRL+C to quit)
> {"action":"sendmessage","user_id": "A", "message": "Test"}
[{"message": "Test", "user_id": "A", "created_at": "2020-08-29 17:22:43"}]

> {"action":"getmessages", "user_id": "A"}
[{"message": "Test", "user_id": "A", "created_at": "2020-08-29 17:22:43"}]

Klicken Sie hier für den Status von dynamoDB!

スクリーンショット 2020-08-29 17.29.17.png スクリーンショット 2020-08-29 17.29.21.png

Zusammenfassung

Ich habe eine AWS-Einstellung für die Chat-Funktion mit "Vue.js + AWS Lambda + Dynamo DB" erstellt. Dieses Mal habe ich es hauptsächlich für die Arbeit erstellt, daher denke ich, dass im Fehlerfall nicht viel verarbeitet wird und dass viele andere Dinge zu beachten sind, um es tatsächlich zu implementieren.

Als Nächstes erstellen wir mit Vue.js einen Frontbildschirm und kommunizieren mit der API.

  • Datum und Uhrzeit der Buchung sind unentschieden

Wenn Sie Vorschläge haben, kommentieren Sie bitte!

Recommended Posts