[PYTHON] Skript zum Herunterladen von AWS RDS-Protokolldateien mit hoher Geschwindigkeit

Es gibt viele Möglichkeiten, die in Ihrer RDS-Instanz gespeicherten Protokolle mithilfe von "download_db_log_file_portion" herunterzuladen, wenn Sie googeln. Da es jedoch ein Problem gab, schrieb ich ein Skript, das eine API namens "downloadCompleteLogFile" verwendet.

Probleme mit download_db_log_file_portion:

downloadCompleteLogFile löst beide Probleme.

Skript für den Zugriff auf downloadCompleteLogFile

Sie müssen SigV4 selbst signieren, um auf "downloadCompleteLogFile" zugreifen zu können. Benötigt einen IAM-Benutzer oder eine IAM-Rolle.

Dieses Python-Skript wird durch Signieren des Befehls curl zum Herunterladen mit SigV4 erstellt. Das Python-Skript selbst wird nicht heruntergeladen, sodass der erstellte Curl-Befehl später ausgeführt werden kann.

Es wird davon ausgegangen, dass "~ / .aws / config" und "~ / .aws / credentials" über die entsprechenden Berechtigungseinstellungen verfügen.

import boto3
from botocore.awsrequest import AWSRequest
import botocore.auth as auth
import urllib.request

import pprint

profile     = "default"
instance_id = "database-1"
region = "ap-northeast-1"

session = boto3.session.Session(profile_name = profile)
credentials = session.get_credentials()
sigv4auth = auth.SigV4Auth(credentials, "rds", region)

rds_client = session.client('rds')
files = rds_client.describe_db_log_files(DBInstanceIdentifier = instance_id)

for file in files["DescribeDBLogFiles"]:
    file_name = file["LogFileName"]

    #Richter Download-Ausschluss vom Dateinamen
    if not file_name.startswith("error/"):
        continue
    if file_name == "error/postgres.log":
        continue

    #API-URL für downloadCompleteLogFile
    remote_host = "rds." + region + ".amazonaws.com"
    url = "https://" + remote_host + "/v13/downloadCompleteLogFile/" + instance_id + "/" + file_name

    #Sig V4 Signatur
    awsreq = AWSRequest(method = "GET", url = url)
    sigv4auth.add_auth(awsreq)

    req = urllib.request.Request(url, headers = {
        "Authorization": awsreq.headers['Authorization'],
        "Host": remote_host,
        "X-Amz-Date": awsreq.context['timestamp'],
       })

    #Echo-Befehl für den Download-Fortschritt
    echo_cmd = "echo '" + file_name + "' >&2"
    print(echo_cmd)

    #Curl-Befehl
    header = " ".join(["-H '" + k + ": " + v + "'" for (k, v) in req.headers.items()])
    cmd = "curl " + header + " '" + url + "'"
    print(cmd)

Dieser Python erzeugt die folgende Ausgabe:

echo 'error/postgresql.log.2020-11-05-23' >&2
curl -H 'Authorization: AWS4-HMAC-SHA256 Credential=AKIAXXXXXXXXXXXXXXXX/20201105/ap-northeast-1/rds/aws4_request, SignedHeaders=host;x-amz-date, Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -H 'Host: rds.ap-northeast-1.amazonaws.com' -H 'X-amz-date: 20201105T231307Z' 'https://rds.ap-northeast-1.amazonaws.com/v13/downloadCompleteLogFile/database-1/error/postgresql.log.2020-11-05-23'

Mach das in Bash.

$ python download-rds-log.py | bash > log.txt

Da der Befehl curl ausgegeben wird, kann er zur parallelen Ausführung verbessert werden. Es ist viel schneller als die Verwendung von download_db_log_file_portion ohne Änderung.

Verknüpfung

Ich habe im folgenden Artikel auch über die SigV4-Signatur geschrieben.

Recommended Posts

Skript zum Herunterladen von AWS RDS-Protokolldateien mit hoher Geschwindigkeit
So erstellen Sie große Dateien mit hoher Geschwindigkeit
Eine kleine Geschichte, die Tabellendaten im CSV-Format mit hoher Geschwindigkeit ausgibt
Shell-Skript, das beim Erstellen von Dateien doppelte Namen nummeriert
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
[Python] Artikel, der eine schnelle Berechnung der Sparse-Matrix ermöglicht
Ein Python-Skript, das auf dem Mac erstellte ._DS_Store- und ._ * -Dateien löscht
[Große Abfrage] Laden Sie einen Teil der BQ-Daten mit hoher Geschwindigkeit in Pandas