Quand j'utilise habituellement Lambda
, j'utilise calice
pour créer et déployer des fonctions Lambda
.
«calice» est pratique, mais il semble que «pip install» soit effectué à chaque fois qu'il est déployé pour collecter le «package» nécessaire.
Par conséquent, si vous utilisez un package
plus lourd tel que pandas
, le déploiement prendra plus de temps.
Par conséquent, utilisez le service LambdaLayers
du Lambda
qui enregistre le package
à utiliser à l'avance.
Prérequis pour la création de «LambdaLayers».
LambdaLayers
doit utiliser le fichier de packages
consolidé avec zip
pour rendre Lambda
disponible à l'avance Référence /lambda/latest/dg/configuration-layers.html)packages
tels que pandas
doivent être pip install
sur ʻAmazon Linux` Référence, mais il est inutile de le créer si vous n'avez pas d'environnement tel que
VPC (
VPC` lui-même coûte de l'argent).Lambda
a une zone appelée / tmp
accessible par le programme.La condition de (3) était si stricte que «Lambda» ne le reconnaissait parfois pas correctement avec le fichier «zip» créé localement.
Vous pouvez également le faire sur ʻEC2dans (4), mais s'il s'agit d'un développement privé qui n'utilise que sans serveur, Il y avait une (ma) demande que je voulais compléter avec seulement
Lambda` autant que possible parce que je ne veux pas dépenser d'argent.
Sur la base de la prémisse
ci-dessus, créez cette fois le fichier zip
requis pour LambdaLayers
par la méthode suivante.
ʻInstall`` packagedans la zone
/ tmp de
Lambda, solidifier avec
zip et télécharger vers
S3`
L'enregistrement réel des «couches Lambda» est effectué manuellement.
Le programme à exécuter par «Lambda» est le suivant.
lambda_function.py
import json
import subprocess
import zipfile
import boto3
from pathlib import Path
def lambda_handler(event, context):
#Confirmation des arguments
if "package_list" not in event:
return {"error": "[package_list]N'existe pas"}
package_list = event['package_list']
if type(package_list) is not list:
return {"error": "[package_list]N'est pas une liste"}
if "s3_bucket" not in event:
return {"error": "[s3_bucket]N'existe pas"}
if "s3_key" not in event:
return {"error": "[s3_key]N'existe pas"}
#Créez un répertoire appelé python et installez-y le package
mkdir_cmd = "mkdir -p /tmp/python"
pip_install_cmd = f"pip install -t /tmp/python {' '.join(package_list)}"
process = (subprocess.Popen(f"{mkdir_cmd} && {pip_install_cmd}", stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
print('commands...\n'+process)
#Créer un objet Path
p = Path("/tmp/python")
#Ajouter le package installé à zip
with zipfile.ZipFile('/tmp/python_lib.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
for f in list(p.glob("**/*")):
new_zip.write(f, arcname=str(f).replace("/tmp/", ""))
#Obtenir un objet S3 et télécharger
s3 = boto3.resource('s3')
bucket = s3.Bucket(event['s3_bucket'])
bucket.upload_file('/tmp/python_lib.zip', event['s3_key'])
return {
"success": f"s3://{event['s3_bucket']}/{event['s3_key']}Sortie vers"
}
Lambda
Veuillez le changer en fonction du package
à installer.
512 [Mo]
5[min]
S3
téléchargé.Lors de l'exécution, passez l'argument suivant pour installer le package
inclus dans package_list
.
Il télécharge également le fichier zip
aux emplacements spécifiés dans s3_bucket
et s3_key
.
event
{
"package_list": ["pandas", "lxml", "requests", "beautifulsoup4"],
"s3_bucket": "<Nom du bucket de s3>",
"s3_key": "lambda_layer/python_lib.zip"
}
Si vous créez un fichier zip
en utilisant l'exemple ci-dessus, un fichier zip
d'environ43,1 [Mo]
sera créé.
Donc, si vous copiez le code source ci-dessus dans Lambda
et que vous l'exécutez,
Vous pouvez maintenant créer le «zip» requis pour enregistrer les «LambdaLayers».
Remarque: Cette fois, je n'ai pas d'autre choix que d'exécuter shell
depuis Python
.
Fondamentalement, je ne pense pas qu'il soit bon d'appeler shell
depuis Python
, donc
Utilisons-le quand il n'y a pas d'autre choix que de l'utiliser.
Recommended Posts