Amazon Elasticsearch Service
Guía para desarrolladores (Versión de API 2015-01-01)

Uso de instantáneas de índice de Amazon Elasticsearch Service

Las instantáneas son copias de seguridad de los índices y el estado de un clúster. State incluye configuraciones de clúster, información de nodos, configuración de índices y asignación de fragmentos.

En Amazon Elasticsearch Service, las instantáneas aparecen de dos formas: automatizadas y manuales.

  • Las instantáneas automatizadas son solo para la recuperación de clústeres. Puede utilizarlas para restaurar su dominio en caso de que se produzca un estado rojo del clúster u otra pérdida de datos. Amazon ES almacena instantáneas automatizadas en un bucket de Amazon S3 preconfigurado sin costo adicional.

  • Las instantáneas manuales son para la recuperación de clústeres o para el traslado de datos de un clúster a otro. Como su nombre indica, tiene que iniciar instantáneas manuales. Estas instantáneas se almacenan en su propio bucket de Amazon S3 y se aplican tarifas estándar de S3. Si tiene una instantánea de un clúster de Elasticsearch autoadministrado, puede incluso utilizar esa instantánea para migrar a un dominio de Amazon ES.

Todos los dominios de Amazon ES toman instantáneas automatizadas, pero la frecuencia varía:

  • En el caso de los dominios que ejecutan Elasticsearch 5.3 y posterior, Amazon ES realiza instantáneas automáticas cada hora y retiene hasta 336 de ellas durante 14 días.

  • En el caso de los dominios que ejecutan Elasticsearch 5.1 y anterior, Amazon ES realiza instantáneas automatizadas diarias (durante la hora que se especifique) y retiene hasta 14 de ellas durante 30 días.

Si el clúster pasa al estado rojo, Amazon ES deja de tomar instantáneas automatizadas. Si no corrige el problema en dos semanas, puede perder de forma permanente los datos del clúster. Para ver los pasos de solución de problemas, consulte Estado rojo del clúster.

sugerencia

Muchos usuarios consideran adecuadas algunas herramientas como Curator para indexar y administrar las instantáneas. Utilice pip para instalar Curator.

pip install elasticsearch-curator

Curator ofrece una funcionalidad avanzada de filtrado que ayuda a simplificar las tareas de administración en clústeres complejos. Amazon ES admite Curator en dominios que ejecutan Elasticsearch versión 5.1 y superior. Puede utilizar Curator como una interfaz de línea de comandos (CLI) o una API de Python. Si utiliza la CLI, exporte sus credenciales en la línea de comandos y configure curator.yml como se indica a continuación:

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

Para ver un ejemplo de funciones Lambda que utiliza la API de Python, consulte Uso de Curator para rotar datos en Amazon Elasticsearch Service.

Requisitos previos para las instantáneas manuales

Para crear instantáneas de índice manualmente, debe usar IAM y Amazon S3. Compruebe que cumple los siguientes requisitos previos antes de intentar tomar una instantánea.

Requisito previo Descripción
Bucket de S3

Almacena las instantáneas manuales del dominio de Amazon ES. Anote el nombre del bucket. Lo necesitará en dos lugares:

  • Instrucción Resource de la política de IAM que se adjunta al rol de IAM

  • Cliente Python que se usa para registrar un repositorio de instantáneas

Para obtener más información, consulte Crear un bucket en la Guía de introducción a Amazon Simple Storage Service.

importante

No aplique una regla de ciclo de vida de Glacier a este bucket. Las instantáneas manuales no admiten la clase de almacenamiento de Glacier.

Rol de IAM

Delega los permisos en Amazon Elasticsearch Service. En el resto de este capítulo, este rol se denomina TheSnapshotRole.

La relación de confianza del rol debe especificar Amazon Elasticsearch Service en la instrucción Principal, como se muestra en el siguiente ejemplo:

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

El rol debe tener asociada la siguiente política:

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

Para obtener más información, consulte Adición de permisos de identidad de IAM en la Guía del usuario de IAM.

Permisos

Debe poder asumir el rol de IAM para registrar el repositorio de instantáneas. También necesita tener acceso a la acción es:ESHttpPut. La siguiente política incluye estos permisos:

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

Si no tiene permisos iam:PassRole para adoptar TheSnapshotRole, es posible que se produzcan estos errores comunes:

$ 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"}

Registro de un repositorio de instantáneas manuales

Debe registrar el repositorio de instantáneas en Amazon Elasticsearch Service para poder tomar instantáneas de índice manuales. Esta operación que solo se realiza una vez requiere que se firme la solicitud de AWS con unas credenciales puedan tener acceso a TheSnapshotRole, tal como se describe en Requisitos previos para las instantáneas manuales.

No puede utilizar curl para realizar esta operación, ya que no admite la firma de solicitudes de AWS. En su lugar, use el cliente Python de muestra, Postman o algún otro método para enviar una solicitud firmada para registrar el repositorio de instantáneas. La solicitud tiene el siguiente formato:

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

El registro de un directorio de instantáneas es una operación que se realiza una sola vez, pero para migrar de un dominio a otro, debe registrar el mismo repositorio de instantáneas en el dominio antiguo y en el nuevo.

importante

Si el bucket de S3 se encuentra en la región us-east-1, debe utilizar "endpoint": "s3.amazonaws.com" en lugar de "region": "us-east-1".

Para habilitar el cifrado del lado del servidor con claves administradas de S3 para el repositorio de instantáneas, añada "server_side_encryption": true al JSON "settings".

Si el dominio reside en una VPC, el equipo debe estar conectado a la VPC para que la solicitud registre correctamente el repositorio de instantáneas. El acceso a una VPC depende de la configuración de red, pero probablemente implica conectarse a una VPN o a una red corporativa. Para comprobar que tiene acceso al dominio de Amazon ES, vaya a https://your-vpc-domain.region.es.amazonaws.com en un navegador web y verifique que recibe la respuesta JSON predeterminada.

Cliente Python de muestra

Guarde el siguiente código de muestra Python como archivo Python; por ejemplo, register-repo.py. El cliente necesita los paquetes AWS SDK para Python (Boto 3), requests y requests-aws4auth. El cliente contiene ejemplos de otras operaciones de instantánea que están marcados como comentarios.

sugerencia

En Firma de solicitudes HTTP encontrará un ejemplo de código basado en Java.

Debe actualizar las variables siguientes en el código: host, region, path y 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' # the Elasticsearch 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/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 snapshots (all indices) # # path = '_snapshot/my-snapshot-repo/my-snapshot/_restore' # url = host + path # # r = requests.post(url, auth=awsauth) # # print(r.text) # # # Restore snapshot (one index) # # path = '_snapshot/my-snapshot-repo/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)

Toma de instantáneas manuales

Las instantáneas no son inmediatas; tardan un tiempo en completarse y no representan vistas perfectas de un punto en el tiempo del clúster. Mientras que una instantánea está en curso, puede indexar los documentos y realizar otras solicitudes al clúster, pero los nuevos documentos (y las actualizaciones de los existentes) no suelen estar incluidos en la instantánea. La instantánea incluye particiones principales que existían cuando Elasticsearch inició la instantánea. En función del tamaño del grupo de subprocesos de la instantánea, se podrían incluir diferentes particiones en la instantánea a horas ligeramente diferentes.

Las instantáneas de Elasticsearch son incrementales, lo que significa que solo se almacenan los datos que ha cambiado desde la última instantánea correcta. Esta naturaleza incremental significa que la diferencia en el uso de disco entre instantáneas frecuentes e infrecuentes suele ser mínimo. En otras palabras, tomar instantáneas cada hora durante una semana (lo que equivale a un total de 168 instantáneas) no usaría mucho más espacio en disco que una sola instantánea al final de la semana. Además, cuanto mayor sea la frecuencia con la que toma las instantáneas, menor será el tiempo que lleve completarse. Algunos usuarios de Elasticsearch toman instantáneas cada media hora.

Debe especificar dos datos al crear una instantánea:

  • Nombre del repositorio de instantáneas

  • Nombre de la instantánea

En los ejemplos que aparecen en este capítulo, se utiliza curl, un cliente HTTP común, por motivos de comodidad y brevedad. Si sus políticas de acceso especifican roles o usuarios de IAM, debe firmar las solicitudes de instantánea. Puede utilizar los ejemplos comentados en el cliente Python de ejemplo para realizar solicitudes HTTP firmadas para los mismos puntos de enlace que utilizan los comandos curl.

Para tomar una instantánea manualmente

  1. No puede tomar una instantánea si hay alguna en curso. Para comprobarlo, ejecute el siguiente comando:

    curl -XGET 'elasticsearch-domain-endpoint/_snapshot/_status'
  2. Ejecute el siguiente comando para tomar manualmente una instantánea:

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

nota

El tiempo necesario para tomar una instantánea aumenta proporcionalmente al tamaño del dominio de Amazon ES. Cuando una operación de instantánea tarda mucho tiempo en ejecutarse, en ocasiones se genera el siguiente error: 504 GATEWAY_TIMEOUT. Normalmente, puede hacer caso omiso de este error y esperar a que la operación se complete correctamente. Utilice el siguiente comando para comprobar el estado de todas las instantáneas del dominio:

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

Restauración de snapshots

aviso

Si utiliza alias de índice, detenga las solicitudes de escritura a un alias (o cambie el alias a otro índice) antes de borrar este índice. Al detener las solicitudes de escritura ayuda a evitar la siguiente situación:

  1. Elimina un índice, de modo que también elimina su alias.

  2. Una solicitud de escritura errante al alias que se ha eliminado crea un nuevo índice con el mismo nombre que el alias.

  3. Ya no puede usar el alias debido a un conflicto de nombres con el nuevo índice.

Si ha cambiado el alias a otro índice, especifique "include_aliases": false al realizar la restauración a partir de una instantánea.

Para restablecer una instantánea

  1. Identifique la instantánea que desea restaurar. Para ver todos los repositorios de instantáneas, ejecute el siguiente comando:

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

    Cuando identifique el repositorio, ejecute el siguiente comando para ver todas las instantáneas:

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

    nota

    La mayoría de las instantáneas automatizadas se almacenan en el repositorio cs-automated. Si su dominio cifra los datos en reposo, se almacenan en el repositorio cs-automated-enc. Si no ve el repositorio de instantáneas manuales que busca, asegúrese de que lo ha registrado en el dominio.

  2. (Opcional) Elimine todos los índices abiertos del dominio de Amazon ES o cámbieles el nombre. No es necesario realizar este paso si no tiene conflictos de nomenclatura entre índices en el clúster e índices en la instantánea.

    No puede restaurar una instantánea de sus índices a un clúster de Elasticsearch que ya contenga índices con los mismos nombres. En la actualidad, Amazon ES no admite la API _close de Elasticsearch. Por consiguiente, debe usar una de las siguientes alternativas:

    En el siguiente ejemplo se muestra cómo eliminar todos los índices existentes en un dominio:

    curl -XDELETE 'elasticsearch-domain-endpoint/_all'

    Sin embargo, si no piensa restaurar todos los índices, es posible que solo desee eliminar uno:

    curl -XDELETE 'elasticsearch-domain-endpoint/index-name'
  3. Para restaurar una instantánea, ejecute el siguiente comando:

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

    Debido a los permisos especiales del índice .kibana, los intentos de restaurar todos los índices pueden fallar, especialmente si se intenta restaurar a partir de una instantánea automatizada. En el siguiente ejemplo se restaura un solo índice, my-index, a partir de 2017-snapshot desde el repositorio de instantáneas cs-automated:

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

    Es posible que también desee restaurar todos los índices, excepto el índice .kibana:

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

nota

Si no estuviesen disponibles todas las particiones principales para los índices implicados, una instantánea podría tener el state PARTIAL. Este valor indica que los datos de al menos una partición no se han almacenado correctamente. Puede seguir restaurando a partir de una instantánea parcial, pero es posible que necesite utilizar instantáneas anteriores para restaurar los índices que falten.