[PYTHON] J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate

TL; DR (5 lignes)

――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

Mise en garde

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!

Description du service à utiliser

Qu'est-ce que Fargate

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.

Qu'est-ce que le sélénium

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.

architecture

Cette fois, nous allons créer l'architecture suivante sur AWS.

スクリーンショット 2020-01-03 11.00.20.png

Création d'un Dockerfile et du code principal

Créez un script de test avec Selenium + Python.

Créer un Dockerfile

./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/

Création du code principal

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 ;;

Exécution du conteneur dans l'environnement local

#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éation de l'environnement requis pour AWS

Créer un environnement ECR

Créer un référentiel ECR

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 ** 2.png

--Créez un référentiel en entrant le nom du référentiel "zozo_check_coupons" スクリーンショット 2020-01-02 21.21.16.png

À ce stade, l'URI du référentiel sera utilisé lors du transfert du conteneur, alors prenez-en note.

Connectez-vous à ECR

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

Push to ECR

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 1.png

Notez l'URI de l'image tel qu'il sera utilisé dans la définition de la tâche.

Créer un cluster avec ECS

Créer un cluster qui est l'environnement d'exploitation du conteneur

--Sélectionnez ** ECS ** dans Services, puis ** Créer un cluster **. 3.png

--Sélectionnez le modèle de cluster "Networking Only" スクリーンショット 2020-01-02 22.31.59.png

--Enfin, vous pouvez créer un cluster en appuyant sur le bouton Créer. 5.png

Définition des tâches dans ECS

Ensuite, définissez la tâche.

-Sélectionnez ** Créer une nouvelle définition de tâche ** 6.png

--Sélectionnez ** Fargate ** dans la sélection de compatibilité du type de démarrage スクリーンショット 2020-01-02 22.56.44.png

--Définissez la tâche comme suit スクリーンショット 2020-01-02 22.57.26.png

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. スクリーンショット 2020-01-02 22.59.54.png

A côté: définition de tâche dans la CLI

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

Créer une exécution programmée

Ensuite, nous exécuterons enfin les tâches définies selon un calendrier.

8.png

―― Les paramètres sont les suivants. L'heure fixe a été définie sur ** 24 ** car le renouvellement du coupon était de 24 heures. スクリーンショット 2020-01-02 23.05.25.png

--Sélectionnez le VPC créé lors de la création du cluster 9.png

Vérifiez le journal avec CloudWatch

Lorsque la tâche est terminée, le journal sera envoyé à CloudWatch

Quand j'ai vérifié, j'ai trouvé le journal suivant!

11.png

Cela ne semble pas être aujourd'hui. .. ..

en conclusion

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!

Les références

https://yomon.hatenablog.com/entry/2019/08/fargateselenium

Recommended Posts

J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
J'ai essayé de créer un environnement de MkDocs sur Amazon Linux
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
J'ai essayé de supprimer régulièrement les mauvais tweets avec l'API AWS Lambda + Twitter
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé de créer un environnement Ubuntu 20.04 LTS + ROS2 avec Raspberry Pi 4
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai essayé de devenir un Ann Man en utilisant OpenCV
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé de trouver la classe alternative avec tensorflow
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
J'ai essayé de créer un environnement avec WSL + Ubuntu + VS Code dans un environnement Windows
Créer un environnement avec virtualenv
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
J'ai essayé d'utiliser AWS Chalice
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
[AWS] J'ai essayé d'utiliser EC2, RDS, Django. Construction de l'environnement à partir de 1
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Makefile minimal et buildout.cfg pour créer un environnement avec buildout
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
J'ai essayé de créer l'API Quip
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
Créez un alias pour Route53 vers CloudFront avec l'API AWS
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
Préparer un environnement pour utiliser OpenCV et Pillow avec AWS Lambda
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer un environnement où vous pouvez avoir une réunion Zoom amusante avec Linux (Ubuntu) + Zoom + OBS Studio + effets sonores
J'ai essayé de créer un linebot (implémentation)
J'ai essayé d'envoyer un SMS avec Twilio
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de créer un linebot (préparation)
J'ai essayé de visualiser AutoEncoder avec TensorFlow
Comment créer un environnement NVIDIA Docker
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé de commencer avec Hy
J'ai créé un capteur d'ouverture / fermeture (lien Twitter) avec TWE-Lite-2525A
J'ai créé un environnement Anaconda à l'aide de Docker!
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
Publiez régulièrement sur Twitter en utilisant AWS lambda!
J'ai essayé de classer le texte en utilisant TensorFlow
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
J'ai essayé de convertir la chaîne datetime <-> avec tzinfo en utilisant strftime () et strptime ()
Je veux jouer avec aws avec python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
J'ai essayé de créer le téléchargement CSV, le traitement des données, la fonction de téléchargement avec Django
J'ai essayé d'implémenter CVAE avec PyTorch
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv