Ich verwende AWS EC2, wenn ich schnell eine Splunk-Überprüfungsumgebung für Unternehmen erstellen möchte. Jedes Mal, wenn ich CloudFormation verwende, um das Erstellen und Zerstören zu automatisieren, muss ich auf der Website einen Download-Link zum Splunk-Installationsprogramm finden. Da die Linkerfassung ziemlich mühsam ist, habe ich mich entschlossen, Scraping in Python zu implementieren.
Die Code-Implementierung in API Gateway und Lambda wird in diesem Artikel weggelassen, da die Vorfahren viel Wissen an Qiita verloren haben. Das Folgende ist ein Artikel, auf den ich mich bezog.
[Python] Verwenden eines externen Moduls mit AWS Lambda Ich habe mit AWS Lambda eine einfache REST-API erstellt
Ziehen Sie mit Anfragen HTML von der offiziellen Website von Splunk. Lesen Sie den erworbenen HTML-Code mit Beautiful Soup und extrahieren Sie mit re die erforderlichen Informationen mit einem regulären Ausdruck. Ich denke, es gibt viele andere Möglichkeiten, um zu kratzen, aber ich denke, es ist einfacher, Anforderungen in Fällen zu verwenden, in denen Bildschirmübergänge nicht benötigt werden. Ich habe Selenium diesmal nicht verwendet, da es schwierig ist, den Treiber des Browsers zu verwalten, und ich wenig Erfahrung damit habe.
Das Folgende ist sofort der implementierte Code.
lambda_function.py
import requests
import re
from bs4 import BeautifulSoup
def lambda_handler(event, context):
#Erfassung von Betriebssysteminformationen
os_type = event.get("os")
#Für Linux erhalten Sie auch die Erweiterung
filename_extension = ""
if os_type == "Linux":
filename_extension = event.get("filename_extension")
#Installer-Typ abrufen
installer_type = event.get("installer")
#Holen Sie sich die Zielversion
target_version = event.get("version")
#Holen Sie sich das HTML-Tag der Zielversion
html_tag = get_old_installer_link(os_type, installer_type, filename_extension, target_version)
#Wenn die Zielversion in älteren Versionen nicht vorhanden ist, rufen Sie die neueste Version ab
if len(html_tag) == 0:
html_tag = get_new_installer_link(os_type, installer_type, filename_extension)
#Extrahieren Sie den Download-Link aus dem erworbenen Tag
dl_link = dl_link_extraction(html_tag)
#Rückgabe des Ausführungsergebnisses
return {
'statusCode': 200,
'body': dl_link
}
def get_old_installer_link(os, installer, extension, version):
#Verzweigen Sie den Ausführungsinhalt für jedes Installationsprogramm
if installer == "EP":
# EnterPrise
#Holen Sie sich alte Version
old_r = requests.get('https://www.splunk.com/page/previous_releases')
old_soup = BeautifulSoup(old_r.content, "html.parser")
#Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
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
#Holen Sie sich alte Version
old_r = requests.get('https://www.splunk.com/page/previous_releases/universalforwarder')
old_soup = BeautifulSoup(old_r.content, "html.parser")
#Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
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):
#Verzweigen Sie den Ausführungsinhalt für jedes Installationsprogramm
if installer == "EP":
# EnterPrise
#Holen Sie sich eine neue Version
new_r = requests.get('https://www.splunk.com/ja_jp/download/splunk-enterprise.html')
new_soup = BeautifulSoup(new_r.content, "html.parser")
#Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
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")
#Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
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):
#Download-Link mit kanonischem Ausdruck extrahieren
link = re.search(r'data-link=\"([^\"]+)\"', str(tag[0])).group(1)
return link
Grundsätzlich gibt es keine Fehlerkontrolle. Unabhängig davon, was passiert, wird der Status als 200 zurückgegeben. Eigentlich ist es besser, eine feste Fläche zu haben, aber diesmal bitte verzeihen Sie mir.
Geben Sie dem API-Gateway Parameter und treffen Sie den Endpunkt mit Curl. Es müssen vier Arten von Parametern hinzugefügt werden: das zu installierende Betriebssystem, das Zielinstallationsprogramm, die Erweiterung des Installationsprogramms und die Zielversion. Die Einstellwerte für jeden Parameter sind wie folgt. (Wenn Sie etwas anderes eingeben, wird der Download-Link nicht zurückgegeben ...)
Für Windows müssen Sie keine Erweiterung auswählen, sodass es keine Rolle spielt, ob Dateiname_Erweiterung leer ist. Im Folgenden wird das 7.2.3 Universal Forwarder-Installationsprogramm mit tgz unter Linux installiert.
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\"}"
Das Folgende ist das Ausführungsergebnis. Ein Statuscode und ein Download-Link werden zurückgegeben. (Der Statuscode kommt immer mit 200 zurück ...)
Obwohl ich es kurz geschrieben habe, habe ich festgestellt, dass der Code ziemlich rau ist. Ich werde es reparieren, wenn ich eine Chance habe.
Wie auch immer, Sie können jetzt den Download-Link kratzen. Sie können Ihren CloudFormation-Benutzerdaten jetzt eine Curl-Anweisung hinzufügen, um beim Erstellen einer EC2-Instanz einen Download-Link zu erhalten. Ich bin froh, dass ich von der Arbeit befreit wurde, Download-Links einzeln abzurufen und einzufügen ... Als nächstes muss ich CloudFormation schreiben ...
Recommended Posts