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 seulementLambda` 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"
}
LambdaVeuillez 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