Criação de snapshots de índices no Amazon OpenSearch Service - Amazon OpenSearch Service

Criação de snapshots de índices no Amazon OpenSearch Service

Snapshots no Amazon OpenSearch Service são backups dos í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 fragmentos.

Os snapshots do OpenSearch Service podem estar nos seguintes formatos:

  • 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 perda de dados. Para obter mais informações, consulte Restauração de snapshots abaixo. O OpenSearch Service armazena snapshots automatizados em um bucket do Amazon S3 do pré-configurado sem custo adicional.

  • Os snapshots manuais são usados na recuperação de clusters ou na movimentação de dados de um cluster para outro. 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 OpenSearch, poderá até usar esse snapshot para migrar para um domínio do OpenSearch Service. Para obter mais informações, consulte Migração para o Amazon OpenSearch Service.

Todos os domínios do OpenSearch Service têm snapshots automatizados, mas a frequência apresenta as seguintes diferenças:

  • Para domínios executando o OpenSearch ou Elasticsearch 5.3 ou posterior, o OpenSearch Service obtém snapshots automatizados a cada hora e retém até 336 deles por 14 dias. Os snapshots por hora são menos disruptivos em função de sua natureza incremental. Eles também fornecem um ponto de recuperação mais recente, caso haja problemas em domínios.

  • Para domínios executando o Elasticsearch 5.1 ou anterior, o OpenSearch Service obtém snapshots automatizados diários no horário especificado por você e retém até 14 deles, mas não retém nenhum dado de snapshot por mais de 30 dias.

Se o cluster entrar no status vermelho, todos os snapshots automatizados falharão enquanto o status do cluster persistir. Se você não corrigir o problema em até 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

Para criar os snapshots manualmente, é necessário trabalhar com o IAM e o Amazon S3. Verifique se você atende aos seguintes pré-requisitos antes de tentar criar um snapshot:

Pré-requisito Descrição
S3 bucket

Crie um bucket do S3 para armazenar snapshots manuais para o domínio do OpenSearch Service. Para obter mais informações, consulte Create a Bucket (Criar um bucket) no Manual do usuário do Amazon Simple Storage Service.

Lembre-se do nome do bucket para usá-lo nos seguintes locais:

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

  • O cliente Python usado para registrar um repositório de snapshots (se você usa esse método)

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)

Crie uma função do IAM para delegar permissões ao OpenSearch Service. Para obter instruções, consulte Criação de funções do IAM (console) no Manual do usuário do IAM. O restante deste capítulo se refere a essa função como TheSnapshotRole.

Anexar uma política do IAM

Anexe a política a seguir ao TheSnapshotRole para permitir acesso ao bucket do 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/*" ] } ] }

Para obter instruções de como associar uma política gerenciada a uma função, consulte Adição de permissões de identidade do IAM no Manual do usuário do IAM.

Editar a relação de confiança

Edite a relação de confiança de TheSnapshotRole para especificar o OpenSearch Service na instrução Principal conforme mostrado no exemplo a seguir:

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

Recomendamos o uso das chaves de condição aws:SourceAccount e aws:SourceArn para se proteger contra o problema confused deputy. A conta de origem é o proprietário do domínio e o ARN de origem é o ARN do domínio. Para adicionar essas chaves de condição, o seu domínio deve estar no software de serviço R20211203 ou superior.

Por exemplo, você poderia adicionar o bloco de condições a seguir na política de confiança:

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

Para obter instruções de como editar a relação de confiança, consulte Modificação da política de confiança de uma função no Manual do usuário do IAM.

Permissões

Para registrar o repositório de snapshots, você precisa ser capaz de passar TheSnapshotRole para o OpenSearch Service. Você também precisa de acesso à ação es:ESHttpPut. Para conceder ambas as permissões, anexe a seguinte política ao usuário ou função do IAM cujas credenciais estão sendo usadas para assinar a solicitação:

{ "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 seu usuário ou função não tiver permissões iam:PassRole para passar TheSnapshotRole, talvez você encontre o seguinte erro comum ao tentar registrar um repositório na próxima etapa:

$ 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 OpenSearch 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 têm permissão para acessar TheSnapshotRole, conforme descrito em Pré-requisitos.

Etapa 1: Mapear a função de snapshot no OpenSearch Dashboards (se estiver usando um controle de acesso refinado)

O controle de acesso refinado introduz uma etapa adicional ao registrar um repositório. Mesmo se você usar a autenticação básica HTTP para todos os outros fins, será necessário mapear a função manage_snapshots em seu usuário ou função do IAM que tem permissões iam:PassRole para passar TheSnapshotRole.

  1. Navegue até o plugin OpenSearch Dashboards para seu domínio do OpenSearch Service. Você pode encontrar o endpoint do Dashboards no painel do seu domínio no console do OpenSearch Service.

  2. No menu principal, escolha Security (Segurança), Roles (Funções) e selecione a função manage_snapshots.

  3. Escolha Mapped users (Usuários mapeados) e Manage mapping (Gerenciar mapeamento).

  4. Adicione o ARN do domínio do usuário ou função que tem permissões para passar TheSnapshotRole. Coloque ARNs de usuário em Users (Usuários) e ARNs de funções em Backend roles (Funções de backend).

    arn:aws:iam::123456789123:user/user-name
    arn:aws:iam::123456789123:role/role-name
  5. Selecione Map (Mapa) e confirme se o usuário ou função aparece em Mapped users (Usuários mapeados).

Etapa 2: Registrar um repositório

Para registrar um repositório de snapshots, envie uma solicitação PUT para o endpoint do domínio do OpenSearch Service. Você não pode usar curl para executar essa operação porque ele não comporta a assinatura de solicitações 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 o seguinte 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

Os nomes dos repositórios não podem começar com “cs-”.

Se o domínio residir em uma nuvem privada virtual (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 alcançar o domínio do OpenSearch Service, 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.

Criptografia de repositórios de snapshots

No momento, você não pode usar chaves do AWS Key Management Service (KMS) para criptografar snapshots manuais, mas pode protegê-los usando criptografia no lado do servidor (SSE).

Para habilitar a SSE com chaves gerenciadas pelo S3 para o bucket que você usa como repositório de snapshots, adicione "server_side_encryption": true ao bloco "settings" da solicitação PUT. Para obter mais informações, consulte Proteção de dados usando criptografia no lado do servidor com chaves de criptografia gerenciadas pelo Amazon S3 no Manual do usuário do Amazon Simple Storage Service.

Você também pode usar chaves do AWS KMS para criptografia no lado do servidor no bucket do S3 que utiliza como repositório de snapshots. Se você usar essa abordagem, certifique-se de fornecer a permissão TheSnapshotRole para a chave do AWS KMS usada para criptografar o bucket do S3. Para obter mais informações, consulte Usar políticas de chaves no AWS KMS.

Migração de dados para um domínio diferente

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

Considere as seguintes diretrizes ao migrar para um novo domínio ou registrar o mesmo repositório com vários domínios por algum outro motivo:

  • Ao registrar o repositório no novo domínio, adicione "readonly": true para o bloco "settings" da solicitação PUT. Essa configuração impede que você sobrescreva acidentalmente dados do domínio antigo.

  • Se estiver migrando dados para um domínio em uma região diferente (por exemplo, de um domínio antigo e um bucket localizado em us-east-2 para um novo domínio em us-west-2), você poderá ver este erro 500 ao enviar a solicitação PUT:

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

    Se você encontrar esse erro, experimente substituir "region": "us-east-2" por "endpoint": "s3.amazonaws.com" na instrução PUT e repita a solicitação.

Uso do cliente Python de exemplo

O cliente Python é mais fácil de automatizar do que uma simples solicitação HTTP, além de ser mais fácil reutilizá-lo. Se você optar por usar esse método para registrar um repositório de snapshots, salve o seguinte código de exemplo Python como um arquivo Python. Por exemplo, register-repo.py. O cliente exige os pacotes AWS SDK for Python (Boto3), requests e requests-aws4auth. O cliente contém exemplos comentados para outras operações de snapshot.

dica

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

Atualize as seguintes variáveis no código de exemplo: 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)

Obtenção manual de snapshots

Os snapshots não são instantâneos. Eles levam tempo para ser 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 os fragmentos primários que já existiam quando o snapshot foi iniciado. Dependendo do tamanho do grupo de threads de snapshot, diferentes fragmentos podem ser incluídos no snapshot em momentos um pouco diferentes.

Armazenamento e performance de snapshots

Os snapshots do OpenSearch são incrementais, o que significa que eles armazenam somente os 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. Por exemplo, snapshots diários podem levar de 20 a 30 minutos para serem concluídos, enquanto os snapshots por hora podem ser concluídos em poucos minutos. Alguns usuários do OpenSearch obtêm snapshots até mesmo a cada meia hora.

Criar um snapshot

Ao criar um snapshot, você especifica as seguintes informações:

  • O nome do repositório de snapshots

  • Um nome para o snapshot

Os exemplos neste capítulo usam curl, um cliente HTTP comum, por conveniência e brevidade. No entanto, 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 manual, faça o seguinte:

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

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

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

O tempo necessário para obter um snapshot aumenta de acordo com o tamanho do domínio do OpenSearch Service. 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 até que a operação seja concluída com êxito. Execute o comando a seguir para verificar o estado de todos os snapshots de seu domínio:

curl -XGET 'domain-endpoint/_snapshot/repository-name/_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, faça o seguinte:

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

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

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

    curl -XGET 'domain-endpoint/_snapshot/repository-name/_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 OpenSearch Service se você tiver conflitos de nomenclatura de índices no cluster e de índices no snapshot. Não é possível restaurar um snapshot de seus índices para um cluster do OpenSearch que já contenha índices com os mesmos nomes.

    Você terá as seguintes opções em caso de conflitos de nomenclatura de índice:

    O seguinte comando exclui todos os índices existentes em um domínio:

    curl -XDELETE 'domain-endpoint/_all'

    No entanto, se você não planeja restaurar todos os índices, pode simplesmente excluir um:

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

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

    Devido a permissões especiais no OpenSearch Dashboards e índices de controle de acesso refinado, as tentativas de restaurar todos os índices podem falhar, especialmente se você tentar fazer a restauração em um snapshot automatizado. O exemplo a seguir restaura apenas um índice my-index de 2020-snapshot no repositório de snapshots cs-automated:

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

    Como alternativa, você pode restaurar todos os índices, exceto os índices de controle de acesso refinado e o Dashboards:

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

Se nem todos os fragmentos principais estiverem disponíveis para os índices envolvidos, o state do snapshot poderá ser PARTIAL. Esse valor indica que os dados de pelo menos um fragmento 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, execute o seguinte comando:

DELETE _snapshot/repository-name/snapshot-name

Automação de snapshots com o Gerenciamento de estados de índices

Você pode usar a operação snapshot do Gerenciamento de estados de índices (ISM) para acionar automaticamente instantâneos de índices com base em alterações em sua idade, tamanho ou número de documentos. Para obter um exemplo de política do ISM usando a operação snapshot, consulte Políticas de exemplo.

Uso do Curator para snapshots

Se o ISM não funcionar para o gerenciamento de índices e snapshots, você poderá usar o Curator. Ele oferece funcionalidade de filtragem avançada que pode ajudar a simplificar tarefas de gerenciamento em clusters complexos. Use o pip para instalar o Curator:

pip install elasticsearch-curator

Você pode usar o Curator como uma interface de linha de comando (CLI) ou API do Python. Se você usar a API do Python, deverá usar a versão 7.13.4 ou anterior do cliente elasticsearch-py herdado. Ele não oferece suporte a um cliente opensearch-py.

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