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.
À 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.
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éer et initialiser le répertoire du projet
% mkdir iot-api
% cd iot-api
% sls create --template aws-python --name iot-api
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 .
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
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
% 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
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