Sie können Python mithilfe der Bibliothek in eine AWS Lambda-Funktion verwandeln

Aufgabe

Es ist praktisch, eine Bibliothek in Python zu verwenden, um Daten zu analysieren und zu organisieren. Ich benutze oft Numpy, Matplotlib, Pandas, Seaborn.

Nachdem ich verschiedene Analysen mit Jupyter Notebook ausprobiert und entschieden habe, dass diese Art der Verarbeitung durchgeführt werden soll, möchte ich ein Skript erstellen und es jeden Tag automatisch ausführen.

Fühlen Sie sich frei, AWS Lambda jede Stunde auszuführen, um das Skript auszuführen. Sie müssen den Server nicht warten. Darüber hinaus ist es billig.

Wenn Sie die Bibliothek jedoch mit Python von AWS Lambda verwenden möchten, müssen Sie [Bereitstellungspaket erstellen] angeben (https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html). nicht. Wenn Sie eine Bibliothek verwenden, für die eine Kompilierung erforderlich ist, z. B. Numpy, benötigen Sie außerdem eine Amazon Linux-Umgebung, was problematisch ist.

Fühlen Sie sich frei, eine Entwicklungsumgebung mit Cloud9 zu starten

AWS Cloud9 kann als Entwicklungsumgebung verwendet werden, indem ein Server auf EC2 eingerichtet und über den Browser Ihres PCs darauf zugegriffen wird. Es mag gut sein, Amazon Linux mit Docker auszuführen, aber es ist einfacher, es in der Cloud einzurichten. Wenn Sie es eine Weile nicht verwendet haben, wird die EC2-Instanz anscheinend ohne Erlaubnis angehalten, was Ihrer Brieftasche schont.

Erstellen Sie eine neue Umgebung über das AWS Cloud9-Menü. Es gibt nichts, worüber Sie vorsichtig sein müssen, aber im Moment können Sie nur zwischen Amazon Linux oder Ubuntu Server 18.04 LTS wählen. Lambdas Umgebung wird zu Amazon Linux 2, aber es kann nicht geholfen werden. Diesmal habe ich mich für Amazon Linux entschieden.

Bereiten Sie eine Lambda-Funktion mit dem Serverless-Anwendungsassistenten vor

Grundsätzlich gemäß [Dokumentation] einrichten (https://docs.aws.amazon.com/cloud9/latest/user-guide/lambda-functions.html). Klicken Sie beim Start von Cloud9 ganz rechts auf die Registerkarte "AWS-Ressourcen", um das Lambda-Menü anzuzeigen. Wenn Sie auf die Schaltfläche "Neue Lambda-Funktion erstellen" klicken, wird ein Assistent mit dem Namen "Serverlose Anwendung erstellen" angezeigt. Dieses Mal werde ich es mit dem Namen envtest machen. Leider war Python 3.6 das einzige Python, das als Laufzeit ausgewählt werden konnte.

Wenn der Assistent beendet ist, sollten Sie einen Ordner namens envtest haben.

Bevor wir den Code schreiben, installieren wir die erforderlichen Bibliotheken. envtest/venv/ Hat eine virtuelle Python-Umgebung. Über die Cloud9 IDE-Konsole

source ./envtest/venv/bin/activate

Nach der Aktivierung durch Eingabe installiert pip immer mehr erforderliche Bibliotheken. AWS Lambda hat ein Limit von 250 MB für die Bereitstellung der Paketgröße einschließlich Bibliotheken. Installieren Sie nur das erforderliche Minimum. Diesmal Numpy, Matplotlib, Pandas, Seaborn, Pillow, boto3 Ich habe es installiert, aber es war okay (nur knapp).

Schreiben Sie die Lambda-Funktion

envtest/envtest/lambda_function.py Ich werde die Lambda-Funktion in schreiben.

Um den Trend der Anzahl der mit Corona-Viren infizierten Personen in Tokio zu erfassen, lesen wir diesmal den täglichen CSV der Anzahl der infizierten Personen in Tokio, zeichnen den Tageswert und den gleitenden 7-Tage-Durchschnitt auf und laden ihn in S3 hoch. tat. Ich habe eine Bitmap mit 320 x 240 Pixel, wie in Adafruits Pyportal gezeigt.

2020-9-5 So sieht es jetzt aus. covid19_tokyo (6).png

Klicken Sie hier, um die neuesten Informationen zu erhalten

lambda_function.py



import base64
import io 
from datetime import datetime as dt

import boto3
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
sns.set(style="whitegrid")
from PIL import Image

#Erfassung von Details zur Ankündigung neuer Coronavirus-positiver Patienten
URL = 'https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv'

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    df = pd.read_csv(URL)
    df['date'] = df['Veröffentlicht_Datum'].apply(lambda a: dt.strptime(a, '%Y-%m-%d'))
    df = pd.DataFrame(df['date'].value_counts(sort=False).sort_index())
    df['ma7'] = df.iloc[:,0].rolling(window=7).mean()
    
    #PyPortal is 320 x 240
    ppi = 227
    width = 320 / ppi
    height = 240 / ppi
    
    SMALL_SIZE = 4
    MEDIUM_SIZE = 10
    BIGGER_SIZE = 12
    
    plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
    plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
    plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
    plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
    plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
    plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
    plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title
    
    fig, ax = plt.subplots(figsize=(width,height), dpi=ppi)
    ax.plot(df['date'], color='g', label="Daily")
    ax.plot(df['ma7'], 'r', label="ma7")
    #ax.text(0, 1, "212", fontsize=4)
    ax.set_title("Tokyo COVID-19")
    #fig.legend()
    fig.autofmt_xdate()
    plt.tight_layout()    

    pic_IObytes = io.BytesIO()
    plt.savefig(pic_IObytes,  format='png')
    pic_IObytes.seek(0)
    
    im = Image.open(pic_IObytes)
    pic_IObytes_bmp = io.BytesIO()
    im.save(pic_IObytes_bmp, format='bmp')
    pic_IObytes_bmp.seek(0)
    #pic_hash = base64.b64encode(pic_IObytes_bmp.read())

    s3_client.upload_fileobj(pic_IObytes_bmp, "pyportal", "covid19_tokyo.bmp", ExtraArgs={'ACL': 'public-read'})

    return ''

Code-Ergänzung

    df = pd.read_csv(URL)

Mit nur dieser einen Zeile wird die CSV von der URL heruntergeladen und zu Pandas.DataFrame gemacht. groß.

    df['date'] = df['Veröffentlicht_Datum'].apply(lambda a: dt.strptime(a, '%Y-%m-%d'))
    df = pd.DataFrame(df['date'].value_counts(sort=False).sort_index())
    df['ma7'] = df.iloc[:,0].rolling(window=7).mean()

Um die spätere Handhabung zu vereinfachen, erstellen Sie eine DateTime-Objektspalte aus der Spalte, die das Datum als Zeichenfolge enthält, und definieren Sie sie als indizierten DataFrame neu. Berechnen Sie außerdem den gleitenden 7-Tage-Durchschnitt, um eine neue Spalte zu erstellen.

    fig, ax = plt.subplots(figsize=(width,height), dpi=ppi)
    ax.plot(df['date'], color='g', label="Daily")
    ax.plot(df['ma7'], 'r', label="ma7")

Grafikzeichnung mit Matplotlib. Ich möchte es am Ende 320x240pixel machen, also stelle die dpi entsprechend ein und stelle die Breite und Höhe ein.

    pic_IObytes = io.BytesIO()
    plt.savefig(pic_IObytes,  format='png')
    pic_IObytes.seek(0)

Speichern Sie das Diagramm im PNG-Format im Speicher. Pyportal kann nur das Bitmap-Format lesen, daher wollte ich es als Bitmap speichern. Das von mir verwendete Backend von matplotlib unterstützte das Speichern im BMP-Format jedoch nicht.

    im = Image.open(pic_IObytes)
    pic_IObytes_bmp = io.BytesIO()
    im.save(pic_IObytes_bmp, format='bmp')
    pic_IObytes_bmp.seek(0)

Da es keine Hilfe dafür gibt, öffnen Sie es nach dem Speichern als PNG-Format mit Pillow und speichern Sie es erneut als BMP-Format.

    s3_client.upload_fileobj(pic_IObytes_bmp, "pyportal", "covid19_tokyo.bmp", ExtraArgs={'ACL': 'public-read'})

In S3 hochladen und veröffentlichen.

Cloud 9 erleichtert das Debuggen von Lambda-Funktionen

Das Debuggen von Lambda-Funktionen ist normalerweise umständlich. Einfache Dinge, die nur Standardfunktionen verwenden, können weiterhin mit der IDE auf dem AWS Lambda-Verwaltungsbildschirm verwendet werden. Wenn Sie jedoch diesmal viele externe Bibliotheken verwenden, können Sie dies auch nicht tun.

Das Debuggen mit der Cloud 9-IDE ist jedoch einfach. Sie können den Debugger auch verwenden, indem Sie Haltepunkte festlegen. Vielen Dank.

Bereitstellung per Knopfdruck

Debuggen Sie mit "Lokal ausführen" und stellen Sie es bei Erfolg bereit. Klicken Sie einfach im Lambda-Menü der Cloud9 IDE auf die Schaltfläche "Bereitgestellte Lambda-Funktion bereitstellen". Die Umgebung wird komprimiert und auf AWS Lambda hochgeladen.

Da wir dieses Mal am Ende auf S3 hochladen, müssen wir die Amazon S3FullAccess-Richtlinie für die Rolle dieser Funktion im AWS Lambda-Verwaltungsbildschirm festlegen.

Wenn alles gut geht, legen Sie EventBridge (CloudWatch Events) als Auslöser fest und legen Sie die Rate (1 Tag) fest, um den Vorgang abzuschließen.

Bonus Starten Sie Jupyter Notebook auf Cloud9

Die Cloud9-IDE ist auch nicht schlecht, aber manchmal möchte ich viel mit dem Jupyter-Notebook machen. Starten Sie daher Jupyter Notebook auf dem Server von Clould9, damit Sie mit Jupyter Notebook über den Browser Ihres PCs oder Smartphones entwickeln können.

Halten Sie die EBS-Kapazität groß

Wenn Sie die Umgebung für das Experimentieren mit dem Jupyter Notebook vorbereiten, wird Ihnen wahrscheinlich das EBS-Volumen ausgehen. Machen Sie es gemäß der Dokumentation größer. Ich habe es bei 20 GiB gehalten.

Resize an Amazon EBS volume used by an environment

Wie bei Miniconda

Richten Sie über die Cloud9 IDE-Konsole miniconda ein und richten Sie Ihre bevorzugte Python-Umgebung ein.

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

Danach können Sie mit conda eine Umgebung erstellen, wie Sie möchten.

Starten Sie Jupyter Notebook

jupyter notebook --ip=0.0.0.0

Geben Sie beim Start 0.0.0.0 für die IP an, damit von außen darauf zugegriffen werden kann. Die Sicherheit ist robust, also legen Sie mindestens ein Passwort fest.

Klicken Sie im AWS Cloud9-Verwaltungsbildschirm im Element EC2-Instanz auf "Zur Instanz wechseln", um den Verwaltungsbildschirm des von Ihnen verwendeten EC2 anzuzeigen. Sie können auf Jupyter Notebook zugreifen, indem Sie die URL in "Public DNS (IPv4)" in die Zwischenablage kopieren und mit einem Browser mit ": 8888" und der am Ende angegebenen Portnummer darauf zugreifen. So was.

http://ec2-xx-xxx-xx-xx.ap-northeast-1.compute.amazonaws.com:8888/

Recommended Posts

Sie können Python mithilfe der Bibliothek in eine AWS Lambda-Funktion verwandeln
[AWS / Lambda] Laden einer externen Python-Bibliothek
Laden Sie eine externe Bibliothek aus einer Lambda-Funktion mit AWS Lambda Layers. Die Python-Umgebung für Amazon Linux 2 ist ebenfalls vorhanden. (Python3.6, Anaconda)
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Zusammenfassung bei Verwendung von AWS Lambda (Python)
Schreiben Sie die AWS Lambda-Funktion in Python
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Fühlen Sie sich frei, die Festplatte zu verschlüsseln
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern
[Python] Erklärt anhand eines Beispiels, wie die Formatierungsfunktion verwendet wird
[Für Python] Erstellen Sie schnell eine Upload-Datei in AWS Lambda Layer
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Installieren Sie die Python-Bibliothek auf Lambda mit [/ tmp]
Lambda-Funktion zur Erstellung eines AMI-Backups (Python)
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
Wheel Reinvention: libMerge zum Zusammenführen von Funktionsdefinitionen in der Bash-Bibliothek in ShellScript
So senden Sie automatisch E-Mails mit Anhängen mithilfe der Google Mail-API in Python
[Hyperledger Iroha] Erstellen Sie ein Konto mit der Python-Bibliothek
Verwendung der C-Bibliothek in Python
Aggregieren Sie die Testergebnisse mithilfe der QualityForward Python-Bibliothek
[Einführung in AWS] Das erste Lambda ist Transcribe ♪
Verwalten Sie AWS mit der Python-Bibliothek Boto
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Ein Artikel, der die Fallstricke von Python zusammenfasst
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
Eine kleine Geschichte, die beim Schreiben von Twilio-Anwendungen mit Python auf AWS Lambda süchtig macht
[AWS IoT] Registrieren Sie Dinge in AWS IoT mithilfe des AWS IoT Python SDK
Option [Python] zum Deaktivieren der Ausgabe von click.progressbar
Ich wollte die Python-Bibliothek von MATLAB verwenden
Überprüfen Sie types_map, wenn Sie Mimetypen mit AWS Lambda (Python) verwenden.
So konfigurieren Sie Layer auf Lambda mit AWS SAM
[Python] Verwendung der Diagrammerstellungsbibliothek Altair
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
So verwandeln Sie eine .py-Datei in eine .exe-Datei
Schreiben Sie Daten mit dem Python-Anforderungsmodul in KINTONE
Ich möchte Lambda mit Python auf Mac AWS!
Python Gibt die Funktion an, die ausgeführt werden soll, wenn das Programm endet
[Python] Maskiere das Bild mit Pillow zu einem Kreis
[Einführung in Python] Wie stoppe ich die Schleife mit break?
Verwenden Sie die Such-API der National Parliament Library in Python
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
Stellen Sie Lambda-Funktionen sicher mit Python bereit, das mit denselben Optionen wie Amazon Linux erstellt wurde
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
Versuchen Sie, eine Excel-Datei mit Python (Pandas / XlsxWriter) zu betreiben
Versuchen Sie, eine Excel-Datei mit Python (Pandas / XlsxWriter) zu betreiben
Fügen Sie das Bild mit Pythons openpyxl in eine Excel-Datei ein
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Stellen Sie mit Pycoin (Python Cryptocoin Utili) eine Verbindung zum Bitcoin-Netzwerk her.
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Erstellen einer Umgebung zum Ausführen von Python-Programmen unter AWS EC2