Trabalhar com snapshots de índice do Amazon Elasticsearch Service - Amazon Elasticsearch Service

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Trabalhar com snapshots de índice do Amazon Elasticsearch Service

Snapshots são backups de índices e do estado de um cluster. O estado inclui configurações do cluster, informações de nó, configurações de índice e alocação de estilhaços.

No Amazon Elasticsearch Service, os snapshots vêm de duas formas: automatizado e manual.

  • Os snapshots automatizados são apenas para recuperação de cluster. Você pode usá-los para restaurar seu domínio em caso de status de cluster vermelho ou outra perda de dados. O Amazon ES armazena snapshots automatizados em um bucket do Amazon S3 pré-configurado sem custo adicional.

  • Os snapshots manuais são para recuperação de cluster ou movimentação de dados de um cluster para outro. Como o nome sugere, você precisa iniciar os snapshots manuais. Esses snapshots são armazenados no seu próprio bucket do Amazon S3, e cobranças padrão do S3 são aplicáveis. Se você tiver um snapshot de um cluster autogerenciado do Elasticsearch, poderá até usar esse snapshot para migrar para um domínio do Amazon ES.

Todos os domínios do Amazon ES têm snapshots automatizados, mas a frequência é diferente:

  • Para domínios executando o Elasticsearch 5.3 e posterior, Amazon ES tira snapshots automatizados a cada hora e retém até 336 deles por 14 dias.

  • Para domínios executando o Elasticsearch 5.1 e anterior, o Amazon ES tira snapshots automatizados diários (no horário que você especificar) e retém até 14 deles por 30 dias.

Se o cluster entrar no status vermelho, o Amazon ES interromperá a criação de snapshots automatizados. Se você não corrigir o problema dentro de duas semanas, poderá perder permanentemente os dados do cluster. Para obter etapas sobre a solução de problemas, consulte Status de cluster vermelho.

Pré-requisitos do snapshots manuais

Para criar os snapshots manualmente, é necessário trabalhar com o IAM e o Amazon S3. Verifique primeiro se você cumpre os pré-requisitos a seguir antes de tentar criar um snapshot.

Pré-requisito Description (Descrição)
Bucket do S3

Armazena snapshots manuais para o domínio do Amazon ES. Anote o nome do bucket. Você precisará dele em dois locais:

  • Declaração Resource da política do IAM que está anexada à função do IAM

  • Cliente Python usado para registrar um repositório de snapshots

Para obter mais informações, consulte Criar um bucket no Guia de conceitos básicos do Amazon Simple Storage Service.

Importante

Não aplique uma regra de ciclo de vida do S3 Glacier a esse bucket. Os snapshots manuais não são compatíveis com a classe de armazenamento do S3 Glacier.

IAM role (Função do IAM)

Concede permissões ao Amazon Elasticsearch Service. O restante deste capítulo se refere a essa função como TheSnapshotRole.

A relação de confiança da função deve especificar o Amazon Elasticsearch Service na declaração Principal, conforme mostrado no seguinte exemplo:

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

A função deve ter a seguinte politica anexada:

{ "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 obter mais informações, consulte Adicionar e remover permissões de identidade do IAM no Guia do usuário do IAM.

Permissões

É necessário ser capaz de assumir a função TheSnapshotRole para registrar o repositório de snapshots. Você também precisa de acesso à ação es:ESHttpPut. A política a seguir inclui estas permissões:

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

Se não tiver iam:PassRolepermissões para assumir TheSnapshotRole, você poderá encontrar o seguinte erro comum:

$ 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 um repositório de snapshots manuais

Você deve registrar o repositório de snapshots com o Amazon Elasticsearch Service antes de poder fazer snapshots de índices manuais. Esta operação única exige que você assine a solicitação da AWS com credenciais que tenham permissão para acessar TheSnapshotRole, conforme descrito em Pré-requisitos do snapshots manuais.

Você não pode usar curl para executar essa operação porque ele não dá suporte à assinatura de solicitação da AWS. Em vez disso, use o cliente do Python de amostra, Postman, ou outro método para enviar uma solicitação assinada a fim de registrar o repositório de snapshot. O cabeçalho assume a seguinte forma:

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

Registrar um diretório de snapshots é uma operação única, mas para migrar de um domínio para outro, é preciso registrar o repositório de snapshots no domínio antigo e no novo. O nome do repositório é arbitrário.

  • Se você estiver migrando para um novo domínio (ou registrando o mesmo repositório com vários domínios por algum outro motivo), adicione "readonly": true a "settings" ao registrar o repositório no novo domínio. Essa configuração ajuda a evitar a substituição acidental dos dados do domínio antigo.

  • Para habilitar a criptografia no lado do servidor com chaves gerenciadas pelo S3 para o repositório de snapshots, adicione "server_side_encryption": true a "settings".

Se o domínio residir em uma VPC, o computador deverá estar conectado à VPC para que a solicitação registre o repositório de snapshots com êxito. O acesso a uma VPC varia de acordo com a configuração de rede, mas geralmente requer uma conexão com VPN ou rede corporativa. Para saber se você pode entrar no domínio do Amazon ES, navegue até https://your-vpc-domain.region.es.amazonaws.com em um navegador da Web e confira se você recebe a resposta JSON padrão.

Se você usar o controle de acesso minucioso, consulte Snapshots manuais para obter uma etapa adicional.

Cliente de exemplo Python

Salve o código Python de exemplo a seguir como um arquivo Python, como register-repo.py. O cliente requer os pacotes AWS SDK para Python (Boto3), solicitações e requests-aws4auth. O cliente contém exemplos comentados para outras operações de snapshot.

dica

Um exemplo de código baseado em Java está disponível em Assinar solicitações de HTTP.

Você deve atualizar as seguintes variáveis: 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 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 snapshot (all indices except Kibana and fine-grained access control) # # path = '_snapshot/my-snapshot-repo/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/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)

Manual deObtenção de snapshots manuais

Os snapshots não são instantâneos; eles levam tempo para serem concluídos e não representam exibições pontuais perfeitas do cluster. Enquanto um snapshot está em andamento, você ainda pode indexar documentos e fazer outras solicitações ao cluster, mas novos documentos (e atualizações em documentos existentes) geralmente não são incluídos no snapshot. O snapshot inclui estilhaços principais existentes quando Elasticsearch iniciou o snapshot. Dependendo do tamanho do grupo de threads de snapshot, diferentes fragmentos podem ser incluídos no snapshot em momentos um pouco diferentes.

Os snapshots do Elasticsearch são incrementais, o que significa que eles armazenam somente dados que foram alterados desde o último snapshot bem-sucedido. Essa natureza incremental significa que a diferença no uso de disco entre snapshots frequentes e infrequentes normalmente é mínima. Ou seja, criar snapshots por hora por uma semana (em um total de 168 snapshots) pode não usar muito mais espaço em disco do que criar um único snapshot no final da semana. Além disso, quanto maior a frequência da criação de snapshots, menos tempo eles demoram para serem concluídos. Alguns usuários do Elasticsearch criam snapshots a cada meia hora.

Você especifica duas informações ao criar um snapshot:

  • Nome do repositório de snapshots

  • Nome do snapshot

Os exemplos neste capítulo usam curl, um cliente HTTP comum, por conveniência e brevidade. Porém, se as políticas de acesso especificarem usuários ou funções do IAM, você deverá assinar suas solicitações de snapshot. Você pode usar os exemplos comentados no exemplo de cliente Python para fazer solicitações HTTP assinadas para os mesmos endpoints usados pelos comandos curl.

Para obter um snapshot manualmente

  1. Você não poderá obter um snapshot se houver um em andamento no momento. Para verificar, execute o seguinte comando:

    curl -XGET 'elasticsearch-domain-endpoint/_snapshot/_status'
  2. Execute o comando a seguir para obter um snapshot manualmente:

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

O tempo necessário para obter um snapshot aumenta de acordo com o tamanho do domínio do Amazon ES. As operações de snapshot de longa duração, às vezes, encontram o seguinte erro: 504 GATEWAY_TIMEOUT: Normalmente, você pode ignorar esses erros e esperar a conclusão da operação com êxito. Use o comando a seguir para verificar o estado de todos os snapshots de seu domínio:

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

Restauração de snapshots

Atenção

Se você usar aliases de índice, interrompa as solicitações de gravação para um alias (ou mude o alias para outro índice) antes de excluir seu índice. Parar as solicitações de gravação ajuda a evitar o seguinte cenário:

  1. Você exclui um índice, que também exclui seu alias.

  2. Uma solicitação de gravação com erro para o alias recém-excluído cria um novo índice com o mesmo nome do alias.

  3. Você não pode mais usar o alias devido a um conflito de nomes com o novo índice.

Se você alternou o alias para outro índice, especifique "include_aliases": false ao restaurar a partir de um snapshot.

Para restaurar um snapshot

  1. Identifique o snapshot que você deseja restaurar. Para ver todos os repositórios de snapshots, execute o comando a seguir:

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

    Após identificar o repositório, execute o comando a seguir para ver todos os snapshots:

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

    A maioria dos snapshots automatizados é armazenada no repositório cs-automated. Se o seu domínio criptografa dados em repouso, eles são armazenados no repositório cs-automated-enc. Se não encontrar o repositório de snapshots manuais que estava buscando, confirme se você o registrou no domínio.

  2. (Opcional) Exclua ou renomeie um ou mais índices no domínio do Amazon ES. Você não precisa executar esta etapa se você não tiver conflitos de nomenclatura de índices no cluster e de índices no snapshot.

    Você não pode restaurar um snapshot de seus índices para um cluster do Elasticsearch que já contenha índices com os mesmos nomes. No momento, o Amazon ES não é compatível com a API _close do Elasticsearch. Por isso, você deve usar uma das seguintes alternativas:

    O exemplo a seguir mostra como excluir todos os índices existentes de um domínio:

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

    Se você não planeja restaurar todos os índices, talvez você queira excluir apenas um:

    curl -XDELETE 'elasticsearch-domain-endpoint/index-name'
  3. Para restaurar um snapshot, execute o seguinte comando:

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

    Devido a permissões especiais no Kibana e índices de controle de acesso minucioso, as tentativas de restaurar todos os índices podem falhar, especialmente se você tentar restaurar a partir de um snapshot automatizado. O exemplo a seguir restaura apenas um índice my-index de 2017-snapshot no repositório de snapshots cs-automated:

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

    Como alternativa, você pode querer restaurar todos os índices, exceto para o Kibana e os índices de controle de acesso minucioso:

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

Se nem todos os estilhaços principais estiverem disponíveis para os índices envolvidos, um snapshot poderá ter um state de PARTIAL. Esse valor indica que os dados de pelo menos um estilhaço não foram armazenados com êxito. Ainda assim é possível restaurar por meio de um snapshot parcial, mas pode ser necessário usar snapshots mais antigos para restaurar índices ausentes.

Excluir snapshots manuais

Para excluir um snapshot manual, envie a seguinte solicitação:

DELETE _snapshot/repository/snapshot

Usar o curador para snapshots

Para alguns usuários, ferramentas como o Curator são convenientes para gerenciamento de índices e snapshots. Use o pip para instalar o Curator:

pip install elasticsearch-curator

O Curator oferece funcionalidade avançada de filtragem que pode ajudar a simplificar as tarefas de gerenciamento em clusters complexos. O Amazon ES é compatível com o Curator em domínios que executam o Elasticsearch versão 5.1 e posterior. Você pode usar o Curator como uma interface de linha de comando (CLI) ou API do Python. Se você usar a CLI, exporte suas credenciais na linha de comando e configure o curator.yml da seguinte maneira:

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 as funções de exemplo do Lambda que usam a API do Python, consulte Uso do Curator para girar dados no Amazon Elasticsearch Service.