Verwenden Sie zusätzliche Python-Pakete mit Serverless Framework (v1.x)

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.

Hintergrund

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.

Web-API-Erstellungsverfahren mit Serverless Framework

Upgrade der Serverless Framework-Version

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

Projekterstellung

Erstellen und initialisieren Sie das Projektverzeichnis

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

MySQL-Bibliothek für Python hinzugefügt

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

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

Python-Code

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

Bereitstellen

% 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

Prüfung

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

Verwenden Sie zusätzliche Python-Pakete mit Serverless Framework (v1.x)
Berühren Sie AWS mit Serverless Framework und Python
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mecab mit Python 3
Verwenden Sie DynamoDB mit Python
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Python mit Docker
Erstellen Sie eine Python-Version der Lambda-Funktion (+ Lambda-Schicht) mit Serverless Framework
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Verwenden Sie die Trello-API mit Python
Mit Python mit Kelch ganz einfach ohne Server
Verwenden Sie die Twitter-API mit Python
Verwenden Sie TUN / TAP mit Python
Verwenden Sie die Unterschall-API mit Python3
Machen Sie es sich mit Serverless Python Requirements einfach
[Paketwolke] Verwalten Sie Python-Pakete mit der Paketwolke
Python: So verwenden Sie Async mit
Verwenden Sie eine Point Grey-Kamera mit Python (PyCapture2).
Verwenden Sie vl53l0x mit RaspberryPi (Python)
So verwenden Sie das Python-Visualisierungspaket ordnungsgemäß
Verwenden Sie NAIF SPICE TOOL KIT mit Python
Verwenden Sie rospy mit virtualenv in Python3
Verwenden Sie Python in pyenv mit NeoVim
Verwenden Sie die Windows 10-Sprachsynthese mit Python
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Verwenden Sie OpenCV mit Python 3 in Window
Verwenden Sie PostgreSQL mit Lambda (Python + psycopg2)
Verwendung von Umgebungsvariablen für Serverless Framework und Python und Verwaltung von Phasen
Installieren Sie Python als Framework mit pyenv
Verwenden Sie smbus mit python3 in einer pyenv-Umgebung
Verwenden Sie DeepL mit Python (für die Artikelübersetzung)
Verwenden Sie den Amazon Simple Notification Service mit Python
[Einführung in Python] Verwenden wir foreach mit Python
Verwenden Sie PIL oder Pillow mit Cygwin Python
Verwenden Sie die Verschlüsselung der Verschlüsselungsbibliothek mit dem Python-Image von Docker
Verwenden Sie Application Insights mit Python 3 (einschließlich Flaschen).
Erstellen Sie ein Webframework mit Python! (1)
Verwenden von C ++ - Funktionen aus Python mit pybind11
Serverlose Gesichtserkennungs-API mit Python
Verwenden Sie den Phantomjs-Webdriver von Selen mit Pythons Unittest
Bis Sie opencv mit Python verwenden können
Verwenden Sie Python und MeCab mit Azure-Funktionen
Erstellen Sie ein Webframework mit Python! (2)
Erstellen wir ein einfaches Empfangssystem mit dem serverlosen Python-Framework Chalice und Twilio
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Ich möchte MATLAB feval mit Python verwenden
Einführung in Tornado (1): Python Web Framework mit Tornado gestartet
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Verwenden Sie vorerst Logger mit Python
Python> Mit Laufzeitargumenten ausführen> Import argparse verwenden
Verwenden Sie mit pyenv mehrere Versionen der Python-Umgebung
Wickeln Sie C mit Cython für Python ein
Serverlose Anwendung mit AWS SAM! (APIGATEWAY + Lambda (Python))
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Der einfachste Weg, OpenCV mit Python zu verwenden
Verwenden Sie verschiedene Rabbimq-Funktionen mit Python Pika
Ich möchte Temporäres Verzeichnis mit Python2 verwenden