Remarque: cet article est une réimpression de l'article de note. S'il y a une mise à jour du contenu, la note sera mise à jour. Si l'article qiita est obsolète, veuillez également vérifier la note.
https://note.com/thiroyoshi/n/nfcb0be8c0a22
Bonjour. C'est Thiroyoshi.
Cette fois, je voudrais introduire une petite technique lors de l'utilisation de la bibliothèque Python avec Lambda. J'ai intégré cela dans VueSlsApp. Cela n'a pas l'air différent, mais c'est recommandé car cela simplifie la source.
Si vous êtes nouveau sur VueSlsApp, consultez les articles et magazines d'introduction ci-dessous. https://note.com/thiroyoshi/n/na16112b4ec1b
Vous pouvez en fait toucher ce que vous avez déployé à partir des éléments suivants. https://vueslsapp.thiroyoshi.com/
Le référentiel de VusSlsApp est le suivant. https://github.com/thiroyoshi/vueslsapp
table des matières
--Lors de l'utilisation de la bibliothèque Python avec Lambda, le problème d'élever la bibliothèque ensemble ... Un problème plus sérieux qui ne passe pas le chemin
Le problème auquel tout le monde est confronté lors de l'utilisation de Python avec Lambda est de créer une bibliothèque, mais maintenant, il existe différents outils et il est relativement facile de le soulever.
Le Framework Serverless, qui est également utilisé dans VueSlsApp, collecte automatiquement les éléments du répertoire, il n'y a donc pas de problème.
Le plus gênant est que ** la bibliothèque est introuvable et ne peut pas être exécutée car le chemin ne passe pas au moment de l'exécution **. Peu importe si vous utilisez le Framework sans serveur ...
Bien sûr, Lambda, qui contient l'environnement d'exécution Python, n'a pas le chemin de la bibliothèque que j'ai ajoutée sans aucun paramètre.
Ensuite ** passez simplement le pass **.
En Python, il existe une variable d'environnement appelée PYTHONPATH qui définit le chemin pour rechercher la source. Voir ci-dessous pour le commentaire officiel.
https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHONPATH
L'article suivant décrit comment transmettre PYTHONPATH dans Lambda et tout le contenu de la recherche jusqu'à ce point. informatif.
http://uorat.hatenablog.com/entry/2017/08/31/145340
Les points importants sont les suivants.
・/var/Spécifiez également le runtime
Sur Lambda, il semble que le runtime Python soit également spécifié dans PYTHONPATH par défaut. En d'autres termes, ** Si vous écrasez tout PYTHONPATH par vous-même, vous ne pourrez pas exécuter Python en premier lieu **.
Dans VueSlsApp, les bibliothèques sont rassemblées dans un répertoire appelé pylibs, donc spécifiquement défini comme suit.
** ・ serverless.yml (extrait partiel) **
PYTHONPATH: /var/runtime:/var/task/pylibs
Par conséquent, les références de bibliothèques externes sont modifiées comme suit:
** ・ functions / repository / messages_repository.py (avant modification) **
import json
import random
import hashlib
from decimal import Decimal
from functions.common import initializer
initializer.add_path()
from pylibs import boto3
from pylibs.boto3.dynamodb.conditions import Key
from functions.common.decimal_encoder import DecimalEncoder
** ・ functions / repository / messages_repository.py (après modification) **
import json
import random
import hashlib
from decimal import Decimal
from pylibs import boto3
from pylibs.boto3.dynamodb.conditions import Key
from functions.common.decimal_encoder import DecimalEncoder
Le correctif est que le code qui a ajouté dynamiquement le chemin de la bibliothèque externe ** initializer.add_path () ** n'est plus nécessaire.
Ce n'est pas cool et les performances chutent, alors je me demandais comment arrêter cette méthode ... J'étais heureux de m'arrêter enfin! (Réjouissance
La méthode ci-dessus ne convient pas si la bibliothèque elle-même doit être reconstruite pour l'environnement d'exécution.
Cette méthode est uniquement pour ** l'utilisation d'une bibliothèque qui s'exécute sur le système d'exploitation avec pip install **. Si vous installez sur Windows, les bibliothèques qui s'exécutent sous Windows seront répertoriées ensemble.
En d'autres termes, cette méthode n'est pas adaptée lorsque l'environnement est fortement dépendant et que vous devez modifier l'environnement de construction de la bibliothèque en fonction du cas de l'exécution sur Lambda (= lors de l'exécution sur Amazon Linux).
Dans un tel cas, je pense qu'il existe les méthodes suivantes. (Je ne l'ai pas essayé)
Vous pouvez modifier l'environnement lors de l'installation de pip. En d'autres termes, définissons le système d'exploitation qui exécute l'environnement CI / CD sur Amazon Linux.
Cependant, en fonction des outils et services CI / CD, vous ne pourrez peut-être pas changer le système d'exploitation librement, je pense donc que vous devez vérifier attentivement si vous pouvez utiliser l'image Amazon Linux dans votre propre environnement.
Il existe un plug-in Serverless Framework qui organise bien les bibliothèques Python.
https://www.npmjs.com/package/serverless-python-requirements
Ce plug-in utilise également Docker pour créer en utilisant le même environnement que l'environnement d'exécution.
Alors pourquoi ne pas utiliser ce plug-in depuis le début?
La raison est simple: ** PYTHONPATH est tout ce que vous devez spécifier **.
Avec l'AP que je crée, seules des choses simples peuvent être faites avec Lambda. En d'autres termes, il n'y a presque aucune possibilité d'utiliser une bibliothèque lourde qui dépend de l'environnement de construction. De plus, l'utilisation d'un plug-in comporte de nombreux processus inutiles dans mon développement, tels que son installation et l'exécution d'un conteneur Docker, ce qui peut augmenter le temps d'exécution du pipeline.
Cette fois, j'ai présenté quelques moyens de transmettre le chemin Python dans Lambda.
Après tout, il existe différentes méthodes, mais il est préférable de choisir la méthode la plus rentable pour vous. Même s'il existe un outil utile, il n'est pas bon de le croire aveuglément et de l'utiliser.
De quoi avez-vous besoin? De quoi avez-vous besoin? Est-ce un facteur qui réduit l'efficacité du développement? Dans cette perspective, je voudrais identifier les outils et les méthodes de développement.
Recommended Posts