Utiliser des packages Python supplémentaires avec Serverless Framework (v1.x)

Calendrier de l'Avent Serverless (2) Ceci est l'article du 17ème jour. Pour être honnête, ce n'est pas une grande histoire ... (^ _ ^;) J'étais inquiet du manque d'informations Python dans Serverless Framework (v1.x), alors j'ai essayé ceci. (Ajouté à 06:17 le 17 décembre) Pour une autre raison, j'ai changé les données d'entrée de CSV en JSON.

Contexte

À l'origine, dans notre "[IoT Easy Pack](http://dc.ogis-ri.co.jp/iotpack/" IoT Easy Pack ")", le seul courtier de messages pouvant être sélectionné est MQTT, et il doit prendre en charge HTTPS. C'était parce que je ne pouvais pas le faire. (Il peut être publié même avec REST d'AWS IoT, mais l'authentification est trop spéciale et cette fois le périphérique cible est une puce de micro-ordinateur, j'ai donc dû rendre l'API aussi simple que possible ... ^^;)

La dernière fois, j'ai essayé d'exécuter l'exemple avec API Gateway tel qu'il est avec Serverless Framework (v1.1). [J'ai essayé d'utiliser Serverless Framework](http://qiita.com/daikunjp/items/2b8aa35ecd104001f4e5 J'ai essayé d'utiliser Serverless Framework)

Cette fois, je voudrais créer une API qui insère les données CSV PUT dans l'API Web dans MySQL.

Procédure de construction de l'API Web à l'aide de Serverless Framework

Mise à niveau de la version du Framework sans serveur

Comme il a été mis à jour vers la v1.3 avant que je le sache, je vais mettre à niveau l'environnement que j'ai créé [la dernière fois](http://qiita.com/daikunjp/items/2b8aa35ecd104001f4e5 j'ai essayé d'utiliser Serverless Framework).

% npm install -g serverless

Vérifier la version

% sls --version
1.3.0

Création de projet

Créer et initialiser le répertoire du projet

% mkdir iot-api
% cd iot-api
% sls create --template aws-python --name iot-api

Ajout de la bibliothèque MySQL pour Python

Je dois mettre le pilote MySQL en Python de lambda ... Quand je regarde le manuel, il dit que pip peut être utilisé pour Python, donc j'ai installé mysql-python avec pip normalement, mais cela ne fonctionne pas. Apparemment, si vous le mettez dans le répertoire du projet, il sera placé dans le zip qui sera téléchargé sur lambda tel quel, alors installez-le dans le répertoire du projet en suivant les étapes ci-dessous.

% pip install mysql-python -t .

Copier l'objet partagé dans le répertoire actuel

% cp /usr/lib64/mysql/libmysqlclient.so.18 .

Modifier serverless.yml

Modifiez serverless.yml comme suit. Cette fois, les paramètres VPC sont également ajoutés pour accéder à RDS MySQL à partir de lambda 【référence】 https://serverless.com/framework/docs/providers/aws/guide/functions/ http://dev.classmethod.jp/etc/serverless-framework-lambda-function-run-in-vpc/

serverless.yml


service: iot-api
provider:
  name: aws
  runtime: python2.7
  vpc:
   securityGroupIds:
     - sg-xxxxxxxx ← ID du groupe de sécurité
   subnetIds:
     - subnet-xxxxxxxx ← ID de sous-section
     - subnet-xxxxxxxx ← ID de sous-section
  stage: dev
  region: ap-northeast-1
  iamRoleStatements:
  - Effect: "Allow"
    Action:
      - "ec2:CreateNetworkInterface"
      - "ec2:DescribeNetworkInterfaces"
      - "ec2:DeleteNetworkInterface"
    Resource:
      - "*"
functions:
  iotput:
    handler: handler.iotput
    events:
      - http:
          path: iotput
          method: put

Code Python

Cliquez ici pour le code qui fonctionne réellement Comme c'est pour la démo, je ne vérifie pas du tout les arguments (^ _ ^;)

handler.py


# -*- coding: utf-8 -*-
import MySQLdb,json

HOST = "Nom d'hôte du RDS à connecter"
DBNAME = "Nom de la base de données"
DBUSER = "Nom d'utilisateur DB"
PASSWD = "mot de passe"
CHARSET = "utf8"

def iotput(event, context):

  # MySQL Connect
    connect = MySQLdb.connect(host=HOST, db=DBNAME, user=DBUSER, passwd=PASSWD, charset=CHARSET)
    connect.cursorclass = MySQLdb.cursors.DictCursor
    cursor = connect.cursor()

  # BODY Data split for CSV
  #  data1 = event['body'].split(",")
  # BODY Data split for JSON
    data1 = json.loads(event['body'])
    data1[0] = data1['data1']
    data1[1] = data1['data2']
    data1[2] = data1['data3']

  # MySQL Data insert
    cursor.execute("insert into sensor01(data1,data2,data3) values(%s,%s,%s)",
        (data1[0],data1[1],data1[2]))
    connect.commit()
    cursor.close()
    connect.close()

    body = {
        "message": "input data is %s %s %s" % (data1[0],data1[1],data1[2]),
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

Déployer

% sls deploy
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (916.94 KB)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..............
Serverless: Stack update finished...

Service Information
service: iot-api
stage: dev
region: ap-northeast-1
api keys:
  None
endpoints:
  PUT - https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/iotput
functions:
  iot-api-dev-iotput: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxx:function:iot-api-dev-iotput

tester

Essayez de tester avec curl depuis une autre machine.

% curl -X PUT  -d '{"data1":"10","data2":"20","data3":"40"}' https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/iotput
{"message": "input data is 10 20 40"}
% curl -X PUT  -d '{"data1":"1.1","data2":"5.4","data3":"2.7"}' https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/iotput
{"message": "input data is 1.1 5.4 2.7"}

Vérifiez le résultat

mysql> select * from sensor01;
+-------+-------+-------+
| data1 | data2 | data3 |
+-------+-------+-------+
|    10 |    20 |    40 |
|   1.1 |   5.4 |   2.7 |
+-------+-------+-------+
2 rows in set (0.01 sec)

Recommended Posts

Utiliser des packages Python supplémentaires avec Serverless Framework (v1.x)
Touchez AWS avec Serverless Framework et Python
[Python] Utiliser JSON avec Python
Utiliser mecab avec Python 3
Utiliser DynamoDB avec Python
Utilisez Python 3.8 avec Anaconda
Utiliser python avec docker
Créer une fonction Lambda de version Python (+ couche Lambda) avec Serverless Framework
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Utiliser l'API Trello avec python
Facilement sans serveur avec Python en utilisant Calice
Utiliser l'API Twitter avec Python
Utiliser TUN / TAP avec Python
Utiliser l'API subsonique avec python3
Simplifiez-vous la tâche avec les exigences Python sans serveur
[Package cloud] Gérez les packages python avec le package cloud
Python: comment utiliser async avec
Utiliser la caméra Point Grey avec Python (PyCapture2)
Utilisez vl53l0x avec RaspberryPi (python)
Comment utiliser correctement le package de visualisation Python
Utilisez NAIF SPICE TOOL KIT avec Python
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
Utiliser la synthèse vocale Windows 10 avec Python
[Django] Utiliser MessagePack avec le framework Django REST
Utiliser OpenCV avec Python 3 dans Window
Utiliser PostgreSQL avec Lambda (Python + psycopg2)
Comment utiliser les variables d'environnement Serverless Framework et Python et gérer les étapes
Installer Python en tant que Framework avec pyenv
Utilisez smbus avec python3 sous environnement pyenv
Utiliser DeepL avec python (pour la traduction d'articles)
Utiliser Amazon Simple Notification Service avec Python
[Introduction à Python] Utilisons foreach avec Python
Utilisez PIL ou Pillow avec Cygwin Python
Utiliser le chiffrement de la bibliothèque de chiffrement avec l'image Python de Docker
Utiliser Application Insights avec Python 3 (y compris les bouteilles)
Créez un framework Web avec Python! (1)
Utilisation des fonctions C ++ de python avec pybind11
API de reconnaissance faciale sans serveur conçue avec Python
Utilisez le pilote Web phantomjs de sélénium avec unittest de python
Jusqu'à ce que vous puissiez utiliser opencv avec python
Utiliser Python et MeCab avec Azure Functions
Créez un framework Web avec Python! (2)
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
Si vous voulez créer un bot discord avec python, utilisons un framework
Je veux utiliser MATLAB feval avec python
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Utilisez Logger avec Python pour le moment
Python> Exécuter avec des arguments d'exécution> Utiliser import argparse
Utiliser plusieurs versions de l'environnement python avec pyenv
Envelopper C avec Cython pour une utilisation à partir de Python
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
J'ai créé un Bot LINE avec Serverless Framework!
Le moyen le plus simple d'utiliser OpenCV avec python
Utilisez diverses fonctionnalités de rabbimq avec python pika
Je souhaite utiliser le répertoire temporaire avec Python2