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.
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
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.
https://github.com/hisato-kawaji/protocol-buffer-with-serverless-sample
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.)
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
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.
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
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.
Vielen Dank.
Recommended Posts