[PYTHON] Créons-le en appliquant Protocol Buffer à l'API avec Serverless Framework.

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.

Qu'est-ce que Protocol Buffer?

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

Pourquoi utiliser Protocol Buffer pour Serverless Framework?

À 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é.

échantillon

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

Choses à faire

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.)

Ajouter un plugin

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

Création de schéma

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é.

Implémentation de la fonction Lambda

É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

cette? Facile?

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.

Résumé / Prospect

Merci beaucoup.

Recommended Posts

Créons-le en appliquant Protocol Buffer à l'API avec Serverless Framework.
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
La première API à créer avec le framework Python Djnago REST
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
Un script qui facilite la création de menus riches avec l'API de messagerie LINE
Comment créer une API de machine learning sans serveur avec AWS Lambda
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
Utilisez l'API Twitter pour réduire le temps nécessaire à Twitter (créer une chronologie de mise en évidence (comme))
Comment créer un sous-menu avec le plug-in [Blender]
Créer une fonction Lambda de version Python (+ couche Lambda) avec Serverless Framework
Essayez de créer une application Todo avec le framework Django REST
Créez une carte thermique de tweet avec l'API Google Maps
Ajoutons-le à la variable d'environnement à partir de la commande ~
Créez un tableau à deux dimensions en ajoutant une ligne à la fin d'un tableau vide avec numpy
Tweettons en frappant le terminal tout en criant avec Selenium! !!
Probablement le moyen le plus simple de créer un pdf avec Python 3
La première étape de la création d'une application sans serveur avec Zappa
[Django] Transmettez l'instance utilisateur authentifiée par l'API à ModelSerializer
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
Donnez des rendez-vous à d'autres avec l'API de calendrier LINE WORKS
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 1
J'ai essayé de créer un traitement par lots sans serveur pour la première fois avec DynamoDB et Step Functions
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2