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.
Drücken Sie "API erstellen" vom API-Gateway und drücken Sie Wir werden die WebSocket-API erstellen.
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 |
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.
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 |
Artikel | Inhalt | Tasteneinstellung |
---|---|---|
user_id | Verbindungs-ID | Partitionsschlüssel |
created_at | Erstelldatum | Sortierschlüssel |
message | Botschaft |
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 |
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' }
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' }
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' }
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'
}
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 |
Nachdem der Stammschlüssel verknüpft wurde, stellen wir die WebSocket-API bereit. Dieses Mal wird der Künstlername mit "Test" erstellt.
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.
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!
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.
Wenn Sie Vorschläge haben, kommentieren Sie bitte!
Recommended Posts