[PYTHON] Comment créer des couches AWS Lambda lors de l'exécution de sélénium × chrome sur AWS Lambda

Dans cet article

Depuis AWS Lambda, lorsque vous souhaitez utiliser le navigateur avec sélénium × chrome Je suis accro à la création d'un calque, alors je le posterai.

Chose que tu veux faire

Je souhaite exécuter selenium x chrome sur AWS Lambda.

environnement

windows 10 Pro python 3.7 chromdriver 2.37 headless-chromium 64.0.3282.167

Ne pas lister

-Comment créer et appeler la fonction AWS lambda -Comment faire un programme python qui peut faire fonctionner le navigateur avec le webdriver sélénium.

Où j'ai trébuché

  1. Unité de création de couches AWS Lambda
  2. Comment installer et appeler AWS Lambda Layers

1. Unité de création de couches AWS Lambda

Tout d'abord, les couches AWS Lambda sont comme des fonctions courantes qui peuvent être utilisées en commun depuis lamda. Il peut être appelé comme référencé à partir de l'unité principale Lambda, comme illustré ci-dessous. En supprimant une partie de la fonction, vous pouvez alléger le corps lambda. image.png En l'allégeant, vous pouvez éviter l'inconvénient que le code ne peut pas être affiché car la capacité du jeu de modules est trop grande, par exemple, comme indiqué ci-dessous. image.png

Cette fois, je voulais l'implémenter avec chromeDriver de python avec du sélénium, donc Créez les deux couches suivantes.

** 1. Couche qui stocke la bibliothèque de sélénium ** ** 2. Couche pour stocker chromeDriver **

↓ Configuration des couches image.png

La méthode de fabrication est décrite ci-dessous.

1. Couche pour stocker la bibliothèque de sélénium

1. Préparation d'un ensemble de bibliothèques à installer

Exécutez la commande suivante dans n'importe quel dossier. Je pense que vous avez déjà fait pip install sélénium, Comme c'est une tâche de préparer la bibliothèque à installer, cela se fait dans un endroit différent du module d'exécution.

Préparation du module sélénium


   pip install -t ./python/lib/python3.7/site-packages selenium

2. La configuration suivante est terminée. (Implémenté dans un environnement Windows.)

image.png

3. compression zip

Zip à partir du dossier python. image.png

4. Créer des couches AWS Lambda

Créez une nouvelle couche à partir de l'écran de la console lambda. Au moment de la création, spécifiez le fichier zip de 3 et créez-le. image.png

5. Ajouter une couche à la fonction Lambda

Reportez-vous aux couches créées en 4 à partir de la fonction Lambda. Si vous sélectionnez ** Custom Layer ** dans l'écran des paramètres de la couche, il sera affiché dans les options. image.png

6. Appel avec importation

Appel de lambda avec import.

déclaration d'importation


from selenium import webdriver

Si la configuration ci-dessus est incorrecte, l'erreur suivante se produit.

déclaration d'erreur


[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'selenium'

2. Couche pour stocker chromeDriver

1. Préparation du conducteur

Préparez le pilote officiellement distribué (2 points). Distributeur chromdriver: https://chromedriver.storage.googleapis.com/index.html?path=2.37/ Distributeur headless-chrome: https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip

2. compression zip

Placez les deux points ci-dessus dans le même dossier et fermez-les dans un environnement Linux. image.png

Si vous le zippez dans un environnement Windows, vous obtiendrez l'erreur suivante même si vous exécutez lamda. Même dans l'environnement Linux, si l'autorisation de chaque fichier n'est pas 777, l'erreur suivante se produira.

déclaration d'erreur


[ERROR] WebDriverException: Message: 'chromedriver' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home

Pour windowsPC, il existe les méthodes suivantes pour compresser dans l'environnement Linux. Je pourrais faire l'un ou l'autre.

  1. zip dans l'environnement WSL * Définir l'autorisation 777
  2. Créez un environnement approprié avec le bureau Docker (J'ai utilisé cet environnement php que j'ai utilisé. Https://hub.docker.com/_/php)

3. Ajouter une couche à la fonction Lambda

Reportez-vous aux couches créées en 4 à partir de la fonction Lambda.

4. Appel de lambda

Appelez depuis lambda en spécifiant le chemin suivant. Dans la spécification des couches AWS Lambda, il se trouve dans ** / opt **, spécifiez donc ce qui suit.

déclaration d'importation


driver = webdriver.Chrome(executable_path ="/opt/chromedriver", chrome_options=options)

Si le chemin est incorrect, par exemple en l'absence d'option, une erreur se produit.

déclaration d'erreur


[ERROR] WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

Un autre point à noter

Le lamda et le sélénium sont lents, définissez donc la valeur de temporisation de lamda sur une valeur plus longue. La valeur par défaut est de 3 secondes, donc il expire presque et l'erreur suivante se produit.

déclaration d'erreur


Task timed out after XX.XX seconds

Définition de la valeur du délai d'expiration image.png

la mise en oeuvre

Le code final pour lamda est ci-dessous.

lamda_function.py


from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def lambda_handler(event, context):
    LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"

    options = Options()
    options.binary_location = '/opt/headless-chromium'
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--single-process')
    options.add_argument('--disable-dev-shm-usage')

    driver = webdriver.Chrome(executable_path ='/opt/chromedriver', chrome_options=options)
    driver.get("https://xxxxxxxxxxx")

Résumé

En regardant d'autres articles, la plupart d'entre eux utilisaient serverless.yml ou cloudFormation. Je ne savais pas grand-chose à ce sujet, alors j'ai pris la méthode ci-dessus. J'espère que cela sera utile pour ceux qui installent le sélénium sans serveur pour la première fois.

Recommended Posts

Comment créer des couches AWS Lambda lors de l'exécution de sélénium × chrome sur AWS Lambda
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Comment configurer Layer sur Lambda à l'aide d'AWS SAM
Comment rendre le sélénium aussi léger que possible
[Python] Exécutez Headless Chrome sur AWS Lambda
Résumé de l'écriture d'AWS Lambda
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
[Version 2020] Comment installer Python3 sur EC2 d'AWS
Comment rendre plusieurs noyaux sélectionnables sur Jupyter
[AWS / Lambda] Comment charger une bibliothèque externe Python
Comment faire pour qu'AWS rekognition reconnaisse les fichiers image locaux
Créer des couches Lambda avec Lambda
Comment déboguer le sélénium
Vérifiez types_map lors de l'utilisation de mimetypes avec AWS Lambda (Python)
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Je veux AWS Lambda avec Python sur Mac!
[AWS EC2] Comment installer Maven sur Amazon Linux 2
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda
Comment passer en mode smartphone avec Python + Selenium + Chrome
Remarques sur la façon d'utiliser Firefox avec du sélénium sous Windows
[AWS] Comment étendre l'espace disque sur Amazon Linux
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
[AWS] Que faire lorsque vous souhaitez piper avec Lambda
Comment ne pas charger d'images lors de l'utilisation de PhantomJS avec Selenium
Comment créer un jeu d'action multijoueur en ligne avec Slack
Points addictifs lors du téléchargement de fichiers à l'aide de boto sur AWS Lambda
Couches AWS Lambda Une explication rapide de la création à la liaison
[Python] Permet d'importer les packages pip3 sur AWS Lambda
Comment s'inscrire auprès de pypi
Comment utiliser Python lambda
[Couches Python / AWS Lambda] Je souhaite réutiliser uniquement le module dans AWS Lambda Layers
Comment créer une bibliothèque .dylib à partir d'une bibliothèque .a avec OSX (El Capitan)
Comment installer automatiquement le pilote Chrome pour la version Chrome avec Python + Selenium + Chrome
Comment créer une API de machine learning sans serveur avec AWS Lambda
Comment faire une traduction japonais-anglais
Comment installer mysql-connector-python sur Mac
Comment utiliser Dataiku sous Windows
Remarques sur l'utilisation de pywinauto
Comment créer un bot slack
Comment installer Graph-Tool sur macOS
Comment installer VMware-Tools sur Linux
Comment installer pycrypto sur Windows
Comment créer un robot - Avancé
Comment déployer django-compresseur sous Windows
Exécutez Python selon la planification sur AWS Lambda
Remarques sur l'utilisation des featuretools
Comment créer une fonction récursive
[EC2] Comment exécuter le pilote Web sélénium
Comment ajouter sudo lors de l'exécution du débogage
Comment installer OpenCV sur Mac
Comment exécuter matplotlib sur heroku
Comment installer PyPy sur CentOS
Comment utiliser l'homebrew dans Debian
Malentendu sur la façon de connecter CNN
Comment installer TensorFlow sur CentOS 7