TL;DR
J'ai le désir de gérer un peu plus la zone API avec le Serverless Framework, et je l'ai essayé avec le Protocol Buffer, donc je vais le partager.
https://developers.google.com/protocol-buffers
Ce n'est pas une nouvelle technologie, mais c'est un langage de description d'interface (IDL). Il a été développé par Google et semble avoir été conçu à l'origine pour être plus rapide que XML. Il est souvent abrégé en Protobuf. Quant à Protocol Buffer, cet article est facile à comprendre, veuillez donc vous y référer. https://qiita.com/yugui/items/160737021d25d761b353
À l'origine, le service était construit et géré principalement sur le Framework Serverless, donc la première motivation était de pouvoir partager l'utilisation lorsqu'il y a plusieurs clients, et la même API est accessible depuis le Web ou l'application native. Même si les services attendus et les données des capteurs sont envoyés ensemble, je me demandais s'il serait possible de compresser les données en raison de la grande quantité de communication, alors je l'ai considéré.
https://github.com/hisato-kawaji/protocol-buffer-with-serverless-sample
J'ai essayé de fournir un service uniquement pour API Gateway + Lambda avec du code Lambda en supposant Python. (Le contenu de base de Serverless Framework est omis et l'histoire centrée sur le Protocol Buffer est décrite.)
Ajoutez serverless-python-requirements
et serverless-apigw-binary
au plugin.
sls plugin install --name serverless-python-requirements
sls plugin install --name serverless-apigw-binary
Il est également décrit dans `serverless.yml. ''
plugins:
- serverless-python-requirements
- serverless-apigw-binary
custom:
.
.
.
apigwBinary:
types:
- 'application/x-protobuf'
requierement.txt Puisque nous avons affaire à ProtoBuf sur Lambda, nous devons importer protobuf. Alors, créez exigence.txt.
protobuf==3.5.1
six==1.11.0
Installez protobuf à l'avance.
git clone git://github.com/openx/python3-protobuf.git
cd python3-protobuf
./autogen.sh
./configure --prefix=$PREFIX #Spécifiez la destination d'installation de protobuf
make
make check
sudo make install
cd python #Liaison Python
python setup.py build
python setup.py test
sudo python setup.py install
Créez un fichier .proto
et définissez le schéma.
sample.proto
syntax = "proto3";
message Test {
string test_id = 1;
string hoge = 2;
}
Après avoir créé le schéma, il est temps de construire.
protoc -I=. --python_out=. sample.proto
Après avoir exécuté la commande, sample_pb2.py
sera généré.
Écrivez la fonction dans 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
Préparez handler.py
et installez réellement ProtoBuf. Si vous donnez au corps des données sérialisées avec Protocol Buffer et que vous les analysez avec Lambda, vous pouvez les gérer.
Si vous souhaitez revenir avec Response, vous pouvez répondre en sérialisant et en manipulant avec une chaîne.
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
J'ai eu du mal à m'habituer à travailler avec Protocol Buffer, mais l'intégration elle-même n'a pas pris beaucoup de temps. Si quoi que ce soit, c'était assez pénible de déboguer avec Lambda lors de sa gestion sur Python après avoir défini le schéma.
Merci beaucoup.
Recommended Posts