Trapheus

Restore RDS instances in AWS without worrying about client downtime or configuration retention.
Trapheus can restore individual RDS instance or a RDS cluster. Modelled as a state machine, with the help of AWS step functions, Trapheus restores the RDS instance in a much faster way than the usual SQL dump preserving the same instance endpoint and confgurations as before.

TravisCI Build Status Coverage serverless badge release badge

Anglais|Chinois simplifié|français

📖 Table of Contents
[![\---------------------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#table-of-contents) ## ➤ Table des matières - - [➤ Prérequis](#-pre-requisites) - - [➤ Paramètres](#-parameters) - - [➤ Instructions](#-instructions) - - [➤ Exécution](#-execution) - - [➤ Comment ça marche](#-how-it-works) - - [➤ Contribuer à Trapheus](#-contributing-to-trapheus) - - [➤ Contributeurs](#-contributors) - - [➤ Montrez votre soutien](#-show-your-support)

---------------------------------------------------------------------------------------------------------------------------------------------------------------

➤ Prérequis

L’application nécessite que les ressources AWS suivantes existent avant l’installation :

  1. python3.11installé sur la machine locale suivantece.

  2. ConfigurerAWS SES
    • Configurez l’e-mail de l’expéditeur et du destinataire SES (SES Console->Adresses e-mail).
      • Une alerte par courrier électronique SES est configurée pour informer l’utilisateur de toute défaillance de la machine à états. Le paramètre email de l’expéditeur est nécessaire pour configurer l’ID de messagerie via lequel l’alerte est envoyée. Le paramètre email du destinataire est nécessaire pour définir l’ID de messagerie auquel l’alerte est envoyée.
  3. Créez le compartiment S3 dans lequel le système va stocker les modèles de formation de nuages :
    • Nom proposé : trapheus-cfn-s3-[identifiant de compte-]-[région]. Il est recommandé que le nom contienne votre :
      • identifiant de compte, car les noms de compartiment doivent être globaux (empêche quelqu’un d’autre d’avoir le même nom)
      • région, pour suivre facilement lorsque vous avez des compartiments trapheus-s3 dans plusieurs régions
  4. Un VPC (spécifique à la région). Le même VPC/région doit être utilisé à la fois pour la ou les instances RDS, à utiliser dans Trapheus, et pour les lambdas de Trapheus.
  5. Une ou plusieurs instances d’une base de données RDS que vous souhaitez restaurer.
    • Exemple minimal_gratuit_Configuration RDS :
      • Options du moteur : MySQL
      • Modèles : niveau gratuit
      • Paramètres : entrez le mot de passe
      • Connectivité : VPC : Trapheus-VPC-[région]

-----------------------------------------------------

➤ Paramètres

Voici les paramètres de création du modèle cloudformation :

  1. --s3-bucket:[Facultatif]Le nom du compartiment S3 du modèle CloudFormation duConditions préalables.
  2. vpcID:[Requis]L’identifiant du VPC duConditions préalables. Les lambdas de la machine à états Trapheus seront créés dans ce VPC.
  3. Subnets:[Requis]Une liste d’identifiants de sous-réseau privés (spécifiques à la région) séparés par des virgulesConditions préalablesVPC.
  4. SenderEmail:[Requis]L’email d’envoi SES configuré dans leConditions préalables
  5. RecipientEmail:[Requis]Liste séparée par des virgules des adresses e-mail des destinataires configurées dansConditions préalables.
  6. UseVPCAndSubnets:[Facultatif]S’il faut utiliser le vpc et les sous-réseaux pour créer un groupe de sécurité et lier le groupe de sécurité et le vpc aux lambdas. Lorsque UseVPCAndSubnets est laissé de côté (par défaut) ou défini sur « true », les lambdas sont connectés à un VPC dans votre compte et, par défaut, la fonction ne peut pas accéder au RDS (ou à d’autres services) si le VPC ne fournit pas d’accès (soit par acheminer le trafic sortant vers unPasserelle NATdans un sous-réseau public, ou avoir unPoint de terminaison d’un VPC, qui entraînent tous deux des coûts ou nécessitent une configuration supplémentaire). S’il est défini sur « false », lelambdas s’exécutera dans un VPC par défaut appartenant à Lambda qui a accès à RDS (et à d’autres services AWS).
  7. SlackWebhookUrls:[Facultatif]Liste de webhooks Slack séparés par des virgules pour les alertes d’échec.

-----------------------------------------------------

➤ Instructions

Installation

Pour configurer le Trapheus dans votre compte AWS, suivez les étapes ci-dessous :

  1. Cloner le dépôt Trapheus Git
  2. Configuration des informations d’identification AWS. Trapheus utilise boto3 comme bibliothèque client pour communiquer avec Amazon Web Services. Ne hésitez pas àutiliser n’importe quelle variable d’environnementque boto3 prend en charge pour fournir des informations d’authentification.
  3. Courirpip install -r requirements.txtpour installer le graphe de dépendances
  4. Courirpython install.py

Vous êtes toujours confronté à un problème ? Vérifier laProblèmessection ou ouvrir un nouveau numéro

Ce qui précède configurera un CFT dans votre compte AWS avec le nom fourni lors de l’installation.

A NOTER: Le CFT crée les ressources suivantes :

  1. DBRestoreStateMachineMachine à états de fonction étape
  2. Plusieurs lambdas pour exécuter différentes étapes dans la machine à états
  3. LambdaExecutionRole : utilisé dans tous les lambdas pour effectuer plusieurs tâches sur RDS
  4. StatesExecutionRole : rôle IAM avec des autorisations pour exécuter la machine d’état et appeler des lambdas
  5. Compartiment S3 : rds-snapshots-<your_account_id> où les instantanés seront exportés
  6. Clé KMS : est requise pour démarrer la tâche d’exportation de l’instantané vers s3
  7. DBRestoreStateMachineEventRule : une règle Cloudwatch à l’état désactivé, qui peut être utilisée comme ci-dessusinstructionsbasé sur les besoins de l’utilisateur
  8. CWEventStatesExecutionRole : rôle IAM utilisé par la règle DBRestoreStateMachineEventRule CloudWatch, pour permettre l’exécution de la machine d’état depuis CloudWatch

Pour configurer l’exécution de la fonction étape par étape via une exécution planifiée à l’aide de la règle CloudWatch, suivez les étapes ci-dessous :

  1. Accédez à la section DBRestoreStateMachineEventRule dans le template.yaml du dépôt Trapheus.
  2. Nous l’avons défini comme règle cron planifiée pour qu’elle s’exécute tous les VENDREDI à 8h00 UTC. Vous pouvez le modifier selon votre fréquence de programmation préférée en mettant à jour leExpressionHorairela valeur de la propriété en conséquence. Exemples:

    • Pour l’exécuter tous les 7 jours,ScheduleExpression: "rate(7 days)"
    • Pour l’exécuter tous les VENDREDI à 8h00 UTC,ScheduleExpression: "cron(0 8 ? * FRI *)"

    Cliquez suricipour tous les détails sur la façon de définir ScheduleExpression.

  3. Exemples de cibles données dans le fichier modèle sousCiblesla propriété pour votre référence doit être mise à jour :

    un. ChangementSaisirpropriété en fonction des valeurs de votre propriété d’entrée, donnez en conséquence un meilleur identifiant pour votre cible en mettant à jour leIdentifiantpropriété.

    b. En fonction du nombre de cibles pour lesquelles vous souhaitez définir la planification, ajoutez ou supprimez les cibles.

  4. Changer laÉtatvaleur de la propriété àACTIVÉ
  5. Enfin, emballez et redéployez la pile en suivant les étapes 2 et 3 dansConfiguration de l’escalier

-----------------------------------------------------

➤ Exécution

Pour exécuter la fonction étape, suivez les étapes ci-dessous :

  1. Accédez à la définition de la machine d’état à partir du_Ressources_dans la pile cloudformation.
  2. Cliquer sur_Démarrer l’exécution_.
  3. Sous_Saisir_, fournissez le json suivant comme paramètre :

    { “identifier”: “", "task": "", "isCluster": true or false }

un.identifier: (Obligatoire - Chaîne) L’instance RDS ou l’identifiant de cluster qui doit être restauré. Tout type d’instance RDS ou de clusters Amazon Aurora est pris en charge.

b.task: (Obligatoire - Chaîne) Les options valides sontcreate_snapshotoudb_restore or create_snapshot_only.

c.isCluster: (Obligatoire - Booléen) Définir surtruesi l’identifiant fourni est celui d’un cluster, sinon défini surfalse

La machine à états peut effectuer l’une des tâches suivantes :

  1. sitaskest réglé surcreate_snapshot, la machine d’état crée/met à jour un instantané pour l’instance ou le cluster RDS donné à l’aide de l’identifiant de l’instantané :identifier-instantané puis exécute le pipeline
  2. sitaskest réglé surdb_restore, la machine d’état effectue une restauration sur l’instance RDS donnée, sans mettre à jour un instantané, en supposant qu’il existe un instantané avec un identifiant :identifier-instantané
  3. sitaskest réglé surcreate_snapshot_only, la machine d’état crée/met à jour un instantané pour l’instance ou le cluster RDS donné à l’aide de l’identifiant de l’instantané :identifier-instantané et il n’exécuterait pas le pipeline

Considérations relatives aux coûts

Une fois le développement ou l’utilisation de l’outil terminé :

  1. si vous n’avez pas besoin de l’instance RDS lorsque vous ne codez pas ou n’utilisez pas l’outil (par exemple, s’il s’agit d’un RDS de test), envisagez d’arrêter ou de supprimer la base de données. Vous pouvez toujours le recréer quand vous en avez besoin.
  2. si vous n’avez pas besoin des anciens modèles Cloud Formation, il est recommandé de vider le compartiment CFN S3.

Démolir

Pour démonter votre application et supprimer toutes les ressources associées à la machine d’état Trapheus DB Restore, procédez comme suit :

  1. Connectez-vous auConsole Amazon CloudFormationet trouvez la pile que vous avez créée.
  2. Supprimez la pile. Notez que la suppression de la pile échouera si le compartiment rds-snapshots-<YOUR_ACCOUNT_NO> s3 n’est pas vide, supprimez donc d’abord les exportations d’instantanés dans le compartiment.
  3. Supprimez les ressources AWS duConditions préalables. La suppression de SES, du compartiment CFN S3 (videz-le si vous ne le supprimez pas) et de VPC est facultative car vous ne verrez pas les frais, mais vous pourrez les réutiliser plus tard pour un démarrage rapide.

-----------------------------------------------------

➤ Comment ça marche

Pipeline complet

DBRestore depiction

Modélisées comme une machine à états, différentes étapes du flux telles que la création/mise à jour d’instantanés, le renommage de l’instance, la restauration et la suppression, l’état d’achèvement/d’échec de chaque opération, l’alerte par e-mail d’échec, etc. sont exécutées à l’aide de lambdas individuels pour les instances de base de données et les clusters de base de données. respectivement. Pour suivre l’achèvement/l’échec de chaque opération, les serveurs RDS sont utilisés avec des délais et un nombre maximal de tentatives configurés en fonction du délai d’expiration lambda. Pour les scénarios de disponibilité et de suppression de cluster de bases de données, des serveurs personnalisés ont été définis. Les couches Lambda sont utilisées dans tous les lambdas pour les méthodes utilitaires courantes et la gestion personnalisée des exceptions.

Sur la base des commentaires fournis auDBRestoreStateMachinefonction step, les étapes/branches suivantes sont exécutées :

  1. En utilisant leisClustervaleur, un branchement a lieu dans la machine à états pour exécuter le pipeline pour un cluster de base de données ou pour une instance de base de données.

  2. Sitaskest réglé surcreate_snapshot, lecréation/mise à jour d’instantanésle processus a lieu respectivement pour un cluster ou une instance. Crée un instantané à l’aide de l’identifiant unique :identifier-instantané, s’il n’existe pas. Si un instantané existe déjà avec l’identifiant susmentionné, il est supprimé et un nouvel instantané est créé.

  3. Sitaskest réglé surdb_restore, le processus de restauration de la base de données démarre, sans création/mise à jour d’instantané

  4. Sitaskest réglé surcreate_snapshot_only, lecréation/mise à jour d’instantanésle processus n’a lieu que pour un cluster ou une instance respectivement. Crée un instantané à l’aide de l’identifiant unique :identifier-instantané, s’il n’existe pas. Si un instantané existe déjà avec l’identifiant susmentionné, il est supprimé et un nouvel instantané est créé.

  5. Dans le cadre du processus de restauration de la base de données, la première étape estRenommerde l’instance de base de données ou du cluster de base de données fourni et de ses instances correspondantes à un nom temporaire. Attendez la réussite de l’étape de renommage pour pouvoir utiliser le nom unique fourni.identifierdans l’étape de restauration.

  6. Une fois l’étape de renommage terminée, l’étape suivante consiste àRestaurerl’instance de base de données ou le cluster de base de données à l’aide duidentifierparamètre et l’identifiant de l’instantané comme_identifier_-instantané

  7. Une fois la restauration terminée et l’instance de base de données ou le cluster de base de données disponible, la dernière étape consiste àSupprimerl’instance ou le cluster initialement renommé (ainsi que ses instances) qui a été conservé à des fins de gestion des échecs. Exécuté à l’aide de lambdas créés à des fins de suppression, une fois la suppression réussie, le pipeline est terminé.

  8. À chaque étape, les tentatives avec alertes d’interruption et d’échec sont traitées à chaque étape de la machine à états. En cas de panne, une alerte par e-mail SES est envoyée comme configuré lors de la configuration. En option, siSlackWebhookUrlsa été fourni dans leinstallation, les notifications d’échec seront également envoyées aux canaux appropriés.

  9. Si l’étape de restauration échoue, dans le cadre de la gestion des échecs, leÉtape 4Le changement de nom de l’instance/du cluster est inversé pour garantir que l’instance de base de données ou le cluster de base de données d’origine est disponible pour utilisation.

DBRestore failure handling depiction

Article du blog Amazon:https://aws.amazon.com/blogs/opensource/what-is-trapheus/

-----------------------------------------------------

➤ Contribuer à Trapheus

Structure du code de référence


├── CONTRIBUTING.md                               <-- How to contribute to Trapheus
├── LICENSE.md                                    <-- The MIT license.
├── README.md                                     <-- The Readme file.
├── events
│   └── event.json                                <-- JSON event file to be used for local SAM testing
├── screenshots                                   <-- Folder for screenshots of teh state machine.
│   ├── Trapheus-logo.png
│   ├── cluster_restore.png
│   ├── cluster_snapshot_branch.png
│   ├── failure_handling.png
│   ├── instance_restore.png
│   ├── instance_snapshot_branch.png
│   ├── isCluster_branching.png
│   └── restore_state_machine.png
├── src
│   ├── checkstatus
│   │   ├── DBClusterStatusWaiter.py              <-- Python Waiter(https://boto3.amazonaws.com/v1/documentation/api/latest/guide/clients.html#waiters) for checking the status of the cluster
│   │   ├── get_dbcluster_status_function.py      <-- Python Lambda code for polling the status of a clusterised database
│   │   ├── get_dbstatus_function.py              <-- Python Lambda code for polling the status of a non clusterised RDS instance
│   │   └── waiter_acceptor_config.py             <-- Config module for the waiters
│   ├── common                                    <-- Common modules across the state machine deployed as a AWS Lambda layer.
│   │   ├── common.zip
│   │   └── python
│   │       ├── constants.py                      <-- Common constants used across the state machine.
│   │       ├── custom_exceptions.py              <-- Custom exceptions defined for the entire state machine.
│   │       └── utility.py                        <-- Utility module.
│   ├── delete
│   │   ├── cluster_delete_function.py           <-- Python Lambda code for deleting a clusterised database.
│   │   └── delete_function.py                   <-- Python Lambda code for deleting a non clusterised RDS instance.
│   ├── emailalert
│   │   └── email_function.py                    <-- Python Lambda code for sending out failure emails.
│   ├── rename
│   │   ├── cluster_rename_function.py           <-- Python Lambda code for renaming a clusterised database.
│   │   └── rename_function.py                   <-- Python Lambda code for renaming a non-clusterised RDS instance.
│   ├── restore
│   │   ├── cluster_restore_function.py          <-- Python Lambda code for retoring a clusterised database.
│   │   └── restore_function.py                  <-- Python Lambda code for restoring a non-clusterised RDS instance
│   ├── slackNotification
│   │   └── slack_notification.py                <-- Python Lambda code for sending out a failure alert to configured webhook(s) on Slack.
│   └── snapshot
│       ├── cluster_snapshot_function.py         <-- Python Lambda code for creating a snapshot of a clusterised database.
│       └── snapshot_function.py                 <-- Python Lambda code for creating a snapshot of a non-clusterised RDS instance.
├── template.yaml                                <-- SAM template definition for the entire state machine.
└── tests                                        <-- Test folder.
    └── unit
        ├── mock_constants.py
        ├── mock_custom_exceptions.py
        ├── mock_import.py
        ├── mock_utility.py
        ├── test_cluster_delete_function.py
        ├── test_cluster_rename_function.py
        ├── test_cluster_restore_function.py
        ├── test_cluster_snapshot_function.py
        ├── test_delete_function.py
        ├── test_email_function.py
        ├── test_get_dbcluster_status_function.py
        ├── test_get_dbstatus_function.py
        ├── test_rename_function.py
        ├── test_restore_function.py
        ├── test_slack_notification.py
        └── test_snapshot_function.py

Préparez votre environnement. Installez les outils selon vos besoins.

  1. Dépôt Fork Trapheus

  2. Créez une branche fonctionnelle.
    git branch trapheus-change1
    
  3. Confirmez la branche active pour les modifications.
     git checkout trapheus-change1
    

    Vous pouvez combiner les deux commandes en tapantgit checkout -b trapheus-change1.

  4. Apportez des modifications localement à l’aide d’un éditeur et ajoutez des tests unitaires si nécessaire.

  5. Exécutez la suite de tests dans le référentiel pour vous assurer que les flux existants ne sont pas interrompus.
       cd Trapheus
       python -m pytest tests/ -v #to execute the complete test suite
       python -m pytest tests/unit/test_get_dbstatus_function.py -v #to execute any individual test
    
  6. Mettez en scène les fichiers édités.
       git add contentfile.md 
    

    Ou utilisergit add . pour plusieurs fichiers.

  7. Validez les modifications à partir de la préparation.
       git commit -m "trapheus-change1"
    
  8. Appliquer de nouvelles modifications à GitHub
       git push --set-upstream origin trapheus-change1
    
  9. Vérifier le statut de la succursale
    git status
    

    RevoirOutputpour confirmer le statut de validation.

  10. Git pousser
        git push --set-upstream origin trapheus-change1
    
  11. LeOutputfournira un lien pour créer votre Pull Request.

➤ Contributeurs