Serverloser (2) Adventskalender Dies ist der Artikel am 17. Tag. Um ehrlich zu sein, ist es keine große Geschichte, aber ... (^ _ ^;) Ich war besorgt über den Mangel an Python-Informationen in Serverless Framework (v1.x) und habe dies versucht. (Hinzugefügt am 17. Dezember um 6:17 Uhr) Aus einem anderen Grund habe ich die Eingabedaten von CSV in JSON geändert.
Ursprünglich kann in unserem "[IoT Easy Pack](http://dc.ogis-ri.co.jp/iotpack/" IoT Easy Pack ") MQTT als einziger Nachrichtenbroker ausgewählt werden, der HTTPS unterstützen muss. Es war, weil ich es nicht konnte. (Es kann sogar mit REST von AWS IoT veröffentlicht werden, aber die Authentifizierung ist zu speziell und dieses Mal ist das Zielgerät ein Mikrocomputerchip, daher musste ich die API so einfach wie möglich gestalten ... ^^;)
Beim letzten Mal habe ich versucht, das Beispiel mit API Gateway wie mit Serverless Framework (v1.1) auszuführen. [Ich habe versucht, Serverless Framework zu verwenden](http://qiita.com/daikunjp/items/2b8aa35ecd104001f4e5 Ich habe versucht, Serverless Framework zu verwenden)
Dieses Mal möchte ich eine API erstellen, die CSV-Daten-PUT in die Web-API in MySQL einfügt.
Da es auf Version 1.3 aktualisiert wurde, bevor ich es wusste, werde ich die Umgebung aktualisieren, die ich [beim letzten Mal] erstellt habe (http://qiita.com/daikunjp/items/2b8aa35ecd104001f4e5 Ich habe versucht, Serverless Framework zu verwenden).
% npm install -g serverless
Version prüfen
% sls --version
1.3.0
Erstellen und initialisieren Sie das Projektverzeichnis
% mkdir iot-api
% cd iot-api
% sls create --template aws-python --name iot-api
Ich muss den MySQL-Treiber in Python von Lambda setzen ... Wenn ich mir das Handbuch ansehe, heißt es, dass pip für Python verwendet werden kann, also habe ich mysql-python normalerweise mit pip installiert, aber es funktioniert nicht. Wenn Sie es in das Projektverzeichnis stellen, wird es anscheinend in die Zip-Datei gestellt, die so wie es ist auf Lambda hochgeladen wird. Installieren Sie es also im Projektverzeichnis, indem Sie die folgenden Schritte ausführen.
% pip install mysql-python -t .
Kopieren Sie das freigegebene Objekt in das aktuelle Verzeichnis
% cp /usr/lib64/mysql/libmysqlclient.so.18 .
Bearbeiten Sie serverless.yml wie folgt. Dieses Mal werden auch VPC-Einstellungen hinzugefügt, um von Lambda aus auf RDS MySQL zuzugreifen 【Referenz】 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 ← Sicherheitsgruppen-ID
subnetIds:
- subnet-xxxxxxxx ← Unterabschnitt ID
- subnet-xxxxxxxx ← Unterabschnitt ID
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
Klicken Sie hier für den Code, der tatsächlich funktioniert Da es sich um eine Demo handelt, überprüfe ich die Argumente überhaupt nicht (^ _ ^;)
handler.py
# -*- coding: utf-8 -*-
import MySQLdb,json
HOST = "Hostname des zu verbindenden RDS"
DBNAME = "DB-Name"
DBUSER = "DB-Benutzername"
PASSWD = "Passwort"
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
Versuchen Sie, mit Locken von einer anderen Maschine zu testen.
% 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"}
Überprüfen Sie das Ergebnis
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