[VueSlsApp] Spécifiez PYTHONPATH dans Lambda et utilisez simplement la bibliothèque externe

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

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 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 **.

Ajoutez le chemin à votre PTHONPATH et vous pourrez voir Python

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

Si vous avez une bibliothèque dépendante de l'environnement, cette méthode peut ne pas être bonne

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é)

・ Utilisez PYTHONPATH, mais changez l'environnement CI / CD en Amazon Linux

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.

-Utiliser les exigences de Python sans serveur

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.

finalement

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

[VueSlsApp] Spécifiez PYTHONPATH dans Lambda et utilisez simplement la bibliothèque externe
Comment utiliser la bibliothèque C en Python
Utilisez l'application LibreOffice en Python (3) Ajouter une bibliothèque
Avec SQLite3, ajoutez seulement deux lignes et utilisez la bibliothèque d'extension (fonction SQL étendue)!
Inclure et utiliser des fichiers Kv externes avec Python Kivy
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
[Note du débutant] Comment spécifier le chemin de lecture de la bibliothèque en Python
Spécifiez le navigateur à utiliser avec Jupyter Notebook. Surtout Mac. (Et Vivaldi)
Utiliser l'application LibreOffice en Python (2) Manipuler calc (à partir d'une macro et externe)