Titre En l'état, déployez-le en incluant une bibliothèque telle que lbxxx.so, générez un zip avec un mot de passe sur AWS lambda et stockez-le dans le compartiment S3.
Le mur se dresse devant ce que je veux faire.
Je voudrais laisser ici comment j'ai surmonté ce mur.
Il a été développé de manière pratique en utilisant la fonction "Remote-Containers" de VS Code. Pour plus d'informations sur les conteneurs distants, veuillez consulter cet article.
Je n'ai rien à écrire en particulier ...
AWS Management Console --Lambda - "Créer une fonction"
"Créer à partir de zéro"
Nom de la fonction "zip-sample"
Runtime "Python 3.8"
Lancez VS Code localement et créez la structure de répertoires suivante
zip-sample/
└ .devcontainer/
├ Dockerfile
└ devcontainer.json
└ package/
└ lambda_hundler.py
└ requirements.txt
J'ai obtenu le Dockerfile et le devcontainer.json de Code source ici. lambda_hundler.py se présente comme suit.
lambda_hundler.py
#Le code source original de lambda
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Commençons quand nous sommes prêts. Pourquoi le module zipfile ne peut-il pas générer un fichier zip protégé par mot de passe! (Brusque) Après enquête, il semble que ** pyminizip ** puisse générer un fichier zip avec un mot de passe. Vérifions-le immédiatement.
Installez pyminizip car il nécessite zlib (une bibliothèque gratuite pour compresser et décompresser les données).
$ sudo apt install zlib
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package zlib
** J'étais faché. ** ** Utilisez plutôt "zlib1g".
$ sudo apt install zlib1g
Mettez ce qui suit dans requirements.txt et tapez la commande pip install
.
requirements.txt
pyminizip==0.2.4
$ cd /workspaces/zip-sample
$ pip install -r requirements.txt -t ./package
Ajoutez ce qui suit à lambda_hundler.py.
lambda_hundler.py
import json
import os
import pyminizip
def lambda_handler(event, context):
#Nous utiliserons le répertoire tmp en vue de le télécharger plus tard sur lambda.
zip_path = "/tmp/zip/"
# /tmp/Si le répertoire zip n'existe pas, créez-en un.
if not os.path.isdir(zip_path):
os.mkdir(zip_path)
KEY = "/tmp/hello.txt"
with open(KEY, mode='w') as f:
f.write('this is test.')
password = "password"
compression_level = 9 #Niveau de compression 1-9, plus la compression est élevée, plus la compression est forte
#Le premier argument est un tableau de chemins de fichiers à inclure dans le fichier zip
#Le deuxième argument est la hiérarchie dans le fichier zip
#Le troisième argument est l'emplacement et le nom de fichier du fichier zip.
#Le quatrième argument est le mot de passe
#Le cinquième argument est le niveau de compression
pyminizip.compress_multiple([KEY], ["\\"], "/tmp/zip/sample.zip", password, compression_level)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
#Les éléments suivants sont exclus au moment du déploiement.
lambda_hundler('a','a')
Commençons ci-dessous.
$ python lambda_hundler.py
$ ls /tmp/zip
sample.zip
Vous l'avez fait en toute sécurité!
Maintenant que vous avez généré avec succès un fichier zip avec un mot de passe localement (conteneur docker), déployons-le sur lambda.
lambda_hundler ('a', 'a')
dans lambda_handler.py et supprimez-le.$ cd /workspaces/zip-sample/package
$ zip -r ../function.zip .
$ aws lambda update-function-code --function-name sample-zip --zip-file fileb://../function.zip
Une fois le déploiement terminé, exécutons "test" à partir de l'AWS Management Console --lambda --sample-zip.
[ERROR] OSError: error in closing \tmp\zip\sample.zip (-102)
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 78, in lambda_handler
pyminizip.compress_multiple([KEY], ["\\"], r"\tmp\zip\sample.zip", "password03", 1)
** J'ai été grondé **
Après de nombreuses recherches, il semble que cela se produise car ** zlib n'est pas inclus dans le package de déploiement ... **
Vous pouvez l'inclure dans le package de déploiement en tapant la commande suivante.
$ wget http://www.zlib.net/zlib-1.2.11.tar.gz
$ tar -xvzf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=/workspaces/sample-zip
partager lib inclure/workspaces/sample-zip/Devrait pouvoir
$ sudo make install
$ cd /workspaces/sample-zip/
Inclure la bibliothèque de partage include dans le fichier zip
$ zip -gr function.zip lambda_function.py share lib include
Déployer
$ aws lambda update-function-code --function-name sample-zip --zip-file fileb://function.zip
En ce qui concerne la bibliothèque Linux, une fois que vous avez fait ce qui précède, vous n'avez pas à la modifier, donc après cela, vous n'avez plus qu'à compresser le code source.
$ cd /workspaces/zip-sample/package
$ zip -r ../function.zip .
$ aws lambda update-function-code --function-name sample-zip --zip-file fileb://../function.zip
Une fois le déploiement terminé, exécutons "test" à partir de l'AWS Management Console --lambda --sample-zip. **Succès! ** (devrait)
Le code source après avoir surmonté le mur est le suivant.
lambda_hundler.py
def lambda_handler(event, context):
zip_path = "/tmp/zip/"
if not os.path.isdir(zip_path):
os.mkdir(zip_path)
KEY = '/tmp/hello.txt'
with open(KEY, mode='w') as f:
f.write("this is test.")
password = "password"
compression_level = 9 #Niveau de compression 1-9, plus la compression est élevée, plus la compression est forte
pyminizip.compress_multiple([KEY], ["\\"], "/tmp/zip/sample.zip", password, compression_level)
#Téléchargez le fichier zip créé vers s3
s3 = boto3.resource('s3')
s3.Bucket(BUCKET).upload_file(Filename="/tmp/zip/sample.zip", Key="sample.zip")
return {
'status': 200,
'body': 'Le traitement est terminé'
}
--Si vous souhaitez créer un fichier zip protégé par mot de passe avec Python, "pyminizip"!
Recommended Posts