N'hésitez pas à transformer Python en utilisant la bibliothèque en une fonction AWS Lambda

Tâche

Il est pratique d'utiliser une bibliothèque en Python pour analyser et organiser les données. J'utilise souvent Numpy, Matplotlib, Pandas, Seaborn.

Après avoir essayé diverses analyses avec Jupyter Notebook et décidé que ce type de traitement devait être effectué, je souhaite créer un script et l'exécuter automatiquement chaque jour.

N'hésitez pas à exécuter AWS Lambda toutes les heures pour exécuter le script. Vous n'avez pas besoin de maintenir le serveur. De plus, c'est bon marché.

Mais si vous souhaitez utiliser la bibliothèque avec Python d'AWS Lambda, vous devez lui donner Créer un package de déploiement ne pas. De plus, si vous utilisez une bibliothèque qui nécessite une compilation, telle que Numpy, vous aurez besoin d'un environnement Amazon Linux, ce qui est un problème.

N'hésitez pas à lancer un environnement de développement avec Cloud9

AWS Cloud9 peut être utilisé comme environnement de développement en configurant un serveur sur EC2 et en y accédant à partir du navigateur de votre PC. Il peut être bon d'exécuter Amazon Linux avec Docker, mais il est plus facile de le configurer dans le cloud. De plus, si vous ne l'avez pas utilisé depuis un certain temps, il semble que l'instance EC2 sera suspendue sans autorisation, ce qui est gentil avec votre portefeuille.

Créez un nouvel environnement à partir du menu AWS Cloud9. Il n'y a rien à faire attention, mais pour l'instant, les seules plates-formes que vous pouvez choisir sont Amazon Linux ou Ubuntu Server 18.04 LTS. L'environnement Lambda devient Amazon Linux 2, mais cela ne peut pas être aidé. Cette fois, j'ai choisi Amazon Linux.

Préparer une fonction lambda avec l'assistant d'application sans serveur

Fondamentalement, configurez-le conformément à la Documentation. Lorsque Cloud9 est lancé, cliquez sur l'onglet "Ressources AWS" à l'extrême droite pour afficher le menu Lambda. Lorsque vous appuyez sur le bouton «Créer une nouvelle fonction Lambda», un assistant appelé «Créer une application sans serveur» apparaît. Cette fois, je vais le faire avec le nom envtest. Malheureusement, Python 3.6 était le seul Python qui pouvait être sélectionné comme Runtime.

Lorsque l'assistant a terminé, vous devriez avoir un dossier appelé envtest.

Avant d'écrire le code, installons les bibliothèques requises. envtest/venv/ Possède un environnement virtuel Python. Depuis la console Cloud9 IDE

source ./envtest/venv/bin/activate

Après l'activation en tapant, pip installera de plus en plus de bibliothèques requises. AWS Lambda a une limite de 250 Mo pour la taille du package de déploiement, y compris les bibliothèques. Installez uniquement le minimum requis. Cette fois Numpy, Matplotlib, Pandas, Seaborn, Pillow, boto3 Je l'ai installé, mais ça allait (à peine).

Ecrire la fonction Lambda

envtest/envtest/lambda_function.py J'écrirai la fonction Lambda dans.

Cette fois, afin de saisir la tendance du nombre de personnes infectées par le virus corona à Tokyo, nous allons lire le CSV quotidien du nombre de personnes infectées à Tokyo, tracer la valeur quotidienne et la moyenne mobile sur 7 jours, et le télécharger sur S3. fait. J'ai une image bitmap de 320x240 pixels comme indiqué dans Adafruit's Pyportal.

2020-9-5 Ça ressemble à ça maintenant. covid19_tokyo (6).png

Cliquez ici pour les dernières nouvelles

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

#Acquisition des détails de l'annonce de nouveaux patients positifs au coronavirus
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['Publié_Date'].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 ''

Supplément de code

    df = pd.read_csv(URL)

Avec juste cette ligne, il téléchargera le CSV à partir de l'URL et le rendra Pandas.DataFrame. génial.

    df['date'] = df['Publié_Date'].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()

Pour faciliter la gestion ultérieure, créez une colonne d'objet DateTime à partir de la colonne contenant la date sous forme de chaîne de caractères et redéfinissez-la en tant que DataFrame indexé. Calculez également la moyenne mobile sur 7 jours pour créer une nouvelle colonne.

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

Dessin graphique avec matplotlib. Je veux le rendre 320x240pixel à la fin, alors réglez le dpi de manière appropriée et définissez la largeur et la hauteur.

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

Enregistrez le graphique au format PNG en mémoire. Pyportal ne peut lire que le format bitmap, je voulais donc l'enregistrer sous forme de bitmap. Mais le backend de matplotlib que j'utilise ne prenait pas en charge l'enregistrement au format BMP.

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

Comme il n'y a aucune aide pour cela, une fois enregistré au format PNG, ouvrez-le avec Pillow et enregistrez-le à nouveau au format BMP.

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

Téléchargez sur S3 et publiez.

Cloud 9 facilite le débogage des fonctions Lambda

Les fonctions Lambda sont généralement lourdes à déboguer. Des choses simples qui n'utilisent que des fonctions standard peuvent toujours être utilisées avec l'EDI sur l'écran de gestion AWS Lambda, mais si vous utilisez beaucoup de bibliothèques externes comme cette fois, vous ne pouvez pas le faire non plus.

Cependant, il est facile de déboguer avec l'EDI Cloud 9. Vous pouvez également utiliser le débogueur en définissant des points d'arrêt. Je vous remercie.

Déployez en appuyant simplement sur un bouton

Déboguer avec «Exécuter local» et déployer si réussi. Appuyez simplement sur le bouton «Déployer la fonction Lambda sélectionnée» dans le menu Lambda de Cloud9 IDE. Il compressera l'environnement et le téléchargera sur AWS Lambda.

Puisque cette fois, nous allons télécharger vers S3 à la fin, nous devons définir la stratégie Amazon S3FullAccess pour le rôle de cette fonction à partir de l'écran de gestion AWS Lambda.

Si tout se passe bien, définissez EventBridge (CloudWatch Events) comme déclencheur et définissez le taux (1 jour) pour terminer.

Bonus Lancer Jupyter Notebook sur Cloud9

L'IDE Cloud9 n'est pas mal non plus, mais il y a des moments où je veux faire beaucoup avec le Jupyter Notebook. Par conséquent, lancez Jupyter Notebook sur le serveur de Clould9 afin de pouvoir développer avec Jupyter Notebook depuis le navigateur de votre PC ou smartphone.

Gardez la capacité EBS grande

Vous serez probablement à court de volume EBS lorsque vous préparerez l'environnement pour expérimenter avec Jupyter Notebook. Agrandissez-le selon la documentation. Je l'ai gardé à 20 Gio.

Resize an Amazon EBS volume used by an environment

Comme avec miniconda

Depuis la console Cloud9 IDE, configurez miniconda et configurez votre environnement Python préféré.

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

Après cela, vous pouvez créer un environnement comme vous le souhaitez avec conda.

Lancez Jupyter Notebook

jupyter notebook --ip=0.0.0.0

Lors du lancement, spécifiez 0.0.0.0 pour l'IP afin qu'elle soit accessible de l'extérieur. La sécurité est renforcée, alors définissez au moins un mot de passe.

Cliquez sur «Aller à l'instance» dans l'élément Instance EC2 sur l'écran de gestion AWS Cloud9 pour afficher l'écran de gestion de l'EC2 que vous utilisez. Vous pouvez accéder au Jupyter Notebook en copiant l'URL dans «Public DNS (IPv4)» dans le presse-papiers et en y accédant avec un navigateur avec «: 8888» et le numéro de port spécifié à la fin. Comme ça.

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

Recommended Posts

N'hésitez pas à transformer Python en utilisant la bibliothèque en une fonction AWS Lambda
[AWS / Lambda] Comment charger une bibliothèque externe Python
Chargez une bibliothèque externe à partir d'une fonction Lambda à l'aide des couches AWS Lambda. L'environnement Python pour Amazon Linux 2 est également en place. (Python3.6, Anaconda)
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Récapitulatif si vous utilisez AWS Lambda (Python)
Ecrire une fonction AWS Lambda en Python
[Python] Faire de la fonction une fonction lambda
N'hésitez pas à crypter le disque
N'hésitez pas à changer l'étiquette de légende avec Seaborn en python
[Python] Explique comment utiliser la fonction format avec un exemple
[Pour Python] Créez rapidement un fichier de téléchargement vers AWS Lambda Layer
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Installez la bibliothèque python sur Lambda à l'aide de [/ tmp]
Fonction Lambda pour effectuer une sauvegarde AMI (python)
Connectez-vous à s3 avec AWS Lambda Python
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
[Python] Smasher a essayé de faire du processus de chargement de la vidéo une fonction à l'aide d'un générateur
Wheel Reinvention: libMerge pour fusionner les définitions de fonctions de la bibliothèque Bash dans ShellScript
Pour envoyer automatiquement des e-mails avec des pièces jointes à l'aide de l'API Gmail en Python
[Hyperledger Iroha] Créez un compte à l'aide de la bibliothèque Python
Comment utiliser la bibliothèque C en Python
Agréger les résultats des tests à l'aide de la bibliothèque Python QualityForward
[Introduction à AWS] Le premier Lambda est Transcribe ♪
Gérez bien AWS avec la bibliothèque Python Boto
Résumé de l'étude de Python pour utiliser AWS Lambda
Un article résumant les pièges accro au python
Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda
[AWS IoT] Enregistrer des éléments dans AWS IoT à l'aide du SDK AWS IoT Python
[python] option pour désactiver la sortie de click.progressbar
Je voulais utiliser la bibliothèque Python de MATLAB
Vérifiez types_map lors de l'utilisation de mimetypes avec AWS Lambda (Python)
Comment configurer Layer sur Lambda à l'aide d'AWS SAM
[Python] Comment utiliser la bibliothèque de création de graphes Altair
J'ai essayé d'approcher la fonction sin en utilisant le chainer
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Comment transformer un fichier .py en fichier .exe
Écrire des données dans KINTONE à l'aide du module de requêtes Python
Je veux AWS Lambda avec Python sur Mac!
python Spécifie la fonction à exécuter lorsque le programme se termine
[Python] Masquez l'image dans un cercle à l'aide de Pillow
[Introduction à Python] Comment arrêter la boucle en utilisant break?
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
Déployez en toute sécurité des fonctions Lambda à l'aide de Python construit avec les mêmes options qu'Amazon Linux
Comment obtenir les informations des organisations, Cost Explorer d'un autre compte AWS avec Lambda (python)
Essayez d'obtenir la liste des fonctions du paquet Python> os
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
Comment déboguer une bibliothèque Python standard dans Visual Studio
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
Essayez d'exploiter un fichier Excel en utilisant Python (Pandas / XlsxWriter) ①
Essayez d'exploiter un fichier Excel en utilisant Python (Pandas / XlsxWriter) ②
Collez l'image dans un fichier Excel en utilisant l'openpyxl de Python
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Connectez-vous au réseau Bitcoin en utilisant pycoin (Python Cryptocoin Utili)
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Création d'un environnement pour exécuter des programmes Python sur AWS EC2