――Je souhaite vérifier automatiquement les pages Web qui sont fréquemment mises à jour manuellement (cette fois, j'utiliserai ZOZOTOWN comme exemple). --Créer un environnement d'exécution Selenium à l'aide de Fargate
Cet article est destiné à présenter l'introduction de Fargate + Selenium. L'auteur est un candidat informel et a la permission, donc j'utilise ZOZOTOWN, mon service, comme sujet! Si vous souhaitez détourner le contenu de l'article, veuillez ne pas enfreindre les mœurs et règlements!
Normalement, lors de l'exploitation d'un conteneur avec EC2, il est nécessaire de gérer l'instance, mais dans le cas de Fargate, la gestion de l'instance est laissée du côté d'Amazon, et c'est un service qui peut faire fonctionner le conteneur sans serveur simplement en enregistrant le conteneur.
Lambda est un service sans serveur bien connu, mais il manque de flexibilité en raison de restrictions telles que l'impossibilité d'utiliser des conteneurs et des délais d'expiration.
D'autre part, Fargate peut fournir divers services car il peut enregistrer et utiliser le conteneur qui s'exécute localement tel quel.
Un outil de test piloté par navigateur pour automatiser les tests d'applications Web.
Il prend en charge divers langages tels que Python, Ruby et Java, et vous pouvez facilement créer des scripts de test.
Cette fois, nous allons créer l'architecture suivante sur AWS.
Créez un script de test avec Selenium + Python.
./Dockerfile
FROM joyzoursky/python-chromedriver:3.8-alpine3.10-selenium
WORKDIR /usr/src
ADD main.py /usr/src
CMD ["python", "main.py"]
Cette fois, lors de l'utilisation de Selenium + Headless Chrome Ceci est l'image de base.
joyzoursky/python-chromedriver:3.7-alpine3.8-selenium https://hub.docker.com/r/joyzoursky/python-chromedriver/
python:./main.py
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException, NoSuchElementException
def check_coupon(driver, my_favorite_brand):
#Transition vers la page de coupons ZOZO
driver.get("https://zozo.jp/coupon/")
i = 1
while True:
try:
coupon_brand = driver.find_element_by_xpath(f'//*[@id="body"]/div[3]/ul/li[{i}]/a/figure/div[2]').text
if coupon_brand == my_favorite_brand:
return True
i += 1
except NoSuchElementException:
return False
if __name__ == '__main__':
try:
#Paramètres de Chrome sans tête
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument("--disable-setuid-sandbox")
options.add_argument('--window-size=1420,1080')
options.add_argument('--headless')
options.add_argument('--disable-gpu')
#Connectez-vous au navigateur Headless Chrome
driver = webdriver.Chrome(options=options)
#Réglez le délai de fonctionnement du sélénium à 15 secondes
driver.implicitly_wait(15)
#marque préférée
my_favorite_brand = "Carlie e felice"
#Vérifier le coupon
if check_coupon(driver, my_favorite_brand):
print("Je l'ai trouvé!", my_favorite_brand)
else:
print("Je n'ai pas pu le trouver aujourd'hui ...")
#Gestion des exceptions
except ElementClickInterceptedException as ecie:
print(f"exception!\n{ecie}")
except TimeoutException as te:
print(f"timeout!\n{te}")
finally:
#Fin
driver.close()
driver.quit()
Vérifiez s'il existe une marque: ** Carlie e felice ** sur la page du coupon.
C'était correct de gratter avec Requests + Beautiful Soup 4, mais cette fois, je voulais créer un environnement utilisant Selenium, alors ne le lancez pas du tout ;;
#Construire un conteneur
$ docker build -t zozo_check_coupons .
#Exécuter le conteneur
$ docker run -it --rm zozo_check_coupons
Je l'ai trouvé! Carlie et félice
Après avoir confirmé qu'il a été exécuté avec succès dans l'environnement local, l'étape suivante consiste à pousser ce conteneur vers Amazon ECR.
ECR est comme un Docker Hub privé sur AWS.
Créez un référentiel dédié au conteneur que vous souhaitez gérer cette fois dans ECR.
--Depuis Services, sélectionnez ** ECR ** et ** Créer un référentiel **
--Créez un référentiel en entrant le nom du référentiel "zozo_check_coupons"
À ce stade, l'URI du référentiel sera utilisé lors du transfert du conteneur, alors prenez-en note.
$ aws ecr get-login --region ap-northeast-1 --no-include-email
docker login -u AWS -p ...
.
.
. .dkr.ecr.ap-northeast-1.amazonaws.com
#Connexion de docker retournée~Copier et taper
$ docker login -u AWS -p ...
Login Succeeded
Si Connexion réussie s'affiche, c'est OK.
Copiez l'URL du référentiel que vous avez noté précédemment et poussez-le vers le référentiel créé
#Balise avec l'URI du référentiel
$ docker build -t xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zozo_check_coupons .
#Pousser le conteneur étiqueté vers ECR
$ docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zozo_check_coupons
J'ai réussi à pousser le conteneur vers le référentiel
Notez l'URI de l'image tel qu'il sera utilisé dans la définition de la tâche.
Créer un cluster qui est l'environnement d'exploitation du conteneur
--Sélectionnez ** ECS ** dans Services, puis ** Créer un cluster **.
--Sélectionnez le modèle de cluster "Networking Only"
--Enfin, vous pouvez créer un cluster en appuyant sur le bouton Créer.
Ensuite, définissez la tâche.
-Sélectionnez ** Créer une nouvelle définition de tâche **
--Sélectionnez ** Fargate ** dans la sélection de compatibilité du type de démarrage
--Définissez la tâche comme suit
S'il n'y a pas de rôle d'exécution de tâche, reportez-vous au côté ci-dessous et créez-le.
--Sélectionnez Ajouter un conteneur et copiez le nom du conteneur et l'URI de l'image de conteneur que vous avez poussée plus tôt ici.
Définir la mémoire et le processeur
Enfin, sélectionnez ** Créer ** pour terminer la définition de la tâche.
--Définissez les rôles requis pour exécuter la tâche
bash:./task-execution-assume-role.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
--Créez un rôle à l'aide du fichier de définition
$ aws iam --region ap-northeast-1 create-role --role-name ecsTaskExecutionRole --assume-role-policy-document file://task-execution-assume-role.json
--Créer un fichier de définition de tâche
./task-config.json
{
"family": "zozo-check-coupons-task",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "zozo-check-coupons-task",
"image": "xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zozo_check_coupons:latest",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-region": "ap-northeast-1",
"awslogs-group": "/ecs/zozo_check_coupons-task",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::xxxxxxxx:role/ecsTaskExecutionRole"
}
--Créer une tâche basée sur le fichier de définition
$ aws ecs register-task-definition --cli-input-json file://task-config.json
Vous pouvez désormais définir la tâche sans aucune erreur ni omission.
Pour plus de détails, veuillez consulter ici https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-cli-tutorial-fargate.html
Ensuite, nous exécuterons enfin les tâches définies selon un calendrier.
―― Les paramètres sont les suivants. L'heure fixe a été définie sur ** 24 ** car le renouvellement du coupon était de 24 heures.
--Sélectionnez le VPC créé lors de la création du cluster
Lorsque la tâche est terminée, le journal sera envoyé à CloudWatch
Quand j'ai vérifié, j'ai trouvé le journal suivant!
Cela ne semble pas être aujourd'hui. .. ..
Nous avons créé un environnement pour Fargate + Selenium! Fargate est assez flexible car vous pouvez enregistrer un conteneur qui a été déplacé en utilisant un conteneur tel quel.
Cependant, lors de l'exploration, le chargement de la page dans le processeur et la mémoire devient lent, le fonctionnement du navigateur par le programme peut ne pas fonctionner correctement et un délai d'expiration peut se produire, des mesures telles que la mise en veille étaient donc suffisantes Ça a l'air mieux.
Enfin, cet article est présenté à des fins d'introduction, veuillez donc lire attentivement les manières et les règlements avant de l'utiliser!
https://yomon.hatenablog.com/entry/2019/08/fargateselenium
Recommended Posts