
Contextual Code est spécialisé dans les projets d'envergure pour les administrations publiques régionales. On gère régulièrement des mises en œuvre complexes de gestion de contenu web, des migrations, des intégrations, des personnalisations et des opérations. On sait ce qu'il faut pour lancer un projet et le mettre en ligne.
Upsun Cloud est notre principale plateforme d’hébergement ; elle est incroyablement flexible et propose une vaste gamme de services pouvant être mis en place avec un minimum de configuration.
Il existe plusieurs cas de figure, comme la création de sauvegardes supplémentaires ou la synchronisation de données vers des environnements de développement locaux, où tu peux avoir besoin d’extraire des données de ces services. Dans de nombreux cas, c’est simple d’extraire ces données quand tu utilises Upsun Cloud. Par exemple, tu peux récupérer MariaDB/MySQL via la commande de l’outil CLI d’Upsun.
Mais dans certains cas, l’extraction des données dont tu as besoin s’avère plus complexe ; des outils plus avancés sont alors nécessaires. On a abordé l’un de ces cas dans notre article de blog « Sauvegarder Solr sur Upsun ». Aujourd’hui, on va en aborder un autre : comment utiliser le référentiel de snapshots S3 d’AWS Elasticsearch pour Elasticsearch sur Upsun Cloud.
Tout d’abord, vérifions qu’un service Elasticsearch est bien présent dans le fichier de configuration `.upsun/config.yaml`, sous la clé `services` :
services:
elasticsearch:
type: elasticsearch:7.2Ensuite, on injecte le service dans l’application via la relation « elasticsearch » dans « .upsun/config.yaml » :
relationships:
elasticsearch: De plus, dans la console de gestion AWS, il faut :
Le plugin Elasticsearch S3 est super facile à activer sur Upsun Cloud. Il suffit d’ajouter repository-s3 dans configuration.plugins pour le service elasticsearch dans .upsun/services.yaml :
elasticsearch:
type: elasticsearch:7.2
configuration:
plugins:
- repository-s3Une fois cette modification déployée, il faut se connecter via SSH au conteneur de l’application et enregistrer un nouveau référentiel de snapshots en exécutant la commande suivante :
# SSH to the Upsun.com app container
upsun ssh
# Replace the value for these variables
AWS_BUCKET_NAME="<YOUR_AWS_BUCKET_NAME>"
AWS_ACCESS_KEY_ID="<YOUR_AWS_ACCESS_KEY_ID>"
AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>"
# Extract Elasticsearch host and port from relationships
ES_HOST=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].host')
ES_PORT=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].port')
# Register the snapshot repository
curl -X PUT "http://${ES_HOST}:${ES_PORT}/_snapshot/aws-s3?pretty" -H 'Content-Type: application/json' -d'{
"type": "s3",
"settings": {
"bucket": "'"${AWS_BUCKET_NAME}"'",
"client": "default",
"access_key": "'"${AWS_ACCESS_KEY_ID}"'",
"secret_key": "'"${AWS_SECRET_ACCESS_KEY}"'"
}
}'
Une fois ça fait, tous les nouveaux instantanés Elasticsearch seront stockés dans le compartiment AWS S3.
On va utiliser un script bash tout simple qu’il faudra exécuter dans le conteneur de l’application --make-elasticsearch-snapshot.sh à la racine de ton projet :
# Extract snapshot parameters
SNAPSHOT_ID=$(date +"%Y%m%d-%H%M%S")
SNAPSHOT_NAME=$(echo "${PLATFORM_PROJECT}-${PLATFORM_BRANCH}-${SNAPSHOT_ID}")
SNAPSHOT_DATE=$(date +"%Y-%m-%d %H:%M:%S")
# Extract Elasticsearch host and port from relationships
ES_HOST=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].host')
ES_PORT=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].port')
# Create a new snapshot
curl -X PUT "http://${ES_HOST}:${ES_PORT}/_snapshot/aws-s3/${SNAPSHOT_NAME}?wait_for_completion=true&pretty" -H 'Content-Type: application/json' -d'{
"ignore_unavailable": true,
"include_global_state": false,
"metadata": {
"taken_by": "Upsun.com cron",
"taken_on": "'"${SNAPSHOT_DATE}"'",
"taken_because": "Daily backup"
}
}
Ajoute ce script elasticsearch_snapshot aux tâches cron de ton application dans .upsun/config.yaml:
crons:
....
elasticsearch_snapshot:
spec: '15 23 * * *'
commands:
start: bash make-elasticsearch-snapshot.sh
Et déploie-le :
git add .upsun/config.yaml make-elasticsearch-snapshot.sh
git commit -m "Added Elasticsearch snapshot cron job"
git push
Une fois le déploiement terminé, on peut exécuter le script dans le conteneur de l'application :
# SSH to the Upsun.com app container
upsun ssh
# Run the newly deployed script
bash make-elasticsearch-snapshot.sh
Le nouvel instantané sera créé et stocké dans notre compartiment AWS S3.
On peut obtenir la liste des snapshots disponibles en exécutant les commandes suivantes :
# SSH to the Upsun.com app container
upsun ssh
# Extract Elasticsearch host and port from relationships
ES_HOST=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].host')
ES_PORT=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].port')
# Get the list of available snapshots
curl -X GET "http://${ES_HOST}:${ES_PORT}/_cat/snapshots/aws-s3?v"
Nos prochaines étapes seront les suivantes :
curl -X POST "http://%LOCAL_ELASTICSEARCH%/_snapshot/aws-s3/%SNAPSHOT_NAME%/_restore"
Une fois ces étapes terminées, on exporte les données d’Upsun Elasticsearch vers notre installation locale. Et on peut répéter ces étapes quand on en a besoin.
J'espère que cet article t'a paru intéressant et utile. J'espère qu'il illustre bien la flexibilité et l'évolutivité du framework Upsun Cloud. N'hésite pas à nous faire part de tes retours et commentaires. Bonne création de snapshots !
(Reproduit avec autorisation.)