J'utilise AWS EC2 lorsque je souhaite créer rapidement un environnement de vérification Splunk pour les entreprises. Chaque fois que j'utilise CloudFormation pour automatiser la construction et la destruction, je dois aller sur le site pour obtenir un lien de téléchargement sur le programme d'installation de Splunk. Le travail d'acquisition de lien étant assez gênant, j'ai décidé de mettre en œuvre le scraping en Python.
L'implémentation du code dans API Gateway et Lambda est omise dans cet article car les ancêtres ont perdu beaucoup de connaissances au profit de Qiita. Ce qui suit est un article auquel j'ai fait référence.
[Python] Utilisation d'un module externe avec AWS Lambda J'ai créé une API REST simple avec AWS Lambda
Tirez le HTML du site Web officiel de Splunk avec des demandes. Lisez le HTML acquis avec Beautiful Soup et utilisez re pour extraire les informations nécessaires avec une expression régulière. Je pense qu'il existe de nombreuses autres façons de gratter, mais je pense qu'il est plus facile d'utiliser les demandes dans les cas où les transitions d'écran ne sont pas nécessaires. Je n'ai pas utilisé Selenium cette fois car il est difficile de gérer le pilote du navigateur et j'ai peu d'expérience de son utilisation.
Immédiatement, voici le code implémenté.
lambda_function.py
import requests
import re
from bs4 import BeautifulSoup
def lambda_handler(event, context):
#Acquisition des informations OS
os_type = event.get("os")
#Pour Linux, obtenez également l'extension
filename_extension = ""
if os_type == "Linux":
filename_extension = event.get("filename_extension")
#Obtenir le type d'installation
installer_type = event.get("installer")
#Obtenez la version cible
target_version = event.get("version")
#Récupérez la balise HTML de la version cible
html_tag = get_old_installer_link(os_type, installer_type, filename_extension, target_version)
#Si la version cible n'existe pas dans les versions plus anciennes, obtenez la dernière version
if len(html_tag) == 0:
html_tag = get_new_installer_link(os_type, installer_type, filename_extension)
#Extraire le lien de téléchargement de la balise acquise
dl_link = dl_link_extraction(html_tag)
#Retour du résultat de l'exécution
return {
'statusCode': 200,
'body': dl_link
}
def get_old_installer_link(os, installer, extension, version):
#Branche le contenu de l'exécution pour chaque installateur
if installer == "EP":
# EnterPrise
#Obtenir l'ancienne version
old_r = requests.get('https://www.splunk.com/page/previous_releases')
old_soup = BeautifulSoup(old_r.content, "html.parser")
#Branche le contenu de l'exécution pour chaque système d'exploitation
if os == "Windows":
html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Windows"})
elif os == "Linux":
html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})
elif installer == "UF":
# UniversalForwarder
#Obtenir l'ancienne version
old_r = requests.get('https://www.splunk.com/page/previous_releases/universalforwarder')
old_soup = BeautifulSoup(old_r.content, "html.parser")
#Branche le contenu de l'exécution pour chaque système d'exploitation
if os == "Windows":
html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Windows"})
elif os == "Linux":
html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})
return html_list
def get_new_installer_link(os, installer, extension):
#Branche le contenu de l'exécution pour chaque installateur
if installer == "EP":
# EnterPrise
#Obtenir une nouvelle version
new_r = requests.get('https://www.splunk.com/ja_jp/download/splunk-enterprise.html')
new_soup = BeautifulSoup(new_r.content, "html.parser")
#Branche le contenu de l'exécution pour chaque système d'exploitation
if os == "Windows":
html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Windows"})
elif os == "Linux":
html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})
elif installer == "UF":
# UniversalForwarder
new_r = requests.get('https://www.splunk.com/ja_jp/download/universal-forwarder.html')
new_soup = BeautifulSoup(new_r.content, "html.parser")
#Branche le contenu de l'exécution pour chaque système d'exploitation
if os == "Windows":
html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Windows"})
elif os == "Linux":
html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})
return html_list
def dl_link_extraction(tag):
#Extraire le lien de téléchargement avec l'expression canonique
link = re.search(r'data-link=\"([^\"]+)\"', str(tag[0])).group(1)
return link
Fondamentalement, il n'y a pas de contrôle des erreurs. Quoi qu'il arrive, le statut sera retourné à 200. En fait, il vaut mieux avoir une zone solide, mais cette fois, pardonnez-moi.
Donnez des paramètres à API Gateway et atteignez le point de terminaison avec curl. Il existe quatre types de paramètres à ajouter: le système d'exploitation à installer, le programme d'installation cible, l'extension du programme d'installation et la version cible. Les valeurs de réglage correspondant à chaque paramètre sont les suivantes. (Si vous entrez autre chose, le lien de téléchargement ne sera pas retourné ...)
Pour Windows, vous n'avez pas besoin de sélectionner une extension, donc peu importe si filename_extension est vide. Ce qui suit est un cas d'obtention du programme d'installation 7.2.3 Universal Forwarder avec tgz sous Linux.
curl -X POST "https://xxxxxxxxxx.execute-api.ap-xxxxxxxxx-x.amazonaws.com/xxx/xxxxx" -d "{\"os\": \"Linux\",\"installer\": \"UF\",\"version\": \"7.2.3\",\"filename_extension\": \"tgz\"}"
Voici le résultat de l'exécution. Un code de statut et un lien de téléchargement seront renvoyés. (Le code d'état revient toujours avec 200 ...)
Même si je l'ai écrit brièvement, j'ai réalisé que le code est assez approximatif. Je vais le réparer si j'ai une chance.
Quoi qu'il en soit, vous pouvez maintenant gratter le lien de téléchargement. Vous pouvez maintenant ajouter une instruction curl à vos données utilisateur CloudFormation pour obtenir un lien de téléchargement lors de la création d'une instance EC2. Je suis heureux d'avoir été libéré du travail de récupération et de collage des liens de téléchargement un par un ... Ensuite, je dois écrire CloudFormation ...
Recommended Posts