[PYTHON] Script pour télécharger les fichiers journaux AWS RDS à grande vitesse

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.

Problèmes avec download_db_log_file_portion:

--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.

Script pour accéder à downloadCompleteLogFile

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.

Lien

J'ai également écrit sur la signature SigV4 dans l'article suivant.

Recommended Posts

Script pour télécharger les fichiers journaux AWS RDS à grande vitesse
Comment créer des fichiers volumineux à haute vitesse
Une petite histoire qui produit des données de table au format CSV à grande vitesse
Script shell qui numérote les noms en double lors de la création de fichiers
Un ensemble de fichiers de script qui font wordcloud avec Python3
[Python] Article qui permet le calcul rapide de matrices éparses
Un script python qui supprime les fichiers ._DS_Store et ._ * créés sur Mac
[Big Query] Chargez une partie des données BQ dans les pandas à grande vitesse