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.
downloadCompleteLogFile
löst beide Probleme.
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.
Ich habe im folgenden Artikel auch über die SigV4-Signatur geschrieben.
Recommended Posts