Comment créer et planifier des instantanés manuels sur OpenSearch Service ?
Je souhaite créer un instantané manuel de mon domaine Amazon OpenSearch Service. Je souhaite également exécuter automatiquement l’instantané de manière récurrente.
Brève description
Pour créer un instantané manuel de votre domaine OpenSearch Service, configurez un compartiment Amazon Simple Storage Service (Amazon S3) pour stocker les données d’instantané. Puis, enregistrez le compartiment S3 en tant que référentiel d’instantanés. Enfin, utilisez le référentiel enregistré pour créer des instantanés manuels. Vous pouvez également utiliser OpenSearch Dashboards pour prendre un instantané du référentiel enregistré.
Pour planifier automatiquement des instantanés manuels pour OpenSearch 2.1+, utilisez une politique d’instantané. Pour les versions antérieures d'OpenSearch, utilisez une fonction AWS Lambda avec le planificateur Amazon EventBridge.
Résolution
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.
Prérequis :
- Votre domaine exécute OpenSearch 1.0+.
- La politique de Gestion des identités et des accès AWS (AWS IAM) de votre utilisateur ou rôle dispose des autorisations CreateBucket et PutBucketPolicy qui sont nécessaires pour gérer le compartiment.
- La politique IAM de votre utilisateur ou rôle dispose de l'autorisation IAMFullAccess nécessaire pour créer une politique et un rôle IAM.
- La politique IAM de votre utilisateur ou rôle dispose de l'autorisation ESHttpPut nécessaire pour enregistrer le référentiel.
Configurer un compartiment S3
Procédez comme suit :
-
Créez un nouveau compartiment dans la même région AWS que votre domaine OpenSearch Service.
-
Utilisez la console IAM ou l'AWS CLI pour créer une politique IAM qui accorde les autorisations nécessaires pour accéder au compartiment S3.
Exemple de politique :{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::your-bucket-name" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "iam:PassRole" ], "Resource": [ "arn:aws:s3:::your-bucket-name/*" ] } ] }Remarque : Remplacez your-bucket-name par le nom de votre compartiment.
-
Utilisez la console IAM ou l'AWS CLI pour créer un rôle IAM pour OpenSearch Service.
L'exemple de commande create-role suivant crée un rôle nommé TheSnapshotRole et associe une politique d’approbation à ce rôle :aws iam create-role --role-name TheSnapshotRole --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "opensearchservice.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }' -
Utilisez la console IAM ou l'AWS CLI pour associer la stratégie d'accès Amazon S3 au rôle.
-
Utilisez la console IAM ou l’AWS CLI pour créer une politique avec les autorisations iam:PassRole.
Exemple de politique :{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/TheSnapshotRole" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "arn:aws:es:region:account-id:domain/domain-name/*" } ] }Remarque : Remplacez account-id par votre ID de compte AWS, region par votre région et domain-name par le nom de domaine OpenSearch Service.
-
Exécutez la commande attach-user-policy suivante pour associer la politique iam:PassRole policy à l'utilisateur IAM que vous avez configuré pour utiliser l'AWS CLI :
aws iam attach-user-policy --user-name YOUR_IAMUSERNAME --policy-arn arn:aws:iam::account-id:policy/PassRolePolicyRemarque : Remplacez YOUR_IAMUSERNAME par votre nom d'utilisateur et account-id par votre ID de compte.
Enregistrer le référentiel d’instantanés
Pour enregistrer le référentiel d’instantanés, vous devez signer la requête avec AWS Signature Version 4. Les noms de référentiels ne peuvent pas commencer par cs. En outre, il n'est pas recommandé d'écrire dans le même référentiel à partir de plusieurs domaines. Configurez un seul domaine pour avoir un accès en écriture au référentiel.
Utilisez Python pour enregistrer le référentiel d’instantanés dans Lambda. Ou, pour utiliser awscurl et l'AWS CLI afin d'enregistrer le référentiel d’instantanés, exécutez la commande suivante sur votre instance :
read -r ACCESS_KEY SECRET_KEY SESSION_TOKEN <<< $(aws sts get-session-token --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text) awscurl \ --access_key $ACCESS_KEY \ --secret_key $SECRET_KEY \ --session_token $SESSION_TOKEN \ --region us-west-2 \ --service es \ -X PUT \ -H "Content-Type: application/json" \ 'domain-endpoint/_snapshot/my-snapshot-repo' \ -d '{ "type": "s3", "settings": { "bucket": "bucketname", "region": "us-west-2", "role_arn": "arn:aws:iam::account-id:role/TheSnapshotRole" } }'
Remarque : Remplacez my-snapshot-repo par le nom de votre référentiel, bucketname par le nom de votre compartiment et us-west-2 par votre région. Remplacez également domain-endpoint par le point de terminaison de votre domaine OpenSearch Service, account-id par votre ID de compte et TheSnapshotRole par le nom de votre rôle.
Pour installer awscurl, exécutez la commande suivante :
pip install awscurl
Pour en savoir plus, consultez la page awscurl sur le site Web de GitHub.
Créer l’instantané manuel
Utilisez les commandes curl pour prendre un instantané manuel de votre domaine OpenSearch Service. Pour OpenSearch 2.5 ou version ultérieure, vous pouvez utiliser OpenSearch Dashboards. Pour obtenir des instructions, consultez la page Prendre un instantané sur le site Web d'OpenSearch.
Après avoir créé l'instantané, vous pouvez l'afficher dans le compartiment S3 ou via OpenSearch Dashboards.
Planifier des instantanés manuels automatisés
Pour OpenSearch 2.1 ou version ultérieure, vous pouvez utiliser une API ou OpenSearch Dashboards pour créer une politique d’instantané avec le référentiel enregistré. Pour plus d'informations, consultez les pages API de gestion des instantanés et Création d'une politique SM sur le site Web d'OpenSearch.
Pour les versions d'OpenSearch antérieures à 2.1, procédez comme suit pour planifier des instantanés manuels :
- Si votre domaine OpenSearch Service se trouve dans un cloud privé virtuel (VPC), créez une nouvelle fonction Lambda avec l’exécution Python 3.13 dans le même VPC.
- Ajoutez la couche AWSSDKPandas-Python313 qui inclut requests-aws4auth dans la fonction. Pour plus d'informations, consultez les pages Couches gérées par AWS Lambda sur le site Web d’AWS SDK for Pandas et requests-aws4auth sur le site Web de Python.
- Saisissez le code suivant pour votre fonction Lambda :
Remarque : Remplacez domain-endpoint par le point de terminaison de votre domaine, mais n'incluez pas https://. Remplacez également my-snapshot-repo par votre référentiel d’instantanés et us-west-2 par votre région.import json import boto3 import requests from requests_aws4auth import AWS4Auth from datetime import datetime def lambda_handler(event, context): # OpenSearch endpoint and repository details host = 'domain-endpoint' repository = 'my-snapshot-repo' snapshot = f"snapshot-{datetime.now().strftime('%Y%m%d%H%m%S')}" region = 'us-west-2' service = 'es' # Get AWS credentials credentials = boto3.Session().get_credentials() awsauth = AWS4Auth( credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token ) # API endpoint for creating snapshot url = f'https://{host}/_snapshot/{repository}/{snapshot}' # Snapshot creation parameters payload = { "indices": "*", "ignore_unavailable": True, "include_global_state": False } try: # Make the request response = requests.put( url, auth=awsauth, json=payload, headers={"Content-nt-Type": "application/json"} ) # Check if request was successful if response.status_code == 200: return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Snapshot creation initiated successfully', 'snapshot_name': snapshot, 'response': response.json() }) } else: return { 'statusCode': response.status_code, 'body': json.dumps({ 'message': 'Failed to create snapshot', 'error': response.text }) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({ 'message': 'Error creating snapshot', 'error': str(e) }) } - Associez les autorisations suivantes au rôle associé à la fonction Lambda :
Remarque : Remplacez region par votre région, account-id par votre ID de compte, my-snapshot-repo par le nom de votre référentiel et domain-name par votre domaine.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpPut", "es:DescribeElasticsearchDomain" ], "Resource": "arn:aws:es:region:account-id:domain/domain-name/*" } ] } - Utilisez le planificateur EventBridge pour invoquer la fonction Lambda selon un calendrier.
(Facultatif) Supprimer les instantanés inutiles
Pour les instantanés manuels créés par la politique d’instantané, utilisez le paramètre max_age ou la période de conservation pour définir une date d'expiration. Pour plus d'informations et d'instructions, consultez la page Paramètres et Création d'une politique SM sur le site Web d’OpenSearch.
Si la fonction Lambda a créé l’instantané manuel, vous ne pouvez pas configurer d'option d'expiration. Utilisez plutôt une autre fonction Lambda pour supprimer les instantanés OpenSearch.
La fonction Lambda suivante supprime les instantanés OpenSearch datant de plus de 30 jours :
import json import boto3 import requests from requests_aws4auth import AWS4Auth from datetime import datetime, timedelta import re def parse_date_from_snapshot_name(snapshot_name): # Pattern for format: snapshot-YYYY-MM-DDtHH-MM-SS try: # Skip "snapshot-" prefix and parse the date part date_str = snapshot_name[9:] # Remove "snapshot-" return datetime.strptime(date_str, '%Y-%m-%dt%H-%M-%S') except (ValueError, IndexError): return None def lambda_handler(event, context): # OpenSearch endpoint and repository details host = 'domain-endpoint' repository = 'my-snapshot-repo' region = 'us-west-2' service = 'es' # Get AWS credentials credentials = boto3.Session().get_credentials() awsauth = AWS4Auth( credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token ) try: # First, get all snapshots list_url = f'https://{host}/_snapshot/{repository}/_all' list_response = requests.get( list_url, auth=awsauth, headers={"Content-Type": "application/json"} ) if list_response.status_code != 200: raise Exception(f"Failed to list snapshots: {list_response.text}") response_data = list_response.json() snapshots = response_data.get('snapshots', []) current_time = datetime.now() deletion_results = [] # Process each snapshot for snapshot in snapshots: snapshot_name = snapshot.get('snapshot') try: snapshot_date = parse_date_from_snapshot_name(snapshot_name) if snapshot_date and (current_time - snapshot_date).days > 30: # Delete snapshot delete_url = f'https://{host}/_snapshot/{repository}/{snapshot_name}' delete_response = requests.delete( delete_url, auth=awsauth, headers={"Content-Type": "application/json"} ) deletion_results.append({ 'snapshot': snapshot_name, 'status': 'deleted' if delete_response.status_code == 200 else 'failed', 'response': delete_response.text }) else: deletion_results.append({ 'snapshot': snapshot_name, 'status': 'skipped', 'reason': 'Not older than 30 days or date not found in name' }) except Exception as e: deletion_results.append({ 'snapshot': snapshot_name, 'status': 'error', 'error': str(e) }) return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Snapshot deletion process completed', 'results': deletion_results }) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({ 'message': 'Error in snapshot deletion process', 'error': str(e) }) }
Remarque : Remplacez domain-endpoint par le point de terminaison de votre domaine sans https://, region par votre région et my-snapshot-repo par le nom de votre référentiel. Il est recommandé de configurer le délai d'expiration de la fonction Lambda à 60 secondes.
Résoudre les problèmes
Effectuez les actions suivantes en fonction de l'erreur que vous recevez.
Erreur « No permissions for [cluster:admin/snapshot/create] »
Si vous avez activé un contrôle précis des accès sur votre domaine OpenSearch Service, vous devez accorder à OpenSearch Service l'accès au rôle de fonction Lambda. Si vous n'accordez pas l'accès, le message d'erreur d'autorisation suivant s'affiche :
« "statusCode": 403, "body": "{"message": "Failed to create snapshot", "error": "{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [cluster:admin/snapshot/create] and User [name=arn:aws:iam::123456789012:role/service-role/Lambda_ES_Snapshot-role »
Pour résoudre ce problème, exécutez la commande suivante pour autoriser OpenSearch Service à accéder au rôle de fonction Lambda :
awscurl \ --access_key ABCDE \ --secret_key EXAMPLESECRET\ --region us-west-2 \ --service es \ -X PUT \ -H "Content-Type: application/json" \ 'https://domain-endpoint/_plugins/_security/api/rolesmapping/all_access' \ -d '{"backend_roles": ["arn:aws:iam::account-id:role/service-role/Lambda_AOS_Snapshot-role"], "hosts": [], "users": ["master-user", "arn:aws:iam::account-id:user/second-primary-user" ]}'
Remarque : Remplacez ABCDE par votre clé d'accès, EXAMPLESECRET par votre code secret et us-west-2 par votre région. Remplacez également domain-endpoint par le point de terminaison de votre domaine OpenSearch Service, account-id par votre ID de compte et Lambda_AOS_Snapshot-role par votre rôle de fonction Lambda.
Erreur « AccessDeniedException »
Si le message d'erreur « AccessDeniedException » s'affiche, vous devez configurer une relation d’approbation pour le rôle IAM qui accède au compartiment S3. Pour résoudre ce problème, utilisez le simulateur de politique IAM pour identifier la partie de votre politique IAM à mettre à jour.
Erreur « S3Exception »
Si vous recevez le message d’erreur « S3Exception: The bucket is in region 'us-west-1' », vous devez déplacer le compartiment vers la même région que le domaine OpenSearch Service.
Erreur « SignatureDoesNotMatch »
Si le message d'erreur « SignatureDoesNotMatch » s'affiche, cela signifie que vos informations d'identification AWS ont expiré ou que vous avez utilisé des informations incorrectes dans votre signature. Maintenez vos informations d'identification AWS à jour et assurez-vous que la région figure correctement dans votre signature.
Erreur « not authorized to perform: iam:PassRole »
Si vous n'utilisez pas AWS Signature Version 4, le message d'erreur suivant s'affiche :
« Message":"User: anonymous is not authorized to perform: iam:PassRole on resource: arn:aws:iam::account-id:role/TheSnapshotRole because no resource-based policy allows the iam:PassRole action »
Pour résoudre cette erreur, consultez la section Pourquoi le message d'erreur « User: anonymous is not authorized » s'affiche-t-il lorsque j'essaie d'accéder à mon cluster OpenSearch Service ?
Pour plus d'informations sur la résolution des problèmes, consultez la section Comment résoudre l'erreur d’instantané manuel dans mon cluster OpenSearch Service ?
Informations connexes
Comment puis-je restaurer les données d'un domaine OpenSearch Service dans un autre compte AWS ?
- Sujets
- Analytics
- Balises
- Amazon OpenSearch Service
- Langue
- Français

Contenus pertinents
- Réponse acceptée
demandé il y a 2 ans
demandé il y a un an
demandé il y a 2 ans
demandé il y a un an