Revisando temas, me encontré con la necesidad de migrar un ElasticSearch en AWS, pero claro necesitaba hacer un backup y luego poder restaurarlo para no perder información.

Pues esto me pareció un poco tedioso y googleando encontre la solucion que os comparto.

Primero para hacer un backup sobre ElasticSearch de AWS se debe registrar un repositorio de backup como hablamos de AWs , que mejor repositorio que S3.

Pues bien antes de registrar el repositorio de S3 debemos crear el siguiente role iam con este trust relationships

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

Luego como política añadiremos esto

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

Después de crear este role para registrar el bucket s3 como repositorio de snapshot se debe crear este pequeño script en python para realizar la petición autenticada a el ES de AWs

from boto.connection import AWSAuthConnection
 
class ESConnection(AWSAuthConnection):
 
    def __init__(self, region, **kwargs):
        super(ESConnection, self).__init__(**kwargs)
        self._set_auth_region_name(region)
        self._set_auth_service_name("es")
 
    def _required_auth_capability(self):
        return ['hmac-v4']
 
if __name__ == "__main__":
 
    client = ESConnection(
            region='eu-west-1',
            host='AWS ES',
            is_secure=False)
 
    print 'Registering Snapshot Repository'
    resp = client.make_request(method='PUT',
            path='/_snapshot/fake-repo',
            data='{"type": "s3","settings": { "bucket": "fake-bucket","region": "eu-west-1","role_arn": "role arn anterior creado"}}')
    body = resp.read()
    print body

En este script se debe rellenar el bucket y el host así como el role arn que previamente hemos creado, también hay que tener en cuenta que el script se debe lanzar con credenciales de AWS, por lo que os recomiendo utilizar una instancia con role ec2 o desde vuestro local pasandole el profile por variable de entorno para no hardcodear credenciales.

Una vez ejecutado el script podemos comprobar si se ha registrado el repositorio con este curl

curl -XGET https://"tu endpoint ES"/_snapshot?pretty

Y veremos algo de este estilo

{
  "fake-repo" : {
    "type" : "s3",
    "settings" : {
      "bucket" : "fake-bucket",
      "region" : "eu-west-1",
      "role_arn" : "arn:aws:iam::11111111111:role/fake-role"
    }
}

Pues ya teniendo registrado el bucket como repositorio de snapshot podemos pasar a crear un backup de nuestro AWS ES, para eso lanzamos el siguiente curl

curl -XPUT 'https://"tu endpoint ES"/_snapshot/fake-bucket/fake-snapshot?wait_for_completion=true'

Para comprobar que se hizo bien el snapshot podemos comprobarlo mediante este curl

curl -XGET https://"tu endpoint ES"/_snapshot/fake-repo/_all?pretty

y veremos algo así

{
  "snapshots" : [ {
    "snapshot" : "fake-snapshot",
    "version_id" : 99999,
    "version" : "2.3.2",
    "indices" : [ ".kibana-4", "fake-index", "fake-index" ],
    "state" : "SUCCESS",
    "start_time" : "2018-02-21T11:42:03.809Z",
    "start_time_in_millis" : 999999,
    "end_time" : "2018-02-21T11:42:13.512Z",
    "end_time_in_millis" : 999999,
    "duration_in_millis" : 99999,
    "failures" : [ ],
    "shards" : {
      "total" : 11,
      "failed" : 0,
      "successful" : 11
    }

Pues si nos fijamos en el estado

"state" : "SUCCESS",

siempre este success ya deberiamos tener nuestro snapshot de los indices, pues bien ahora para restaurarlo, procederemos con este curl

curl -XPOST 'https://"tu endpoint ES"/_snapshot/fake-repo/fake-snapshot/_restore

Pues con esto podriamos hacer una migración de un ElasticSearch a otro u hacer nuestro propios backup manuales, para hacer despliegues.

Espero que os ayude

Deja un comentario