Creazione di snapshot di indici in Amazon OpenSearch Service - Amazon OpenSearch Service

Creazione di snapshot di indici in Amazon OpenSearch Service

Gli snapshot Amazon OpenSearch Service sono backup degli indici e dello stato di un cluster. Lo stato include le impostazioni del cluster, le informazioni sul nodo, le impostazioni degli indici e l'allocazione delle partizioni.

Gli snapshot di OpenSearch Service sono disponibili nei seguenti formati:

  • Gli snapshot automatici sono solo per il ripristino del cluster. È possibile utilizzarli per ripristinare il dominio in caso di stato rosso del cluster o di perdita di dati. Per ulteriori informazioni, consultare Ripristino degli snapshot. OpenSearch Service archivia gli snapshot automatici in un bucket Amazon S3 preconfigurato senza costi aggiuntivi.

  • Gli snapshot manuali servono per il ripristino del cluster o lo spostamento di dati da un cluster a un altro. È necessario avviare gli snapshot manuali. Questi snapshot vengono archiviati nel bucket Amazon S3 e vengono applicati i costi standard di S3. Se si dispone di uno snapshot di un cluster OpenSearch autogestito, sarà possibile utilizzarlo anche per eseguire la migrazione a un dominio OpenSearch Service. Per ulteriori informazioni, consultare Migrazione ad Amazon OpenSearch Service.

Tutti i domini OpenSearch Service acquisiscono gli snapshot automatici, ma la frequenza con cui lo fanno differisce nei seguenti modi:

  • Per domini che eseguono OpenSearch o Elasticsearch 5.3 e versioni successive, OpenSearch Service richiede snapshot orari automatici e ne conserva fino a 336 per 14 giorni. Gli snapshot orari sono meno dirompenti a causa della loro natura incrementale. Forniscono inoltre un punto di ripristino più recente in caso di problemi di dominio.

  • Per domini che eseguono Elasticsearch 5.1 e versioni precedenti, OpenSearch Service richiede snapshot giornalieri automatici (durante l'ora specificata) e ne conserva fino a 14 per un massimo 30 giorni.

Se il cluster entra nello stato rosso, tutti gli snapshot automatici hanno esito negativo mentre lo stato del cluster persiste. Se il problema non viene risolto entro due settimane, è possibile che i dati del cluster vengano persi definitivamente. Per la risoluzione dei problemi, consulta Cluster in stato rosso.

Prerequisiti

Per creare manualmente gli snapshot, è necessario utilizzare IAM e Amazon S3. Verificare che siano soddisfatti i seguenti prerequisiti prima di provare ad acquisire uno snapshot.

Prerequisito Descrizione
Bucket S3

Creare un bucket S3 per archiviare gli snapshot manuali per il dominio OpenSearch Service. Per le istruzioni, consulta Crea un bucket nella Guida per l'utente di Amazon Simple Storage Service.

Ricordare il nome del bucket per utilizzarlo nei seguenti punti:

  • L'istruzione Resource della policy IAM collegata al ruolo IAM

  • Il client Python utilizzato per registrare un repository di snapshot (se si utilizza questo metodo)

Importante

Non applicare la regola del ciclo di vita S3 Glacier a questo bucket. Gli snapshot manuali non supportano la classe di archiviazione S3 Glacier.

Ruolo IAM

Creare un ruolo IAM per delegare le autorizzazioni a OpenSearch Service. Per le istruzioni, consultare Creazione di un ruolo IAM (console) nella Guida per l'utente di IAM. Nel resto di questo capitolo ci si riferisce a questo ruolo come TheSnapshotRole.

Collegamento di una policy IAM

Collegare la seguente policy a TheSnapshotRole per consentire l'accesso al bucket S3:

{ "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/*" ] } ] }

Per istruzioni su come collegare una policy a un ruolo, consultare Aggiunta di autorizzazioni per l'identità IAM nella Guida per l'utente di IAM.

Modifica della relazione di trust

Modificare la relazione di trust di TheSnapshotRole per specificare il servizio OpenSearch nell'istruzione Principal come mostrato nell'esempio seguente:

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "opensearchservice.amazonaws.com" }, "Action": "sts:AssumeRole" }] }

Si consiglia di utilizzare il le chiavi di condizione aws:SourceAccount e aws:SourceArn per proteggersi dal problema del "confused deputy". L'account fonte è il proprietario del flusso di log e l'ARN fonte è l'ARN del dominio. Per aggiungere queste chiavi di condizione, il dominio deve trovarsi sul software di servizio R20211203 o versioni successive.

Ad esempio, è possibile aggiungere il seguente blocco di condizione alla policy di attendibilità:

"Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:es:region:account-id:domain/domain-name" } }

Per le istruzioni su come modificare la relazione di trust, consultare Modifica di una policy di attendibilità del ruolo nella Guida per l'utente di IAM.

Autorizzazioni

Per registrare il repository di snapshot, è necessario poter inviare TheSnapshotRole a OpenSearch Service. Devi inoltre disporre dell'accesso all'operazione es:ESHttpPut. Per concedere entrambe queste autorizzazioni, collegare la policy seguente all'utente o al ruolo IAM le cui credenziali vengono utilizzate per firmare la richiesta:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/TheSnapshotRole" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*" } ] }

Se l'utente o il ruolo non dispone delle autorizzazioni iam:PassRole per inviare TheSnapshotRole, è possibile che si verifichi il seguente errore comune quando si prova a registrare un repository nel passaggio successivo:

$ python register-repo.py {"Message":"User: arn:aws:iam::123456789012:user/MyUserAccount is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789012:role/TheSnapshotRole"}

Registrazione di un repository di snapshot manuali

Prima di poter acquisire manualmente gli snapshot di indice con OpenSearch Service, è necessario registrare un repository di snapshot. Tale operazione una tantum richiede che la richiesta AWS sia firmata con credenziali che dispongono dell'accesso a TheSnapshotRole, come descritto in Prerequisiti.

Fase 1: Mappatura del ruolo dello snapshot in OpenSearch Dashboards (se si utilizza un controllo granulare degli accessi)

Il controllo granulare degli accessi introduce un passaggio aggiuntivo durante la registrazione di un repository. Anche se si utilizza l'autenticazione di base HTTP per tutti gli altri scopi, è necessario mappare il ruolo manage_snapshots all'utente o al ruolo IAM che dispone delle autorizzazioni iam:PassRole per inviare TheSnapshotRole.

  1. Passare al plug-in OpenSearch Dashboards per il dominio OpenSearch Service. L'endpoint Dashboards è disponibile nel pannello di controllo del dominio nella console OpenSearch Service.

  2. Dal menu principale scegliere Sicurezza, Ruoli e selezionare il ruolo manage_snapshots.

  3. Scegliere Utenti mappati, Gestisci mappatura.

  4. Aggiungere l'ARN del dominio dell'utente o del ruolo che dispone delle autorizzazioni per inviare TheSnapshotRole. Inserire gli ARN degli utenti in Utenti e gli ARN dei ruoli in Ruoli di back-end.

    arn:aws:iam::123456789123:user/user-name
    arn:aws:iam::123456789123:role/role-name
  5. Selezionare Mappa e confermare che l'utente o il ruolo venga visualizzato in Utenti mappati.

Fase 2: Registrazione di un repository

Per registrare un repository di snapshot, inviare una richiesta PUT all'endpoint del dominio OpenSearch Service. Non è possibile utilizzare curl per eseguire questa operazione perché non supporta la firma della richiesta AWS. Puoi utilizzare invece il client Python di esempio, sample Python client, Postman o altri metodi per inviare una richiesta firmata per la registrazione del repository di snapshot.

La richiesta ha il seguente formato:

PUT domain-endpoint/_snapshot/my-snapshot-repo-name { "type": "s3", "settings": { "bucket": "s3-bucket-name", "region": "region", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } }
Nota

I nomi dei repository non possono iniziare con "cs-".

Se il dominio si trova all'interno di un Virtual Private Cloud (VPC), perché la richiesta registri correttamente il repository di snapshot il computer deve essere connesso al VPC. L'accesso a un VPC varia in base alla configurazione della rete, ma prevede con ogni probabilità la connessione a una VPN o a una rete aziendale. Per controllare che il dominio OpenSearch Service sia raggiungibile, passare a https://your-vpc-domain.region.es.amazonaws.com in un browser Web e verificare di ricevere la risposta JSON di default.

Crittografia dei repository degli snapshot

Al momento non è possibile utilizzare chiavi AWS Key Management Service (KMS) per crittografare gli snapshot manuali, ma è possibile proteggerli utilizzando la crittografia lato server (SSE).

Per abilitare SSE con chiavi gestite da S3 per il bucket che si utilizza come repository degli snapshot, aggiungere "server_side_encryption": true al blocco "settings" della richiesta PUT. Per maggiori informazioni, consultare Protezione dei dati mediante la crittografia lato server con chiavi di crittografia gestite da Amazon S3 nella Guida per l'utente di Amazon Simple Storage Service.

In alternativa, è possibile utilizzare le chiavi AWS KMS per la crittografia lato server sul bucket S3 che si utilizza come repository degli snapshot. Se usi questo approccio, assicurati di fornire l'autorizzazione TheSnapshotRole per la chiave AWS KMS utilizzata per crittografare il bucket S3. Per ulteriori informazioni, consulta Policy delle chiavi in AWS KMS.

Migrazione di dati a un dominio diverso

La registrazione di un repository di snapshot è un'operazione che viene eseguita una tantum. Tuttavia, per eseguire la migrazione da un dominio a un altro, è necessario registrare lo stesso repository di snapshot sia sul vecchio dominio che sul nuovo. Il nome del repository è arbitrario.

Considerare le seguenti linee guida quando si esegue la migrazione a un nuovo dominio o si registra lo stesso repository con più domini per un altro motivo:

  • Quando si registra il repository nel nuovo dominio, aggiungere "readonly": true al blocco "settings" della richiesta PUT. Questa impostazione impedisce di sovrascrivere accidentalmente i dati dal vecchio dominio.

  • Se si esegue la migrazione di dati a un dominio in una regione diversa (ad esempio, da un vecchio dominio e bucket situati in us-east-2 a un nuovo dominio in us-west-2), è possibile che venga visualizzato questo errore 500 quando si invia la richiesta PUT:

    The bucket is in this region: us-east-2. Please use this region to retry the request.

    Se si verifica questo errore, provare a sostituire "region": "us-east-2" con "endpoint": "s3.amazonaws.com" nell'istruzione PUT e ripetere la richiesta.

Utilizzo del client Python di esempio

Il client Python è più facile da automatizzare rispetto a una semplice richiesta HTTP e ha una migliore riusabilità. Se si sceglie di utilizzare questo metodo per registrare un repository di snapshot, salvare il seguente codice Python di esempio come file Python, ad esempio register-repo.py. Il client richiede i pacchetti AWS SDK for Python (Boto3), richieste e requests-aws4auth. Il client contiene esempi commentati per altre operazioni con snapshot.

Suggerimento

Un codice di esempio basato su Java è disponibile nella sezione Firma delle richieste HTTP.

Aggiornare le seguenti variabili nel codice di esempio:host, region, path e payload.

import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # include https:// and trailing / region = '' # e.g. us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Register repository path = '_snapshot/my-snapshot-repo-name' # the OpenSearch API endpoint url = host + path payload = { "type": "s3", "settings": { "bucket": "s3-bucket-name", "region": "us-west-1", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } } headers = {"Content-Type": "application/json"} r = requests.put(url, auth=awsauth, json=payload, headers=headers) print(r.status_code) print(r.text) # # Take snapshot # # path = '_snapshot/my-snapshot-repo-name/my-snapshot' # url = host + path # # r = requests.put(url, auth=awsauth) # # print(r.text) # # # Delete index # # path = 'my-index' # url = host + path # # r = requests.delete(url, auth=awsauth) # # print(r.text) # # # Restore snapshot (all indexes except Dashboards and fine-grained access control) # # path = '_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = { # "indices": "-.kibana*,-.opendistro_security", # "include_global_state": False # } # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text) # # # Restore snapshot (one index) # # path = '_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = {"indices": "my-index"} # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text)

Acquisizione di snapshot manuali

Gli snapshot non sono istantanei. Richiedono tempo per essere completati e non rappresentano visualizzazioni puntuali perfette del cluster. Mentre è in corso uno snapshot, è comunque possibile indicizzare i documenti ed effettuare altre richieste al cluster, ma i nuovi documenti (e gli aggiornamenti ai documenti esistenti) non saranno generalmente inclusi nello snapshot. Lo snapshot include le partizioni primarie esistenti quando all'avvio dello snapshot da parte di OpenSearch. A seconda della dimensione del pool di thread dello snapshot, potrebbero essere incluse diverse partizioni nello snapshot in momenti leggermente diversi.

Archiviazione e prestazioni degli snapshot

Gli snapshot OpenSearch sono incrementali, il che significa che archiviano solo i dati che hanno subito modifiche dall'ultimo snapshot riuscito. Questa natura incrementale significa che la differenza di utilizzo del disco tra snapshot frequenti e infrequenti spesso è minima. In altre parole, effettuando snapshot orarie per una settimana (per un totale di 168 snapshot) potrebbe non essere necessario molto più spazio su disco rispetto a una snapshot singola alla fine della settimana. Inoltre, se la frequenza con cui si prendono le snapshot è alta, minore è il tempo necessario per il completamento del processo. Ad esempio, gli snapshot giornalieri possono richiedere 20-30 minuti per essere completati, mentre gli snapshot orari potrebbero essere completati in pochi minuti. Alcuni utenti di OpenSearch acquisiscono snapshot ogni mezz'ora.

Creazione di una snapshot

Quando si crea uno snapshot, specificare quanto segue:

  • Il nome del repository di snapshot

  • Un nome per lo snapshot

Per brevità e comodità, gli esempi illustrati in questo capitolo utilizzano curl, un comune client HTTP. Tuttavia, se le policy di accesso specificano utenti o ruoli IAM, è necessario firmare le richieste di snapshot. Puoi fare riferimento agli esempi commentati nel client Python di esempio per inviare richieste HTTP firmate agli stessi endpoint utilizzati dai comandi curl.

Per acquisire uno snapshot manuale, procedere nel seguente modo:

  1. Non puoi acquisire uno snapshot se ne è attualmente in esecuzione un altro. Per verificare, esegui il comando seguente:

    curl -XGET 'domain-endpoint/_snapshot/_status'
  2. Emettere il comando seguente per acquisire manualmente uno snapshot:

    curl -XPUT 'domain-endpoint/_snapshot/repository-name/snapshot-name'
Nota

Il tempo richiesto per uno snapshot aumenta con la dimensione del dominio OpenSearch Service. In caso di operazioni di snapshot di lunga durata, talvolta si verifica l'errore 504 GATEWAY_TIMEOUT. In genere, è possibile ignorare questi errori e attendere il completamento dell'operazione. Utilizzare il comando seguente per verificare lo stato di tutti gli snapshot del dominio:

curl -XGET 'domain-endpoint/_snapshot/repository-name/_all?pretty'

Ripristino di snapshot

avvertimento

Se si utilizzano alias di indice, non inviare richieste di scrittura a un alias (e non passare l'alias a un altro indice) prima di eliminare il relativo indice. Interrompere le richieste di scrittura consente di evitare il seguente scenario:

  1. L'eliminazione di un indice comporta l'eliminazione anche del relativo alias.

  2. Una richiesta di scrittura all'alias ormai eliminato crea un nuovo indice con lo stesso nome dell'alias.

  3. Non puoi più utilizzare l'alias a causa di un conflitto di denominazione con il nuovo indice.

Se hai passato l'alias a un altro indice, specifica "include_aliases": false durante il ripristino da una snapshot.

Per ripristinare uno snapshot, completare la seguente procedura.

  1. Identificare lo snapshot che si desidera ripristinare. Per vedere tutti i repository di snapshot, esegui il comando seguente:

    curl -XGET 'domain-endpoint/_snapshot?pretty'

    Dopo aver identificato il repository, esegui il comando seguente per visualizzare tutte le snapshot:

    curl -XGET 'domain-endpoint/_snapshot/repository-name/_all?pretty'
    Nota

    La maggior parte delle snapshot automatiche viene archiviata nel repository cs-automated. Se il dominio prevede la crittografia dei dati a riposo, gli snapshot saranno archiviati nel repository cs-automated-enc. Se il repository di snapshot manuali che si sta cercando non viene trovato, verificare di averlo registrato nel dominio.

  2. (Facoltativo) Eliminare o rinominare uno o più indici nel dominio OpenSearch Service in caso di conflitti di nomi tra gli indici del cluster e gli indici dello snapshot. Non è possibile ripristinare uno snapshot di indici in un cluster OpenSearch che contiene già indici con lo stesso nome.

    Se sono presenti conflitti di nomi degli indici, sono disponibili le opzioni seguenti:

    Il comando seguente elimina tutti gli indici esistenti in un dominio:

    curl -XDELETE 'domain-endpoint/_all'

    Tuttavia, se non si prevede di ripristinare tutti gli indici, è possibile eliminarne uno:

    curl -XDELETE 'domain-endpoint/index-name'
  3. Esegui il comando seguente per ripristinare una snapshot:

    curl -XPOST 'domain-endpoint/_snapshot/repository-name/snapshot-name/_restore'

    A causa di autorizzazioni speciali su OpenSearch Dashboards e sugli indici con controllo granulare degli accessi, i tentativi di ripristinare tutti gli indici potrebbero non riuscire, soprattutto se si tenta di ripristinare da uno snapshot automatico. Nell'esempio seguente viene ripristinato solo un indice, my-index, da 2020-snapshot nel repository di snapshot cs-automated:

    curl -XPOST 'domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' -d '{"indices": "my-index"}' -H 'Content-Type: application/json'

    In alternativa, è possibile ripristinare tutti gli indici tranne gli indici Dashboards e quelli con controllo granulare degli accessi:

    curl -XPOST 'domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' -d '{"indices": "-.kibana*,-.opendistro*"}' -H 'Content-Type: application/json'
Nota

Se non tutte le partizioni principali sono disponibili per le istanze in questione, uno snapshot può avere state come PARTIAL. Tale valore indica che i dati provenienti da almeno una partizione non sono stati memorizzati. È comunque possibile eseguire il ripristino da una snapshot parziale, ma potrebbe essere necessario utilizzare le snapshot meno recenti per ripristinare gli indici mancanti.

Eliminazione degli snapshot manuali

Per eliminare uno snapshot manuale, emettere il seguente comando:

DELETE _snapshot/repository-name/snapshot-name

Automazione di snapshot con Index State Management

È possibile utilizzare l'operazione snapshot di Index State Management (ISM) per attivare automaticamente gli snapshot di indici in base alle modifiche relative all'età, alle dimensioni o al numero di documenti. Per un esempio di policy ISM che utilizza l'operazione snapshot, consultare Policy di esempio.

Utilizzo di Curator per gli snapshot

Se ISM non funziona per la gestione di indici e snapshot, è possibile utilizzare Curator. Offre funzionalità di filtraggio avanzate utili che semplificano le attività di gestione in cluster complessi. Utilizza pip per installare Curator.

pip install elasticsearch-curator

È possibile utilizzare Curator come interfaccia a riga di comando (CLI) o API Python. Se utilizzi l'API Python, è necessario utilizzare la versione 7.13.4 o precedente del client elasticsearch-py legacy. Non supporta il client opensearch-py.

Se si utilizza l'interfaccia a riga di comando (CLI), esportare le credenziali dalla riga di comando e configurare curator.yml come segue:

client: hosts: search-my-domain.us-west-1.es.amazonaws.com port: 443 use_ssl: True aws_region: us-west-1 aws_sign_request: True ssl_no_validate: False timeout: 60 logging: loglevel: INFO