Revista Tecnología

Cómo crear snapshots de Elasticsearch en S3

Publicado el 19 febrero 2018 por Dbigcloud @dbigcloud

Elasticsearch es un servidor utilizado como motor de búsquedas de texto completo, ya que es capaz de ofrecer resultados en milésimas de segundo. Almacenar grandes cantidades de información es muy común a la hora de usar este servicio. Por este motivo, vamos a ver cómo realizar copias de seguridad de los índices almacenados en Elasticsearch en un repositorio creado en un bucket de S3.

aws elasticsearch snapshots


Datos, datos y más datos. Hoy en día, las empresas manejan grandes volúmenes de información. Mantener copias de seguridad de estos datos es muy importante; por eso, es necesario escoger una buena herramienta de backups que ofrezca seguridad a la hora de recuperar dicha información.

Utilizar software de terceros para centralizar las copias de seguridad es una buena práctica, pero a veces se olvida usar las herramientas que el propio software, que se está usando, trae. Elasticsearch dispone de un plugin que permite configurar un repositorio para almacenar snapshots en el servicio S3 de AWS.

Para la configuración del repositorio me voy a basar en el servicio de Elasticsearch de AWS, que es el que empleo en producción y que además ya dispone del plugin S3 Repository integrado. Para el que necesite realizar la instalación, podéis consultar la documentación oficial.


Requisitos previos:
  • Saber crear un bucket en S3.
  • Crear una IAM policy.
  • Asignar a un IAM rol a una policy.

Cómo configurar un repositorio para almacenar snapshots de Elasticsearch en S3

Cónfiguración de permisos: 
aws iam
  • Creación del bucket de S3.  En mi caso dispongo del bucket dbigcloud-backups y dentro voy a crear la "carpeta" repositorio-es.
  • Ahora, necesitamos crear una policy para que el servicio de Elasticsearch pueda escribir en el bucket de S3. Por ejemplo, con el nombre S3_ES_backups.

{

"Version":"2012-10-17",
"Statement": [
{
"Action": [ "s3:ListBucket" ],
"Effect": "Allow",
"Resource": [ "arn:aws:s3:::dbigcloud-backups" ]
},
{ "Action": [ "s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"iam:PassRole"],
"Effect": "Allow",
"Resource": [ "arn:aws:s3:::dbigcloud-backups/repositorio-es/*" ] }
]

}

Es muy importante asegurarse de que escribimos correctamente el nombre del ARN del bucket. Si observáis bien la policy, comprobaréis que se le da el permiso iam:PassRole.  Esto es debido a que estamos usando dos servicios de AWS distintos. 

  • Lo siguiente es asignar la policy a un rol. Vamos a utilizar el CLI de AWS a través de una consola de comandos para crearlo. Aunque se puede realizar a través de la consola de AWS.
    aws iam create-role --role-name es-s3-snapshots --assume-role-policy-document '{"Version": "2012-10-17", "Statement": [{"Sid": "", "Effect": "Allow", "Principal": {"Service": "es.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
    Si se va a usar la consola de AWS hay que asegurarse de que se crea una relación de confianza con el servicio de Elasticsearch.
    IAM trust relationship Elasticsearch
    Y para finalizar con el apartado de permisos, añadimos la policy que hemos creado anteriormente al rol.
    iam policy role Elasticsearch AWS


Y de esta forma, ya tenemos preparado los permisos que se necesitan para poder configurar el repositorio.


Configuración del repositorio:

elasticsearch s3 aws

El servicio de Elasticsearch de AWS necesita que las peticiones enviadas estén firmadas de la forma AWS SigV4, por lo que no podemos usar Kibana para realizar la configuración del repositorio. Existe un proxy que nos permite enviar estas peticiones de forma sencilla y transparente. Aquí podéis seguir las instrucciones de instalación que aparecen en el repositorio aws-es-proxy.

Por último, vamos a realizar la configuración del repositorio utilizando el proxy mencionado anteriormente. Para ello, vamos a ejecutar en una consola de comandos lo siguiente:

curl -XPUT 'https://localhost:9200/_snapshot/dbigcloud-repository' -d'{"type": "s3", "settings": {"bucket": "dbigcloud-backups", "base_path":"repositorio-es", "region": "eu-west-1", "role_arn": "arn:aws:iam::XXXxxXXxxXXX:role/es-s3-snapshots"}}'

Fijémonos bien en los parámetros bucket y base_path: el primero es el nombre principal del bucket y el segundo la ruta dentro del bucket. De esta forma hemos creado un repositorio en S3 en el que poder almacenar los snapshops manuales que realicemos. 

Para crear el primer snapshot de un índice, por ejemplo uno llamado dbigcloud, lo haríamos con el siguiente comando:

curl -XPUT localhost:9200/_snapshot/dbigcloud-repository/snapshot_1 { "indices": "dbigcloud", "ignore_unavailable": true, "include_global_state": false } 

Recordad que también podéis configurar S3 junto con Glacier y si disponéis en vuestro datacenter de almacenamiento o solución de backup, se puede integrar con Storage Gateway.

elasticsearch datacenter aws


En el siguiente post veremos cómo migrar de Elasticsearch 5.x a 6.x gracias a los snapshots que hemos configurado. Si queréis seguir profundizando más sobre Elasticsearch tenéis a vuestra disposición el blog de AWS.


Compártelo:


Volver a la Portada de Logo Paperblog

Revista