[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python

Chose que tu veux faire

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 qui se dresse

Le mur se dresse devant ce que je veux faire.

  1. ** zipfile (un module qui crée des fichiers zip fournis en standard en Python) a un mot de passe. le cryptage des fichiers zip n'est pas pris en charge! ** **
  2. ** Vous ne pouvez pas créer un zip protégé par mot de passe simplement en compressant le code source local dans un fichier zip et en le déployant vers lambda! ** **

Je voudrais laisser ici comment j'ai surmonté ce mur.

environnement

Environnement de développement local

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.

Environnement AWS

Je n'ai rien à écrire en particulier ...

Avant de heurter le mur

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!')
    }

Comment franchir le mur ①

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.

Préparation

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

Comment franchir le mur ②

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.

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

La bataille pour inclure zlib dans le package de déploiement commence ...!

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)

Système complet

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é'
    }

Résumé

--Si vous souhaitez créer un fichier zip protégé par mot de passe avec Python, "pyminizip"!

Articles auxquels j'ai fait référence

Recommended Posts

[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
Connectez-vous à s3 avec AWS Lambda Python
Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3
Téléchargez ce que vous avez dans la demande vers S3 avec AWS Lambda Python
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[Python] Générer un mot de passe avec Slackbot
[AWS] Associez Lambda et S3 à boto3
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Définissez la fonction Lambda et laissez-la fonctionner avec les événements S3!
Comment générer un code QR et un code à barres en Python et le lire normalement ou en temps réel avec OpenCV
Exporter un instantané RDS vers S3 avec Lambda (Python)
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Une histoire de compilation croisée d'un package Python pour AWS Lambda et de son déploiement sans serveur
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Créer une couche pour AWS Lambda Python dans Docker
Je veux AWS Lambda avec Python sur Mac!
Créez des tweets ordinaires comme une flotte avec AWS Lambda et Python
J'ai essayé de charger / télécharger des fichiers sur AWS S3 / Azure BlobStorage / GCP CloudStorage avec Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
[Python] Qu'est-ce qu'un tuple? Explique comment utiliser sans toucher et comment l'utiliser avec des exemples.
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Associez Python Enum à une fonction pour la rendre appelable
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Générez un mot de passe facile à retenir avec apg
Exporter les journaux CloudWatch vers S3 avec AWS Lambda (Pythyon ver)
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Créez un script de déploiement avec fabric et cuisine et réutilisez-le
[Python] Exportez régulièrement de CloudWatch Logs vers S3 avec Lambda
Surveillance du site et notification d'alerte avec AWS Lambda + Python + Slack
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Créer une liste d'utilisateurs Cognito dans S3 avec SQS Déployer des fonctions de traitement de file d'attente et des API sur Lambda avec SAM
Déplacer régulièrement les journaux CloudWatch vers S3 avec Lambda
Créez un fichier temporaire avec django sous forme de zip et renvoyez-le
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
Envoyer les images prises avec ESP32-WROOM-32 vers AWS (API Gateway → Lambda → S3)
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
Préparer un environnement pour utiliser OpenCV et Pillow avec AWS Lambda
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
[Pour Python] Créez rapidement un fichier de téléchargement vers AWS Lambda Layer
Comment créer une API de machine learning sans serveur avec AWS Lambda
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Notifier HipChat avec AWS Lambda (Python)
ImportError lors de la tentative d'utilisation du package gcloud avec la version AWS Lambda Python
Comment générer un nouveau groupe de journaux dans CloudWatch à l'aide de python dans Lambda
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Je veux le faire avec Python lambda Django, mais je vais m'arrêter
Créez une application Django sur Docker et déployez-la sur AWS Fargate
Surveillance simple du serveur avec AWS Lambda (Python) et notification des résultats avec Slack