Il existe de nombreuses façons de télécharger les journaux stockés dans une instance RDS en utilisant download_db_log_file_portion
lorsque vous google Cependant, il y avait un problème, j'ai donc écrit un script qui utilise une API appelée downloadCompleteLogFile
.
--Si c'est awscli, il sera interrompu au milieu (même s'il s'agit d'une pagination, il sera interrompu)
downloadCompleteLogFile
résout les deux problèmes.
Vous devez signer SigV4 vous-même pour accéder à downloadCompleteLogFile
. Nécessite un utilisateur IAM ou un rôle IAM.
Ce script Python est créé en signant la commande curl à télécharger avec SigV4. Le script Python lui-même ne se télécharge pas, c'est donc un moyen d'exécuter la commande curl créée ultérieurement.
Il est supposé que «~ / .aws / config» et «~ / .aws / credentials» ont les paramètres d'autorisation appropriés.
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"]
#Juger l'exclusion de téléchargement du nom de fichier
if not file_name.startswith("error/"):
continue
if file_name == "error/postgres.log":
continue
#URL de l'API à télécharger
remote_host = "rds." + region + ".amazonaws.com"
url = "https://" + remote_host + "/v13/downloadCompleteLogFile/" + instance_id + "/" + file_name
#Signature Sig V4
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'],
})
#Commande d'écho pour la progression du téléchargement
echo_cmd = "echo '" + file_name + "' >&2"
print(echo_cmd)
#commande curl
header = " ".join(["-H '" + k + ": " + v + "'" for (k, v) in req.headers.items()])
cmd = "curl " + header + " '" + url + "'"
print(cmd)
Ce Python produit la sortie suivante:
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'
Faites cela dans Bash.
$ python download-rds-log.py | bash > log.txt
Puisque la commande curl est sortie, elle peut être améliorée en exécution parallèle. C'est beaucoup plus rapide que d'utiliser download_db_log_file_portion sans modification.
J'ai également écrit sur la signature SigV4 dans l'article suivant.
Recommended Posts