[PYTHON] Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen

TL; DR (5 Zeilen)

――Ich möchte Webseiten, die häufig manuell aktualisiert werden, automatisch überprüfen (diesmal verwende ich ZOZOTOWN als Beispiel). --Erstellen Sie mit Fargate eine Selenium-Ausführungsumgebung --Setzen Sie den lokalen Container in ECR und stellen Sie ihn in Fargate bereit

Hinweis

Dieser Artikel soll die Einführung von Fargate + Selen vorstellen. Der Autor ist ein informeller Kandidat und hat die Erlaubnis, also benutze ich unseren eigenen Service ZOZOTOWN als Thema! Wenn Sie den Inhalt des Artikels umleiten möchten, verstoßen Sie bitte nicht gegen die Sitten und Vorschriften!

Beschreibung des zu verwendenden Dienstes

Was ist Fargate?

Normalerweise muss beim Betrieb eines Containers mit EC2 die Instanz verwaltet werden. Bei Fargate bleibt die Instanzverwaltung jedoch der Amazon-Seite überlassen, und es handelt sich um einen Dienst, der den Container ohne Server betreiben kann, indem nur der Container registriert wird.

Lambda ist ein bekannter serverloser Dienst, der jedoch aufgrund von Einschränkungen wie der Unfähigkeit, Container und Zeitüberschreitungen zu verwenden, nicht flexibel genug ist.

Auf der anderen Seite kann Fargate verschiedene Dienste bereitstellen, da der Container, der lokal ausgeführt wird, so wie er ist registriert werden kann.

Was ist Selen?

Ein browsergesteuertes Testtool zur Automatisierung von Web-App-Tests.

Es unterstützt verschiedene Sprachen wie Python, Ruby und Java, und Sie können problemlos Testskripte erstellen.

die Architektur

Dieses Mal werden wir die folgende Architektur auf AWS erstellen.

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

Erstellen einer Docker-Datei und eines Hauptcodes

Erstellen Sie ein Testskript mit Selenium + Python.

Erstellen einer Docker-Datei

./Dockerfile


FROM joyzoursky/python-chromedriver:3.8-alpine3.10-selenium

WORKDIR /usr/src
ADD main.py /usr/src

CMD ["python", "main.py"]

Diesmal bei Verwendung von Selenium + Headless Chrome Dies ist das Basisbild.

joyzoursky/python-chromedriver:3.7-alpine3.8-selenium https://hub.docker.com/r/joyzoursky/python-chromedriver/

Hauptcode erstellen

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):
    #Übergang zur ZOZO-Gutscheinseite
    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:
        #Headless Chrome-Einstellungen
        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')
        #Stellen Sie eine Verbindung zum Headless Chrome-Browser her
        driver = webdriver.Chrome(options=options)
        #Stellen Sie das Zeitlimit für den Selenbetrieb auf 15 Sekunden ein
        driver.implicitly_wait(15)

        #Lieblingsmarke
        my_favorite_brand = "Carlie e felice"
        #Gutschein prüfen
        if check_coupon(driver, my_favorite_brand):
            print("Ich habe es gefunden!", my_favorite_brand)
        else:
            print("Ich konnte es heute nicht finden ...")

    #Ausnahmebehandlung
    except ElementClickInterceptedException as ecie:
        print(f"exception!\n{ecie}")
    except TimeoutException as te:
        print(f"timeout!\n{te}")
    finally:
        #Ende
        driver.close()
        driver.quit()

Überprüfen Sie auf der Gutscheinseite, ob es eine Marke gibt: ** Carlie e felice **.

Es war in Ordnung, mit Requests + Beautiful Soup 4 zu kratzen, aber dieses Mal wollte ich eine Umgebung mit Selen bauen, also werfen Sie es bitte überhaupt nicht ;;

Ausführen des Containers in der lokalen Umgebung

#Container bauen
$ docker build -t zozo_check_coupons .

#Container ausführen
$ docker run -it --rm zozo_check_coupons
Ich habe es gefunden! Carlie e felice

Nachdem Sie bestätigt haben, dass es in der lokalen Umgebung erfolgreich ausgeführt wurde, müssen Sie diesen Container im nächsten Schritt an Amazon ECR senden.

ECR ist wie ein privater Docker Hub auf AWS.

Erstellen der erforderlichen Umgebung für AWS

Erstellen Sie eine ECR-Umgebung

Erstellen Sie ein ECR-Repository

Erstellen Sie ein Repository für den Container, den Sie dieses Mal in ECR verwalten möchten.

--Wählen Sie aus den Diensten ** ECR ** und ** Create Repository ** 2.png

--Erstellen Sie ein Repository, indem Sie den Repository-Namen "zozo_check_coupons" eingeben. スクリーンショット 2020-01-02 21.21.16.png

Zu diesem Zeitpunkt wird der URI des Repositorys beim Verschieben des Containers verwendet. Notieren Sie sich dies.

Melden Sie sich bei ECR an

$ aws ecr get-login --region ap-northeast-1 --no-include-email
docker login -u AWS -p ...
.
.
. .dkr.ecr.ap-northeast-1.amazonaws.com

#Zurückgegebenes Docker-Login~Kopieren und eingeben
$ docker login -u AWS -p ...
Login Succeeded

Es ist in Ordnung, wenn Login Succeeded angezeigt wird

Drücken Sie auf ECR

Kopieren Sie die URL des zuvor notierten Repositorys und verschieben Sie sie in das erstellte Repository

#Tag mit dem URI des Repositorys
$ docker build -t xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zozo_check_coupons .
#Schieben Sie markierte Container an ECR
$ docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zozo_check_coupons

Ich konnte den Container erfolgreich in das Repository verschieben 1.png

Notieren Sie sich den Bild-URI, wie er in der Aufgabendefinition verwendet wird.

Erstellen Sie einen Cluster mit ECS

Erstellen Sie einen Cluster, der die Umgebung für den Betrieb des Containers darstellt

--Wählen Sie ** ECS ** unter Dienste und dann ** Cluster erstellen **. 3.png

--Wählen Sie die Cluster-Vorlage "Nur Netzwerk". スクリーンショット 2020-01-02 22.31.59.png

Aufgaben in ECS definieren

Definieren Sie als Nächstes die Aufgabe.

-Wählen Sie ** Neue Aufgabendefinition erstellen ** 6.png

--Wählen Sie ** Fargate ** in der Auswahl für die Kompatibilität des Boot-Typs スクリーンショット 2020-01-02 22.56.44.png

Wenn keine Aufgabenausführungsrolle vorhanden ist, lesen Sie die folgenden Schritte und erstellen Sie sie.

--Wählen Sie Container hinzufügen und kopieren Sie den Containernamen und den URI des Containerbilds, das Sie zuvor hier verschoben haben. スクリーンショット 2020-01-02 22.59.54.png

--Wählen Sie abschließend ** Erstellen **, um die Aufgabendefinition abzuschließen. 7.png

Nebenbei: Aufgabendefinition in der CLI

bash:./task-execution-assume-role.json


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

--Erstellen Sie eine Rolle mithilfe der Definitionsdatei

$ aws iam --region ap-northeast-1 create-role --role-name ecsTaskExecutionRole --assume-role-policy-document file://task-execution-assume-role.json

--Erstellen Sie eine Aufgabendefinitionsdatei

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

--Erstellen Sie eine Aufgabe basierend auf der Definitionsdatei

$ aws ecs register-task-definition --cli-input-json file://task-config.json

Jetzt können Sie die Aufgabe ohne Fehler oder Auslassungen definieren.

Details finden Sie hier https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-cli-tutorial-fargate.html

Erstellen eines Zeitplanlaufs

Als nächstes werden wir schließlich die definierten Aufgaben nach einem Zeitplan ausführen.

--Wählen Sie den von Ihnen erstellten Cluster aus, wählen Sie ** Aufgabe planen ** und drücken Sie ** Erstellen **

8.png

――Die Einstellungen sind wie folgt. Die feste Zeit wurde auf ** 24 ** festgelegt, da die Verlängerung des Gutscheins 24 Stunden betrug. スクリーンショット 2020-01-02 23.05.25.png

--Wählen Sie beim Erstellen des Clusters die erstellte VPC aus 9.png

Überprüfen Sie das Protokoll mit CloudWatch

Nach Abschluss der Aufgabe wird das Protokoll an CloudWatch gesendet

Als ich nachgesehen habe, habe ich das folgende Protokoll gefunden!

11.png

Es scheint nicht heute zu sein. .. ..

abschließend

Wir haben eine Umgebung für Fargate + Selen geschaffen! Fargate ist sehr flexibel, da Sie einen Container, der verschoben wurde, mithilfe eines Containers registrieren können.

Beim Crawlen wird das Laden der Seite in die CPU und den Speicher jedoch langsam, der Browserbetrieb durch das Programm funktioniert möglicherweise nicht richtig und es kann zu einer Zeitüberschreitung kommen, sodass Maßnahmen wie das Einschalten des Ruhezustands ausreichend waren. Es sieht besser aus.

Schließlich wird dieser Artikel zum Zweck der Einführung vorgestellt. Lesen Sie daher die Sitten und Vorschriften sorgfältig durch, bevor Sie ihn verwenden!

Verweise

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

Recommended Posts

Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Ich habe versucht, eine Umgebung von MkDocs unter Amazon Linux zu erstellen
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, schlechte Tweets regelmäßig mit der AWS Lambda + Twitter API zu löschen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, mit Raspberry Pi 4 eine Umgebung von Ubuntu 20.04 LTS + ROS2 zu erstellen
Ich habe versucht, mit Selenium + Python einfach ein vollautomatisches Anwesenheitssystem zu erstellen
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
[Einführung in AWS] Ich habe versucht, mit der Sprach-Text-Konvertierung zu spielen ♪
Ich habe versucht, eine Umgebung mit WSL + Ubuntu + VS-Code in einer Windows-Umgebung zu erstellen
Erstellen Sie eine Umgebung mit virtualenv
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
[AWS] Ich habe versucht, EC2, RDS, Django zu verwenden. Umweltbau ab 1
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Minimales Makefile und buildout.cfg, um eine Umgebung mit buildout zu erstellen
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, eine Serverumgebung zu erstellen, die unter Windows 10 ausgeführt wird
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Bereiten Sie eine Umgebung für die Verwendung von OpenCV und Pillow mit AWS Lambda vor
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, mich automatisch mit Selen bei Twitter anzumelden (RPA, Scraping)
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, eine Umgebung zu schaffen, in der Sie ein lustiges Zoom-Meeting mit Linux (Ubuntu) + Zoom + OBS Studio + Soundeffekten haben können
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
So erstellen Sie eine NVIDIA Docker-Umgebung
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Ich habe versucht, mit Hy anzufangen
Ich habe mit TWE-Lite-2525A einen Öffnungs- / Schließsensor (Twitter-Link) erstellt
Ich habe mit Docker eine Anaconda-Umgebung erstellt!
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Entwicklung] (2/3) zu erstellen.
Poste regelmäßig mit AWS Lambda auf Twitter!
Ich habe versucht, Text mit TensorFlow zu klassifizieren
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
Ich habe versucht, datetime <-> string mit tzinfo mit strftime () und strptime () zu konvertieren.
Ich möchte mit aws mit Python spielen
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Ausführung] (3/3) zu erstellen.
Ich habe versucht, mit Django eine CSV-Upload-, Datenverarbeitungs- und Download-Funktion zu erstellen
Ich habe versucht, CVAE mit PyTorch zu implementieren
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Setup] (1/3) zu erstellen.
Ich habe versucht, eine Mac Python-Entwicklungsumgebung mit pythonz + direnv zu erstellen