Comment migrer votre base PostgreSQL de Heroku à Amazon RDS

Sébastien Carceles
Dev on Rails
Published in
4 min readAug 10, 2018
https://cdn-images-1.medium.com/max/2000/1*KRtLLNunygiRBD0GaFf4Kg.png
Je n’ai aucun droit sur cette image, récupérée depuis cet article intéressant sur le même sujet

Avant-propos : ceci est la réécriture en français d’un article que j’avais rédigé en anglais il y a quelques mois.

De plus, cet article était déjà une adaptation d’un post publié par Sébastien Saunier (Le Wagon) : https://www.lewagon.com/fr/blog/how-to-migrate-your-heroku-postgres-database-to-amazon-rds

En suivant ce post pour mes propres besoins, j’avais rencontré quelques problèmes qui m’ont conduit à simplifier le processus (et écrire ce nouvel article).

Comme indiqué dans le titre, la problématique est la suivante : comment migrer une base PostgreSQL, hébergée chez Heroku, vers Amazon RDS ? Cela ressemble à un sujet complexe et et délicat, et en fait on s’aperçoit vite que c’est plutôt facile, quoi qu’un peu longuet.

Ici il est question d’une application Ruby on Rails, mais dans l’ensemble le processus doit rester identique pour n’importe quelle technologie.

Je suppose que vous avez :

  • Une application Ruby on Rails en production sur Heroku avec sa base PostgreSQL également sur Heroku (probablement avec le plugin heroku-postgresql)
  • Un compte chez Amazon Web Services
  • Le nom d’utilisateur et le mot de passe votre base

Et que vous connaissez les interfaces de gestion de ces deux fournisseurs de services.

Avant de commencer

Activez le mode maintenance de votre application sur Heroku :

heroku maintenance:on -a <app_name>

Nouvelle base de données

Créez une nouvelle instance de base de données sur Amazon RDS. Dans le détail, la configuration dépend de vos besoins. Par exemple dans mon cas, j’avais besoin :

  • D’une base PostgreSQL
  • Cas d’utilisation : production
  • Classe d’instance : db.t2.medium
  • Avec une réplica en lecture seule

Faites attention à la version de PostgreSQL, qui doit correspondre à votre base de données source sur Heroku (celle que vous voulez migrer). Sinon le résultat est difficile à prédire.

Également, pendant cette phase, créez une base de données avec le même nom que votre base source (généralement nom-de-l-app_production, mais prenez soin de vérifier).

Une fois que l’instance est initialisée et disponible, on va ajouter une règle pour le trafic entrant au groupe de sécurité. Ouvrez le groupe de sécurité, généralement nommé :

rds-launch-wizard-<number> (<some-id>)

Ajoutez une règle pour le trafic entrant :

  • Type : PostgreSQL
  • Protocole : TCP
  • Port : 5432
  • Source : anywhere (0.0.0.0/0 and ::/0)

Vérifiez l’instance et la base créées

Vérifiez que l’instance fonctionne bien, avec psql par exemple ou un autre client PostgreSQL :

psql -U $RDS_ROOT_USER -h $NAME.$ID.$DATACENTER.rds.amazonaws.com --dbname=$DATABASE_NAME

Sachant que :

  • RDS_ROOT_USER est le nom d’utilisateur root que vous avez choisi lors de la création
  • NAME, ID et DATACENTER vous sont indiqués par Amazon RDS (cherchez le endpointdans les détails de l’instance créée)
  • DATABASE_NAME est le nom de la base de

Ajoutez le certificat de Amazon RDS à votre application Ruby on Rails

Afin de permettre à votre application Ruby on Rails de parler avec Amazon RDS, vous devez utiliser un certificat SSL fourni par Amazon. Téléchargez-le, ajoutez le à votre application et déployez :

cd /path/to/your/app
curl https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem > ./config/rds-combined-ca-bundle.pem
git add config/rds-combined-ca-bundle.pem
git commit -m "Add Amazon SSL certificate"
git push heroku

Dumpez la base Heroku localement

Faites un dump de la base hébergée chez Heroku, dans un fichier sur votre système :

heroku pg:backups capture -a <app_name>
curl -o /tmp/latest.dump `heroku pg:backups public-url -a <app_name>`

Chargez le dump sur la base Amazon RDS

Utilisez pg_restore pour charger les données du dump dans votre nouvelle base de données :

pg_restore --verbose --clean --no-acl --no-owner -h $NAME.$ID.$DATACENTER.rds.amazonaws.com -U $RDS_ROOT_USER -d $DATABASE_NAME /tmp/latest.dump

Une fois que l’opération est terminée, vous pouvez réutiliser psql ou votre client PostgreSQL pour vous connecter à la nouvelle base et vérifier vos données.

Basculez l’application vers Amazon RDS

Voici la partie sensible. Vous devez détruire la base hébergée par Heroku, parce que Heroku ne vous laissera pas changer la variable d’environnement DATABASE_URL de votre application (qui indique à l’application où est la base à utiliser, donc).

En supposant que vous utilisez le plugin heroku-postgresql :

heroku addons:destroy heroku-postgresql -a <app_name>

Une fois cette base détruite, vous pouvez redéfinir la variable d’environnement DATABASE_URL pour lui donner la bonne valeur (c’est-à-dire les accès et l’URL vers la nouvelle instance et la nouvelle base de données chez Amazon) :

heroku config:set DATABASE_URL="postgres://$RDS_ROOT_USER:$PASSWORD@$NAME.$ID.$DATACENTER.rds.amazonaws.com/$DATABASE_NAME?sslca=config/rds-combined-ca-bundle.pem" -a <app_name>

Le mot de passe est le même que votre base d’origine.

Et voila, vous pouvez désactiver le mode maintenance :

heroku maintenance:off -a <app_name>

Prenez le temps de vérifier que tout fonctionne bien. En cas de problème, ne perdez pas votre dump ;)

Apprenez Ruby on Rails FACILEMENT et RAPIDEMENT grâce à des ressources en français sur Dev on Rails. Suivez-vous :

--

--