[PYTHON] Erstellen wir es, indem wir den Protokollpuffer mit Serverless Framework auf die API anwenden.

TL;DR

Ich habe den Wunsch, den API-Bereich mit dem Serverless Framework etwas besser zu behandeln, und ich habe es mit dem Protokollpuffer versucht, daher werde ich ihn freigeben.

Was ist Protokollpuffer?

https://developers.google.com/protocol-buffers

Es ist keine neue Technologie, aber es ist eine Interface Description Language (IDL). Es wurde von Google entwickelt und scheint ursprünglich schneller als XML entwickelt worden zu sein. Es wird oft als Protobuf abgekürzt. Der Artikel zum Protokollpuffer ist leicht zu verstehen. Lesen Sie ihn daher bitte. https://qiita.com/yugui/items/160737021d25d761b353

Warum Protokollpuffer für Serverless Framework verwenden?

Ursprünglich wurde der Dienst hauptsächlich auf dem Serverless Framework erstellt und verwaltet. Die erste Motivation bestand darin, die Nutzung gemeinsam zu nutzen, wenn mehrere Clients vorhanden sind und auf dieselbe API über das Web oder die native App zugegriffen werden kann. Selbst wenn ich die erwarteten Dienste und Sensordaten auf einmal gesendet habe, habe ich mich gefragt, ob ich die Daten aufgrund des großen Kommunikationsaufwands irgendwie komprimieren könnte, also habe ich darüber nachgedacht.

Stichprobe

https://github.com/hisato-kawaji/protocol-buffer-with-serverless-sample

Dinge die zu tun sind

Ich habe versucht, einen Dienst nur für API Gateway + Lambda mit Lambda-Code unter der Annahme von Python bereitzustellen. (Der grundlegende Inhalt des Serverless Framework wird weggelassen und die Geschichte, die sich auf den Protokollpuffer konzentriert, wird beschrieben.)

Plugin hinzufügen

Fügen Sie dem Plugin "Serverless-Python-Anforderungen" und "Serverless-Apigw-Binary" hinzu.

sls plugin install --name serverless-python-requirements
sls plugin install --name serverless-apigw-binary

Es wird auch in `serverless.yml beschrieben. ``

plugins:
  - serverless-python-requirements
  - serverless-apigw-binary
custom:
.
.
.
  apigwBinary:
    types:
      - 'application/x-protobuf'

requierement.txt Da es sich bei Lambda um ProtoBuf handelt, müssen wir Protobuf importieren. Erstellen Sie also die Datei request.txt.

protobuf==3.5.1
six==1.11.0

Schemaerstellung

Installieren Sie protobuf im Voraus.

git clone git://github.com/openx/python3-protobuf.git
cd python3-protobuf
./autogen.sh
./configure --prefix=$PREFIX #Geben Sie das Installationsziel von protobuf an
make
make check
sudo make install

cd python #Python-Bindung
python setup.py build
python setup.py test
sudo python setup.py install

Erstellen Sie eine .proto-Datei und definieren Sie das Schema.

sample.proto


syntax = "proto3";

message Test {
  string test_id = 1;
  string hoge = 2;
}

Nach dem Erstellen des Schemas ist es Zeit zum Erstellen.


protoc -I=. --python_out=. sample.proto

Nach dem Ausführen des Befehls wird "sample_pb2.py" generiert.

Implementierung der Lambda-Funktion

Schreiben Sie die Funktion in serverless.yml.

functions:
  Get:
    handler: handler.get
    package:
      include:
        sample_pb2.py
      exclude:
        - serverless.yml
    events:
      - http:
          path: get
          method: post
          cors: true
          private: true

Bereiten Sie handler.py vor und installieren Sie ProtoBuf. Wenn Sie dem Body serialisierte Daten mit Protocol Buffer geben und mit Lambda analysieren, können Sie damit umgehen. Wenn Sie mit Antwort zurückkehren möchten, können Sie durch Serialisieren und Behandeln mit Zeichenfolge antworten.

mport json
import sample_pb2
import base64

def get(event, context):
    obj = sample_pb2.Test()
    obj.ParseFromString(base64.b64decode(event['body']))
    obj.test_id = 'bbb'
    response = {
        'statusCode': 200,
        'headers': { 
            "Access-Control-Allow-Origin": "*",
            'Content-Type': 'application/x-protobuf' 
        },
        'body': obj.SerializeToString().decode('utf-8'),
        'isBase64Encoded': True
    }

    return response

Das? Einfach?

Es fiel mir schwer, mich an die Arbeit mit dem Protokollpuffer zu gewöhnen, aber die Integration selbst dauerte nicht lange. Wenn überhaupt, war es ein ziemliches Problem, mit Lambda zu debuggen, wenn es nach der Definition des Schemas unter Python verarbeitet wurde.

Zusammenfassung / Ausblick

Vielen Dank.

Recommended Posts

Erstellen wir es, indem wir den Protokollpuffer mit Serverless Framework auf die API anwenden.
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Ich habe versucht, eine RESTful-API zu erstellen, indem ich die explosive Fast-API des Python-Frameworks mit MySQL verbunden habe.
Ein Skript, mit dem Sie mit der LINE Messaging-API auf einfache Weise umfangreiche Menüs erstellen können
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Erstellen wir ein einfaches Empfangssystem mit dem serverlosen Python-Framework Chalice und Twilio
Verwenden Sie die Twitter-API, um die von Twitter benötigte Zeit zu verkürzen (erstellen Sie eine Hervorhebungszeitleiste).
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Erstellen Sie eine Python-Version der Lambda-Funktion (+ Lambda-Schicht) mit Serverless Framework
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Fügen wir es der Umgebungsvariablen mit dem Befehl ~ hinzu
Erstellen Sie ein zweidimensionales Array, indem Sie am Ende eines leeren Arrays mit numpy eine Zeile hinzufügen
Lassen Sie uns twittern, indem wir das Terminal treffen und mit Selen schreien! !!
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Der erste Schritt beim Erstellen einer serverlosen Anwendung mit Zappa
[Django] Übergeben Sie die von der API authentifizierte Benutzerinstanz an ModelSerializer
Berühren wir die API der Netatmo Weather Station mit Python. #Python #Netatmo
Mit der LINE WORKS-Kalender-API können Sie Termine an andere Personen weitergeben
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services mit Python zu überprüfen. # 1
Ich habe zum ersten Mal versucht, mit DynamoDB und Step Functions eine serverlose Stapelverarbeitung zu erstellen
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services in Python zu überprüfen. # 2