Contextual Code est spécialisé dans les projets d'entreprise pour les agences gouvernementales. Nous nous attaquons régulièrement à des projets difficiles de gestion de contenu web, de migration, d'intégration, de personnalisation et d'exploitation. Nous savons ce qu'il faut faire pour lancer un projet et le mettre en ligne.
Upsun est notre principale plateforme d'hébergement ; elle est incroyablement flexible et fournit une vaste liste de services qui peuvent être mis en place avec une configuration minimale.
Il existe plusieurs scénarios possibles, tels que la création de sauvegardes supplémentaires ou la synchronisation des données avec les environnements de développement locaux, dans lesquels vous pouvez avoir besoin d'extraire des données de ces services. Dans de nombreux cas, il est facile d'extraire ces données lorsque vous utilisez Upsun. Par exemple, vous pouvez obtenir MariaDB/MySQL via la commande de l'outil CLI d'Upsun.
Mais dans certains cas, il est plus complexe d'extraire les données dont vous avez besoin ; des outils plus avancés sont nécessaires. Nous avons abordé l'un de ces cas dans notre article de blog Backup Solr on Upsun. Aujourd'hui, nous allons en aborder un autre : comment utiliser le référentiel d'instantanés S3 d'AWS Elasticsearch pour Elasticsearch sur Upsun.
Tout d'abord, assurons-nous que nous avons un service Elasticsearch dans le fichier de configuration .upsun/config.yaml
, sous la clé services
:
services:
elasticsearch:
type: elasticsearch:7.2
Injectons ensuite le service dans l'application via la relation elasticsearch
dans le fichier .upsun/config.yaml
:
relationships:
elasticsearch:
De plus, dans la console de gestion AWS, nous devons :
Le plugin Elasticsearch S3 est extrêmement facile à activer sur Upsun. 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-s3
Après avoir déployé ce changement, nous devons nous connecter en SSH au conteneur d'application et enregistrer un nouveau dépôt d'instantanés en exécutant la commande suivante :
# SSH vers le conteneur Upsun.com app container upsun ssh
# Remplacer la valeur de ces 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>"
# Extraire l'hôte et le port Elasticsearch des relations
ES_HOST=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].host')
ES_PORT=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].port')
# Enregistrer le dépôt d'instantanés
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 cette opération effectuée, tous les nouveaux instantanés Elasticsearch seront stockés dans le seau AWS S3.
Nous allons utiliser un simple script bash qui devra être exécuté dans le conteneur d'application --make-elasticsearch-snapshot.sh
à la racine de votre projet :
# Extraire les paramètres de l'instantané
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")
# Extraire l'hôte et le port Elasticsearch des relations
ES_HOST=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].host')
ES_PORT=$(echo "$PLATFORM_RELATIONSHIPS" | base64 --decode | jq -r '.elasticsearch[0].port')
# Créer un nouveau 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"
}
}
Ajoutez ce script en tant qu'elasticsearch_snapshot
aux tâches cron de votre application dans .upsun/config.yaml
:
crons:
....
elasticsearch_snapshot:
spec: '15 23 * * *'
commands:
start: bash make-elasticsearch-snapshot.sh
Et déployez-le :
git add .upsun/config.yaml make-elasticsearch-snapshot.sh
git commit -m "Added Elasticsearch snapshot cron job"
git push
Après le déploiement, nous pouvons exécuter le script dans le conteneur d'application :
# SSH au conteneur d'application Upsun.com
upsun ssh
# Exécuter le script nouvellement déployé
bash make-elasticsearch-snapshot.sh
Le nouveau snapshot sera créé et stocké dans notre bucket AWS S3.
Nous pouvons obtenir une 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 seraient les suivantes :
curl -X POST "http://%LOCAL_ELASTICSEARCH%/_snapshot/aws-s3/%SNAPSHOT_NAME%/_restore"
Une fois ces étapes terminées, nous exportons les données de Upsun Elasticsearch vers notre installation locale. Nous pouvons répéter ces étapes à chaque fois que nous en avons besoin.
J'espère que vous avez trouvé cet article intéressant et utile. J'espère qu'il illustre la flexibilité et l'extensibilité du framework Upsun. Vos réactions et commentaires sont les bienvenus. Joyeux instantanés !
(Reproduit avec l'autorisation de l'auteur)