――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
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!
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.
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.
Dieses Mal werden wir die folgende Architektur auf AWS erstellen.
Erstellen Sie ein Testskript mit Selenium + Python.
./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/
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 ;;
#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 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 **
--Erstellen Sie ein Repository, indem Sie den Repository-Namen "zozo_check_coupons" eingeben.
Zu diesem Zeitpunkt wird der URI des Repositorys beim Verschieben des Containers verwendet. Notieren Sie sich dies.
$ 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
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
Notieren Sie sich den Bild-URI, wie er in der Aufgabendefinition verwendet wird.
Erstellen Sie einen Cluster, der die Umgebung für den Betrieb des Containers darstellt
--Wählen Sie ** ECS ** unter Dienste und dann ** Cluster erstellen **.
--Wählen Sie die Cluster-Vorlage "Nur Netzwerk".
Geben Sie den Clusternamen ein und aktivieren Sie VPC erstellen.
Schließlich können Sie einen Cluster erstellen, indem Sie auf die Schaltfläche Erstellen klicken.
Definieren Sie als Nächstes die Aufgabe.
-Wählen Sie ** Neue Aufgabendefinition erstellen **
--Wählen Sie ** Fargate ** in der Auswahl für die Kompatibilität des Boot-Typs
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.
--Wählen Sie abschließend ** Erstellen **, um die Aufgabendefinition abzuschließen.
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
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 **
――Die Einstellungen sind wie folgt. Die feste Zeit wurde auf ** 24 ** festgelegt, da die Verlängerung des Gutscheins 24 Stunden betrug.
--Wählen Sie beim Erstellen des Clusters die erstellte VPC aus
Nach Abschluss der Aufgabe wird das Protokoll an CloudWatch gesendet
Als ich nachgesehen habe, habe ich das folgende Protokoll gefunden!
Es scheint nicht heute zu sein. .. ..
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!
https://yomon.hatenablog.com/entry/2019/08/fargateselenium
Recommended Posts