Uso do Curator para girar dados no 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á.

Uso do Curator para girar dados no Amazon Elasticsearch Service

Esta seção contém um código de exemplo para usar o AWS Lambda e o Curator para gerenciar índices e snapshots. O Curator oferece vários filtros para ajudá-lo a identificar índices e snapshots que atendam a determinados critérios, como índices criados há mais de 60 dias ou snapshots que não foram concluídos. O Gerenciamento de estados de índice tem alguns recursos semelhantes e não requer o Lambda ou uma instância do EC2 separada. Dependendo do seu caso de uso, pode ser uma escolha melhor.

Embora o Curator seja normalmente usado como uma interface de linha de comando (CLI), ele também apresenta uma API Python, o que significa que você pode usá-la em funções do Lambda. Para obter instruções de instalação, consulte Usar o curador para snapshots.

Para obter mais informações sobre como configurar as funções do Lambda e criar pacotes de implantação, consulte Carregamento de dados em streaming no Amazon ES por meio do Amazon S3. Para obter ainda mais informações, consulte AWS Lambda Developer Guide. Esta seção contém apenas o código de exemplo, as configurações básicas, os triggers e as permissões.

Código de exemplo

O código de exemplo a seguir usa o Curator e o elasticsearch-py para excluir qualquer índice cujo nome contenha um time stamp indicando que os dados têm mais de 30 dias. Por exemplo, se um nome de índice for my-logs-2014.03.02, o índice será excluído. A exclusão ocorre mesmo que você crie o índice hoje, pois esse filtro usa o nome do índice para determinar a idade.

O código também contém alguns exemplos comentados de outros filtros comuns, incluindo um que determina a idade por data de criação. O AWS SDK para Python (Boto3) e a biblioteca requests-aws4auth assinam as solicitações para o Amazon ES.

Atenção

Ambos os exemplos de código nesta seção excluem dados — potencialmente uma grande quantidade deles. Modifique e teste cada amostra em um domínio não crítico até que você esteja satisfeito com seu comportamento.

Exclusão de índice

import boto3 from requests_aws4auth import AWS4Auth from elasticsearch import Elasticsearch, RequestsHttpConnection import curator host = '' # For example, search-my-domain.region.es.amazonaws.com region = '' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Lambda execution starts here. def lambda_handler(event, context): # Build the Elasticsearch client. es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection ) # A test document. document = { "title": "Moneyball", "director": "Bennett Miller", "year": "2011" } # Index the test document so that we have an index that matches the timestring pattern. # You can delete this line and the test document if you already created some test indices. es.index(index="movies-2017.01.31", doc_type="movie", id="1", body=document) index_list = curator.IndexList(es) # Filters by age, anything with a time stamp older than 30 days in the index name. index_list.filter_by_age(source='name', direction='older', timestring='%Y.%m.%d', unit='days', unit_count=30) # Filters by naming prefix. # index_list.filter_by_regex(kind='prefix', value='my-logs-2017') # Filters by age, anything created more than one month ago. # index_list.filter_by_age(source='creation_date', direction='older', unit='months', unit_count=1) print("Found %s indices to delete" % len(index_list.indices)) # If our filtered list contains any indices, delete them. if index_list.indices: curator.DeleteIndices(index_list).do_action()

Você deve atualizar os valores para host e region.

O próximo exemplo de código excluirá qualquer snapshot que tenha mais de duas semanas. Ele também captura um novo snapshot.

Exclusão de snapshot

import boto3 from datetime import datetime from requests_aws4auth import AWS4Auth from elasticsearch import Elasticsearch, RequestsHttpConnection import logging import curator # Adding a logger isn't strictly required, but helps with understanding Curator's requests and debugging. logger = logging.getLogger('curator') logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.INFO) host = '' # For example, search-my-domain.region.es.amazonaws.com region = '' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) repository_name = 'my-repo' # Lambda execution starts here. def lambda_handler(event, context): now = datetime.now() # Clunky, but this approach keeps colons out of the URL. date_string = '-'.join((str(now.year), str(now.month), str(now.day), str(now.hour), str(now.minute))) snapshot_name = 'my-snapshot-prefix-' + date_string # Build the Elasticsearch client. es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection, timeout = 120 # Deleting snapshots can take a while, so keep the connection open for long enough to get a response. ) try: # Get all snapshots in the repository. snapshot_list = curator.SnapshotList(es, repository=repository_name) # Filter by age, any snapshot older than two weeks. # snapshot_list.filter_by_age(source='creation_date', direction='older', unit='weeks', unit_count=2) # Delete the old snapshots. curator.DeleteSnapshots(snapshot_list, retry_interval=30, retry_count=3).do_action() except (curator.exceptions.SnapshotInProgress, curator.exceptions.NoSnapshots, curator.exceptions.FailedExecution) as e: print(e) # Split into two try blocks. We still want to try and take a snapshot if deletion failed. try: # Get the list of indices. # You can filter this list if you didn't want to snapshot all indices. index_list = curator.IndexList(es) # Take a new snapshot. This operation can take a while, so we don't want to wait for it to complete. curator.Snapshot(index_list, repository=repository_name, name=snapshot_name, wait_for_completion=False).do_action() except (curator.exceptions.SnapshotInProgress, curator.exceptions.FailedExecution) as e: print(e)

Você deve atualizar os valores para host, region, snapshot_name e repository_name. Se a saída for muito detalhada para suas necessidades, você poderá alterar logging.INFO para logging.WARN.

Como capturar e excluir snapshots pode ser um pouco demorado, esse código é mais sensível à conexão e a limitações de tempo do Lambda — assim como código de registro adicional. No cliente Elasticsearch, você pode ver se vamos definir esse tempo limite para 120 segundos. Se a função DeleteSnapshots levar mais tempo para obter uma resposta do domínio do Amazon ES, pode ser necessário aumentar esse valor. Você também deve aumentar o tempo limite da função do Lambda de seu valor padrão de três segundos. Para um valor recomendado, consulte Configurações básicas.

Configurações básicas

Recomendamos as seguintes configurações para esses códigos de exemplo.

Código de exemplo Memória Tempo limite
Exclusão de índice 128 MB 10 segundos
Exclusão de snapshot 128 MB 3 minutos

Triggers

Em vez de reagir a algum evento (como um arquivo carregado para o Amazon S3), essas funções devem ser programadas. Você pode preferir executar essas funções com mais ou menos frequência.

Código de exemplo Serviço Tipo de regra Expressão de exemplo
Exclusão de índice Eventos do CloudWatch Expressão de programação rate(1 day)
Exclusão de snapshot Eventos do CloudWatch Expressão de programação rate(4 hours)

Permissions

Ambas as funções do Lambda nesta seção precisam de permissões básicas de registro em log das quais todas as funções do Lambda precisam, além de permissões do método HTTP para o domínio do Amazon ES:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-west-1:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-west-1:123456789012:log-group:/aws/lambda/your-lambda-function:*" ] }, { "Effect": "Allow", "Action": [ "es:ESHttpPost", "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpDelete" ], "Resource": "arn:aws:es:us-west-1:123456789012:domain/my-domain/*" } ] }