Technique

Migration depuis AWS Elasticsearch vers Elasticsearch Service sur Elastic Cloud

Accès à toutes les fonctionnalités de la Suite Elastic

En tant qu’architecte de solutions, on me demande souvent comment migrer un déploiement Elastic depuis Amazon Elasticsearch Service (AWS ES) vers Elasticsearch Service.  Si l’on me pose régulièrement cette question, c’est parce que les utilisateurs souhaitent bénéficier de toutes les fonctionnalités, de l’expertise opérationnelle et du support technique fourni par Elastic qui ne sont pas disponibles auprès d’Amazon. Dans ce guide pratique, nous nous pencherons sur une approche « lift-and-shift » pour Elasticsearch Service.

Vous souhaitez vous familiariser avec Elasticsearch Service ? Lancez-vous avec la version d’essai de 14 jours qui vous permet de créer un déploiement. Vous pouvez sélectionner le fournisseur cloud, AWS ou GCP, ainsi que la région dans laquelle Elastic exécutera votre déploiement.  Les utilisateurs d’AWS peuvent ajouter directement Elasticsearch Service à partir d’AWS Marketplace, qui sera intégré à votre facture AWS.

Certaines capacités vont au-delà de celles disponibles dans la version open source, comme Canvas, APM, le Machine Learning non supervisé, le gel des index, SQL, la sécurité (au-delà des politiques de gestion des identités et des accès ou basées sur le périmètre uniquement) et les modèles de déploiement, lesquelles sont propres à Elasticsearch Service sur Elastic Cloud. Au fil du temps, nous continuons à ajouter des capacités uniques. Pour en savoir plus sur notre offre par rapport à celle d’AWS ES, consultez régulièrement notre page de comparatif AWS Elasticsearch.

Migration depuis AWS Elasticsearch vers Elasticsearch Service sur Elastic Cloud

Il s’agit d’un guide plutôt technique sur la migration depuis AWS ES vers Elasticsearch Service sur Elastic Cloud. Une certaine expérience en programmation est nécessaire. Les clusters AWS ES sont généralement provisionnés dans un VPC. Ceci dit, ils peuvent être aussi placés dans un point de terminaison public. Pour pouvoir traiter ces deux scénarios dans notre guide, nous allons utiliser le kit AWS SDK pour Python. Vous pouvez utiliser n’importe quel langage associé à un kit AWS SDK (p. ex. Java, Ruby, Go etc.). Néanmoins, les exemples que nous fournirons seront tous écrits en Python.

Ce guide se divise en deux parties :

Remarque : Si un instantané de votre cluster AWS ES a déjà été créé manuellement pour S3, vous pouvez vous rendre directement à la partie deux.

Avant de commencer, il est important de comprendre certaines des étapes suivantes en matière de sécurité pour la gestion des identités et des accès (IAM). Tout d’abord, pour créer un instantané de votre cluster AWS ES dans S3, votre cluster doit disposer d’une autorisation en écriture dans un bucket S3 privé. Pour cela, vous devez disposer d’un rôle et d’une politique IAM associés aux autorisations nécessaires. De plus, nous devons attacher une politique IAM à un utilisateur IAM (qu’il faudra créer si besoin). L’utilisateur IAM est utilisé par notre script pour communiquer avec votre cluster AWS ES et par votre déploiement géré par Elastic pour lire l’instantané à partir de votre bucket S3.

Partie un : Instantané vers S3

Dans la première partie de ce guide, nous configurerons un rôle, une politique et un utilisateur IAM pour créer un instantané de votre cluster AWS ES vers S3. La documentation AWS relative à ce processus est disponible ici : Utilisation d'instantanés d'index Amazon Elasticsearch Service. Vous pouvez consulter cette documentation pour référence si vous êtes bloqué.

Tout au long de ce guide, nous utiliserons différentes variables. Copiez et collez le tableau suivant dans un fichier Notes. Ainsi, vous aurez toutes les variables sous la main, ce qui facilitera le report des valeurs propres à votre migration.

DescriptionVariableValeur
Nom ARN de domaine AWS ES DOMAIN_ARN
URL de point de terminaison AWS ES ES_ENDPOINT
Région AWS ES ES_REGION
Nom de bucket AWS ES S3_BUCKET_NAME
Région AWS S3 S3_REGION_NAME
Nom ARN de rôle IAM AWS ROLE_ARN
ID de clé d’accès secrète IAM AWS ACCESS_KEY
Clé d’accès secrète IAM AWS SECRET_KEY
Référentiel d’instantané AWS ES SNAPSHOT_REPO my-snapshot-repo
Nom d’instantané AWS ES SNAPSHOT_NAME my-snapshot

Vous pouvez modifier les valeurs de SNAPSHOT_REPO et de SNAPSHOT_NAME ou utiliser celles fournies en exemple (c.-à-d. « my-snapshot-repo » et « my-snapshot »).

Étape 1 - Obtenir vos informations AWS ES

Nous avons besoin de quelques informations de base concernant votre cluster AWS ES pour en créer un instantané pour S3.

  1. Dans votre console AWS, accédez à Elasticsearch Service.
  2. Sélectionnez le domaine du cluster pour lequel vous souhaitez créer un instantané.
  3. Copiez la valeur « Domain ARN » dans votre fichier Notes (DOMAIN_ARN).
  4. Copiez la valeur d’URL « Endpoint » dans votre fichier Notes (ES_ENDPOINT).
  5. Notez la région AWS (p. ex. us-east-1) dans laquelle se trouve votre cluster AWS ES (ES_REGION).

Ces informations sont utilisées ci-dessous lors de la création de la politique IAM et au moment d’émettre des commandes pour le cluster.

Étape 2 - Créer un bucket AWS S3

Nous devons créer un bucket S3 pour stocker votre instantané.

Important : Votre bucket S3 doit se situer dans la même région que votre cluster AWS ES. De là, vous pourrez effectuer une restauration vers un déploiement géré par Elastic, quels que soient la région où il se trouve et son fournisseur cloud (AWS ou GCP).

  1. Dans votre console AWS, accédez au service S3.
  2. Créez un bucket S3 privé.
    Remarque : Si vous conservez les paramètres par défaut, votre bucket sera privé et sécurisé.
  3. Copiez le nom du bucket dans votre fichier Notes (S3_BUCKET_NAME).
  4. Copiez la région du bucket dans votre fichier Notes (S3_REGION_NAME).

Ces informations servent lorsque nous enregistrons un référentiel d’instantané avec Elasticsearch.

Étape 3 - Créer un rôle IAM

Ensuite, nous allons créer un rôle pour déléguer les permissions à Amazon Elasticsearch Service pour prendre un instantané dans S3.

  1. Dans votre console AWS, accédez au service IAM.
  2. Sélectionnez « Roles ».
  3. Sélectionnez « Create role ».
  4. Sélectionnez « EC2 » en tant que service utilisant ce nouveau rôle (nous changerons cela plus tard).
  5. Sélectionnez « Next: Permissions ».
  6. Laissez les politiques du rôle vides pour le moment.
  7. Sélectionnez « Next: Tags ».
  8. Sélectionnez « Next: Review ».
  9. Donnez le nom suivant au rôle : TheSnapshotRole
  10. Sélectionnez « Create role ».
  11. Dans la liste des rôles, sélectionnez celui que vous venez de créer : TheSnapshotRole
  12. Sélectionnez « Trust relationships ».
  13. Sélectionnez « Edit trust relationship ».
  14. Copiez et collez les éléments suivants dans la relation de confiance (en remplaçant ce qui s’y trouve).

    {
     "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "Service": "es.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }]
    }
    
  15. Sélectionnez « Update Trust Policy ».
  16. Sélectionnez « Permissions ».
  17. Sélectionnez « Add inline policy ».
  18. Sélectionnez l’onglet JSON.
  19. Copiez et collez la séquence JSON suivante (en remplaçant ce qui s’y trouve).
  20. Remplacez S3_BUCKET_NAME par la valeur appropriée (à deux endroits).

    {
      "Version": "2012-10-17",
      "Statement": [{
          "Action": [
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::S3_BUCKET_NAME"
          ]
        },
        {
          "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::S3_BUCKET_NAME/*"
          ]
        }
      ]
    }   
  21. Sélectionnez « Review policy ».
  22. Donnez un nom à la politique : TheSnapshotS3Policy
  23. Sélectionnez « Create policy ».
  24. Copiez la valeur « Role ARN » dans votre fichier Notes (ROLE_ARN).

Nous devons créer un rôle IAM avec une politique conforme, disposant des droits de lecture et d’écriture dans votre bucket S3.

Étape 4 - Créer une politique IAM

Nous devons créer une politique IAM disposant des permissions pour assumer le rôle ci-dessus pour enregistrer le référentiel d’instantané.

  1. Dans votre console AWS, accédez au service IAM.
  2. Sélectionnez « Policies ».
  3. Sélectionnez « Create policy ».
  4. Sélectionnez l’onglet JSON.
  5. Copiez et collez la séquence JSON suivante (en remplaçant ce qui s’y trouve).
  6. Remplacez ROLE_ARN par la valeur appropriée.
  7. Remplacez DOMAIN_ARN par la valeur appropriée.
  8. Remplacez S3_BUCKET_NAME par la valeur appropriée (à deux endroits).

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "iam:PassRole",
          "Resource": "ROLE_ARN"
        },
        {
          "Effect": "Allow",
          "Action": "es:ESHttpPut",
          "Resource": "DOMAIN_ARN/*"
        }
      ]
    }
    
  9. Sélectionnez « Review policy ».
  10. Donnez un nom à la politique : TheSnapshotPolicy
  11. Sélectionnez « Create policy ».

Nous venons de créer une politique qui permet au rôle IAM de communiquer avec votre domaine AWS ES.

Étape 5 - Créer un utilisateur IAM

Si vous n’avez pas encore d’utilisateur IAM, nous devons en créer un et lui donner accès à votre bucket S3 privé. Si vous avez déjà un utilisateur IAM, attachez-lui tout simplement la politique IAM suivante.

  1. Dans votre console AWS, accédez au service IAM.
  2. Sélectionnez « Users ».
  3. Sélectionnez « Add user ».
  4. Donnez le nom suivant à l’utilisateur : TheSnapshotUser
  5. Cochez la case « Programmatic access ».
  6. Sélectionnez « Next: Permissions ».
  7. Cochez la case « Attach existing policies directly ».
  8. Filtrez les politiques en entrant « TheSnapshot ».
  9. Cochez la case située en regard de la politique « TheSnapshotPolicy ».
  10. Sélectionnez « Next: Tags ».
  11. Sélectionnez « Next: Review ».
  12. Sélectionnez « Create user ».
  13. Copiez « Access key ID » dans votre fichier Notes (ACCESS_KEY).
  14. Sous « Secret access key », sélectionnez « Show ».
  15. Copiez la valeur de « Secret access key » dans votre fichier Notes (SECRET_KEY).
  16. Sélectionnez « Close ».
  17. Dans la liste des utilisateurs, sélectionnez celui que vous venez de créer : TheSnapshotUser
  18. Sélectionnez « Add inline policy ».
  19. Sélectionnez l’onglet JSON.
  20. Copiez et collez la séquence JSON suivante (en remplaçant ce qui s’y trouve).
  21. Remplacez S3_BUCKET_NAME par la valeur appropriée (à deux endroits).

    {
      "Version": "2012-10-17",
      "Statement": [{
          "Action": [
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::S3_BUCKET_NAME"
          ]
        },
        {
          "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::S3_BUCKET_NAME/*"
          ]
        }
      ]
    }
    
  22. Sélectionnez « Review policy ».
  23. Donnez un nom à la politique : TheSnapshotUserS3Policy
  24. Sélectionnez « Create policy ».

Nous venons de créer un utilisateur IAM qui peut prendre un instantané manuellement et le lire.

Étape 6 - Configurer le kit AWS SDK pour Python

Avant d’effectuer un instantané manuellement, nous devons enregistrer un référentiel d’instantané avec votre déploiement. Pour cela, il faut envoyer une requête signée à votre cluster AWS ES. L’un des moyens les plus simples pour cela, c’est d’utiliser le kit AWS SDK pour Python. Vous pouvez utiliser un autre kit AWS SDK si vous le souhaitez (p. ex. Java, Ruby, Go etc.). Toutefois, nous utiliserons le kit AWS SDK pour Python dans l’exemple suivant.

Nous installerons le kit AWS SDK pour Python à l’aide du programme d’installation de package Python PIP (pip3). Il faut donc que Python v3 soit installé. Si ce n’est pas le cas, vous pouvez l’obtenir en installant tout simplement pip3. Le gestionnaire de package de votre système d’exploitation installera Python v3 automatiquement, étant donné qu’il s’agit d’une dépendance de pip3. Si vous êtes bloqué, consultez les documents sur l’installation de Python.

Installation de pip3

Pour installer pip3 sur Red Hat et ses distributions dérivées, utilisez yum :

$ sudo yum -y install python3-pip

Certaines distributions Fedora attribuent une balise différente au package pip3 :

$ sudo yum -y install python36-pip

Si aucun nom de package ci-dessus ne fonctionne, vous pouvez le rechercher directement :

$ yum search pip

Sur les distributions dérivées de Debian, comme Ubuntu, utilisez apt-get :

$ sudo apt-get -y install python3-pip

Installation du kit AWS SDK de Python :

Une fois que pip3 est installé, vous pouvez installer le kit AWS SDK de Python, appelé boto3 :

$ pip3 install --user boto3 requests_aws4auth
Collecting boto3
...
Successfully installed boto3-1.9.106 requests-aws4auth-0.9 ...

Remarque : Aucun accès root n’est nécessaire si vous utilisez l’indicateur --user.

Nous devons créer un répertoire ~/.aws pour y conserver nos informations d’identification AWS. Exécutez la commande suivante pour créer le répertoire :

$ mkdir ~/.aws

Avec votre éditeur favori, créez un fichier appelé credentials. Dans un souci de simplicité, nous utiliserons nano :

$ nano ~/.aws/credentials

Copiez et collez le contenu suivant dans le fichier, en remplaçant les deux variables indiquées en majuscules.

[default]
aws_access_key_id = ACCESS_KEY
aws_secret_access_key = SECRET_KEY

Utilisez ctrl+x pour quitter nano, et procédez comme indiqué dans les messages vous invitant à enregistrer le fichier.

Maintenant, nous allons écrire quelques scripts Python pour exécuter les tâches dont nous avons besoin.

Étape 7 - Créer un instantané manuel d’AWS ES

Effectuons un petit test rapide à l’aide d’un script Python pour répertorier les index de notre cluster AWS ES. Nous pourrons ainsi nous assurer que nos informations d’identification AWS fonctionnent et que nous communiquons avec le cluster.

Avec votre éditeur favori, créez un fichier appelé indices.py. Dans un souci de simplicité, nous utiliserons nano :

$ nano indices.py

Copiez et collez le contenu suivant dans le fichier, en remplaçant les deux variables indiquées en majuscules par les valeurs appropriées :

import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
print("Listing Indices from AWS ES ...")
req = requests.get(host + '/_cat/indices?v', auth=auth)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)

Utilisez ctrl+x pour quitter nano, et procédez comme indiqué dans les messages vous invitant à enregistrer le fichier.

Exécutez le script Python.

$ python3 indices.py

Vous devriez obtenir un résultat similaire à celui-ci :

Listing Indices from AWS ES ...
HTTP Response Code: 200
health status index     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   testindex yME2BphgR3Gt1ln6n03nHQ   5   1          1            0      4.4kb          4.4kb

Avec votre éditeur favori, créez maintenant un fichier appelé register.py.

$ nano register.py

Copiez et collez le contenu suivant dans le fichier, en remplaçant les sept variables indiquées en majuscules par les valeurs appropriées :

import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
repo_name = 'SNAPSHOT_REPO'
snapshot_name = 'SNAPSHOT_NAME'
s3_region_name = 'S3_REGION_NAME'
s3_bucket_name = 'S3_BUCKET_NAME'
role_arn = 'ROLE_ARN'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
headers = {"Content-Type": "application/json"}
payload = {
        "type": "s3",
        "settings": {
                "region": s3_region_name,
                "bucket": s3_bucket_name,
                "role_arn": role_arn
        }
}
print("Registering Snapshot with AWS ES ...")
url = host + '/_snapshot/' + repo_name
req = requests.put(url, auth=auth, json=payload, headers=headers)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)

Utilisez ctrl+x pour quitter nano, et procédez comme indiqué dans les messages vous invitant à enregistrer le fichier.

Exécutez le script Python.

$ python3 register.py

Vous devriez obtenir un résultat similaire à celui-ci :

Registering Snapshot with AWS ES ...
HTTP Response Code: 200
{"acknowledged":true}

Avec votre éditeur favori, créez maintenant un fichier appelé snapshot.py.

$ nano snapshot.py

Copiez et collez le contenu suivant, en remplaçant les quatre variables indiquées en majuscules par les valeurs appropriées :

import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
repo_name = 'SNAPSHOT_REPO'
snapshot_name = 'SNAPSHOT_NAME'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
print("Starting Snapshot with AWS ES ...")
url = host + '/_snapshot/' + repo_name + '/' + snapshot_name
req = requests.put(url, auth=auth)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)

Utilisez ctrl+x pour quitter nano, et procédez comme indiqué dans les messages vous invitant à enregistrer le fichier.

Exécutez le script Python.

$ python3 snapshot.py

Vous devriez obtenir un résultat similaire à celui-ci :

Starting Snapshot with AWS ES ...
HTTP Response Code: 200
{"accepted":true}

Remarque : Le temps nécessaire pour créer un instantané augmente avec la taille du domaine AWS ES. D’après la documentation d’AWS, vous pouvez obtenir un message « 504 GATEWAY_TIMEOUT » si la création d’un instantané qui prend trop de temps. Toujours selon la documentation, vous pouvez tout simplement ignorer cette erreur et attendre que l’instantané soit totalement terminé.

Pour terminer, vérifions le statut de notre instantané. Créons un fichier appelé status.py.

$ nano status.py

Copiez et collez le contenu suivant, en remplaçant les quatre variables indiquées en majuscules par les valeurs appropriées :

import boto3, requests
from requests_aws4auth import AWS4Auth
host = 'ES_ENDPOINT'
region = 'ES_REGION'
repo_name = 'SNAPSHOT_REPO'
snapshot_name = 'SNAPSHOT_NAME'
creds = boto3.Session().get_credentials()
auth = AWS4Auth(creds.access_key, creds.secret_key, region, 'es', session_token=creds.token)
print("Getting Status of Snapshot with AWS ES ...")
url = host + '/_snapshot/' + repo_name + '/' + snapshot_name + '?pretty'
req = requests.get(url, auth=auth)
print("HTTP Response Code: " + str(req.status_code) + '\n' + req.text)

Utilisez ctrl+x pour quitter nano, et procédez comme indiqué dans les messages vous invitant à enregistrer le fichier.

Exécutez le script Python.

$ python3 status.py

Vous devriez obtenir un résultat similaire à celui-ci :

Getting Status of Snapshot with AWS ES ...
HTTP Response Code: 200
{
  "snapshots" : [ {
    "snapshot" : "my-snapshot",
    "uuid" : "ClYKt5g8QFO6r3kTCEzjqw",
    "version_id" : 6040299,
    "version" : "6.4.2",
    "indices" : [ "testindex" ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "start_time" : "2019-03-03T14:46:04.094Z",
    "start_time_in_millis" : 1551624364094,
    "end_time" : "2019-03-03T14:46:04.847Z",
    "end_time_in_millis" : 1551624364847,
    "duration_in_millis" : 753,
    "failures" : [ ],
    "shards" : {
      "total" : 5,
      "failed" : 0,
      "successful" : 5
    }
  } ]
}

Si dans le résultat, vous voyez "state":"SUCCESS", cela signifie que vous avez réussi à créer un instantané vers S3. Bravo ! Vous êtes maintenant prêt à passer à partie deux !

Partie deux – Effectuer une restauration à partir de S3

Dans la deuxième partie de ce guide, nous allons étudier comment restaurer un déploiement géré par Elastic à partir d’un instantané manuel dans S3.

Vous pouvez provisionner un déploiement géré par Elastic dans AWS ou GCP pour cette partie.

Étape 1 - Définir la taille de votre déploiement

Le déploiement que vous avez créé dans Elasticsearch Service sur Elastic Cloud doit disposer de la même quantité de ressources que votre cluster AWS ES. Utilisez les curseurs et augmentez le nombre de nœuds de données afin que la taille corresponde à celle de votre cluster dans AWS ES. Enregistrez vos changements avant de continuer.

Étape 2 - Ajouter un référentiel personnalisé

Dans votre déploiement géré par Elastic (et non pas dans votre cluster AWS ES), ouvrez Kibana et accédez à « Dev Tools ».

Copiez et collez l’appel d’API suivant dans Dev Tools, en remplaçant les cinq variables :

PUT /_snapshot/SNAPSHOT_REPO
{
  "type": "s3",
  "settings": {
    "bucket": "S3_BUCKET_NAME",
    "region": "S3_REGION_NAME",
    "access_key": "ACCESS_KEY",
    "secret_key": "SECRET_KEY",
    "compress": true
  }
}

Exécutez la requête.

Vous devriez obtenir la réponse suivante :

{
  "acknowledged": "true"
}

Courage ! Nous approchons de la fin.

Étape 3 - Effectuer une restauration à partir de S3

Voilà ! L’heure est venue d’effectuer une restauration à partir du référentiel d’instantané que nous venons d’enregistrer.

Copiez et collez l’appel d’API suivant dans Dev Tools, en remplaçant les deux variables :

POST /_snapshot/SNAPSHOT_REPO/SNAPSHOT_NAME/_restore

Vous devriez obtenir la réponse suivante :

{
  "accepted": "true"
}

Vous pouvez consulter l’avancement de votre restauration avec :

GET /_snapshot/SNAPSHOT_REPO/SNAPSHOT_NAME/_status

Si vous voyez "state":"SUCCESS", c’est que votre restauration s’est correctement terminée !

{
  "snapshots": [
    {
      "snapshot": "my-snapshot",
      "repository": "my-snapshot-repo",
      "state": "SUCCESS",
      ...
    }
  ]
}

Félicitations ! Vous avez réussi votre migration « lift and shift » depuis AWS ES vers Elasticsearch Service.

Pour conclure

Maintenant que vous êtes sur Elasticsearch Service sur Elastic Cloud, non seulement vous pouvez tirer parti des fonctionnalités qui ne sont pas disponibles sur AWS ES, mais vous pouvez en plus dormir sur vos deux oreilles en ayant l’assurance que votre déploiement est géré par des experts, les experts à l’origine de la Suite Elastic. Et si vous rencontrez des problèmes, les experts de l’équipe de support technique Elastic sont là pour vous aider.  Si vous n’êtes pas encore sur Elasticsearch Service sur Elastic Cloud, nous vous invitons à tester notre version d’essai gratuite de 14 jours. Et si vous avez des questions, n’hésitez pas à nous contacter.