AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Como faço para criar e agendar snapshots manuais no OpenSearch Service?
Quero criar um snapshot manual do meu domínio do Amazon OpenSearch Service. Também quero executar automaticamente o snapshot de forma recorrente.
Breve descrição
Para criar um snapshot manual do seu domínio do OpenSearch Service, configure um bucket do Amazon Simple Storage Service (Amazon S3) para armazenar os dados do snapshot. Em seguida, registre o bucket do S3 como um repositório de snapshots. Por fim, use o repositório registrado para criar snapshots manuais. Também é possível usar o OpenSearch Dashboards para tirar um snapshot com o repositório registrado.
Para agendar automaticamente snapshots manuais no OpenSearch 2.1+, use uma política de snapshots. Para versões anteriores do OpenSearch, use uma função do AWS Lambda com o Agendador do Amazon EventBridge.
Resolução
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Pré-requisitos:
- Seu domínio executa o OpenSearch 1.0+.
- A política do AWS Identity and Access Management (AWS IAM) do seu usuário ou perfil tem as permissões CreateBucket e PutBucketPolicy que são necessárias para gerenciar o bucket.
- A política do IAM do seu usuário ou perfil tem a permissão IAMFullAccess necessária para criar uma política e um perfil do IAM.
- A política do IAM do seu usuário ou perfil tem a permissão ESHttpPut necessária para registrar o repositório.
Configure um bucket do S3
Conclua as etapas a seguir:
-
Crie um novo bucket na mesma região da AWS do seu domínio do OpenSearch Service.
-
Use o console do IAM ou a AWS CLI para criar uma política do IAM que conceda as permissões necessárias para acessar o bucket do S3.
Exemplo de política:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::your-bucket-name" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "iam:PassRole" ], "Resource": [ "arn:aws:s3:::your-bucket-name/*" ] } ] }Observação: substitua your-bucket-name pelo nome do seu bucket.
-
Use o console do IAM ou a AWS CLI para criar um perfil do IAM para o OpenSearch Service.
O exemplo de comando create-role a seguir cria um perfil chamado TheSnapshotRole e anexa uma política de confiança ao perfil:aws iam create-role --role-name TheSnapshotRole --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "opensearchservice.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }' -
Use o console do IAM ou a AWS CLI para anexar a política de acesso do Amazon S3 ao perfil.
-
Use o console do IAM ou a AWS CLI para criar uma política com permissões iam:PassRole.
Exemplo de política:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/TheSnapshotRole" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "arn:aws:es:region:account-id:domain/domain-name/*" } ] }Observação: substitua account-id pelo ID da sua conta da AWS, region pela sua região e domain-name pelo seu nome de domínio do OpenSearch Service.
-
Execute o seguinte comando attach-user-policy para anexar a política iam:PassRole ao usuário do IAM que você configurou para usar a AWS CLI:
aws iam attach-user-policy --user-name YOUR_IAMUSERNAME --policy-arn arn:aws:iam::account-id:policy/PassRolePolicyObservação: substitua YOUR_IAMUSERNAME pelo nome de usuário e account-id pelo ID da sua conta.
Registre o repositório de snapshot
Para registrar o repositório de snapshot, você deve assinar a solicitação com o AWS Signature versão 4. Os nomes dos repositórios não podem começar com cs. Além disso, não é uma prática recomendada escrever no mesmo repositório a partir de vários domínios. Configure somente um domínio para ter acesso de gravação ao repositório.
Use o Python para registrar o repositório de snapshot no Lambda. Ou, para usar awscurl e a AWS CLI para registrar o repositório de snapshot, execute o seguinte comando na sua instância:
read -r ACCESS_KEY SECRET_KEY SESSION_TOKEN <<< $(aws sts get-session-token --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text) awscurl \ --access_key $ACCESS_KEY \ --secret_key $SECRET_KEY \ --session_token $SESSION_TOKEN \ --region us-west-2 \ --service es \ -X PUT \ -H "Content-Type: application/json" \ 'domain-endpoint/_snapshot/my-snapshot-repo' \ -d '{ "type": "s3", "settings": { "bucket": "bucketname", "region": "us-west-2", "role_arn": "arn:aws:iam::account-id:role/TheSnapshotRole" } }'
Observação: substitua my-snapshot-repo pelo nome do seu repositório, bucketname pelo nome do seu bucket e us-west-2 pela sua região. Além disso, substitua domain-endpoint pelo seu endpoint de domínio do OpenSearch Service, account-id pelo ID da sua conta e TheSnapshotRole pelo nome do seu perfil.
Para instalar awscurl, execute o seguinte comando:
pip install awscurl
Para obter mais informações, consulte awscurl no site do GitHub.
Crie o snapshot manual
Use comandos curl para tirar um snapshot manual do seu domínio do OpenSearch Service. Para o OpenSearch 2.5 ou posterior, é possível usar o OpenSearch Dashboards. Para obter instruções, consulte Take a snapshot (Tirar um snapshot) no site do OpenSearch.
Depois de criar o snapshot, é possível visualizá-lo no bucket do S3 ou por meio do OpenSearch Dashboards.
Agende snapshots manuais automatizados
No OpenSearch 2.1 ou posterior, é possível usar uma API ou o OpenSearch Dashboards para criar uma política de snapshot com o repositório registrado. Para obter mais informações, consulte Snapshot management API (API de gerenciamento de snapshot) e Creating an SM policy (Criando uma política de SM) no site do OpenSearch.
Para versões do OpenSearch anteriores à 2.1, conclua as seguintes etapas para agendar snapshots manuais:
- Se seu domínio do OpenSearch Service estiver em uma nuvem privada virtual (VPC), crie uma nova função do Lambda com o runtime Python 3.13 na mesma VPC.
- Adicione a camada AWSSDKPandas-Python313 que inclui requests-aws4auth à função. Para obter mais informações, consulte AWS Lambda managed layers (Camadas gerenciadas pelo AWS Lambda) no site do AWS SDK for pandas e requests-aws4auth no site do Python.
- Insira o código a seguir para sua função do Lambda:
Observação: substitua domain-endpoint pelo endpoint do seu domínio, mas não inclua o https://. Além disso, substitua my-snapshot-repo pelo seu repositório de snapshot e us-west-2 pela sua região.import json import boto3 import requests from requests_aws4auth import AWS4Auth from datetime import datetime def lambda_handler(event, context): # OpenSearch endpoint and repository details host = 'domain-endpoint' repository = 'my-snapshot-repo' snapshot = f"snapshot-{datetime.now().strftime('%Y%m%d%H%m%S')}" region = 'us-west-2' service = 'es' # Get AWS credentials credentials = boto3.Session().get_credentials() awsauth = AWS4Auth( credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token ) # API endpoint for creating snapshot url = f'https://{host}/_snapshot/{repository}/{snapshot}' # Snapshot creation parameters payload = { "indices": "*", "ignore_unavailable": True, "include_global_state": False } try: # Make the request response = requests.put( url, auth=awsauth, json=payload, headers={"Content-nt-Type": "application/json"} ) # Check if request was successful if response.status_code == 200: return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Snapshot creation initiated successfully', 'snapshot_name': snapshot, 'response': response.json() }) } else: return { 'statusCode': response.status_code, 'body': json.dumps({ 'message': 'Failed to create snapshot', 'error': response.text }) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({ 'message': 'Error creating snapshot', 'error': str(e) }) } - Anexe as seguintes permissões ao perfil anexado à função do Lambda:
Observação: substitua region pela sua região, account-id pelo ID da sua conta, my-snapshot-repo pelo nome do seu repositório e domain-name pelo seu domínio.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "es:ESHttpPut", "es:DescribeElasticsearchDomain" ], "Resource": "arn:aws:es:region:account-id:domain/domain-name/*" } ] } - Use o Agendador do EventBridge para invocar a função do Lambda em um agendamento.
(Opcional) Exclua snapshots desnecessários
Para snapshots manuais criados pela política de snapshot, use o parâmetro max_age ou o Período de retenção para definir uma data de validade. Para obter mais informações e instruções, consulte Parameters (Parâmetros) e Creating an SM policy (Criando uma política de SM) no site do OpenSearch.
Se a função do Lambda criou o snapshot manual, não é possível configurar uma opção de expiração. Em vez disso, use outra função do Lambda para excluir os snapshots do OpenSearch.
A função do Lambda a seguir exclui os snapshots do OpenSearch que têm mais de 30 dias:
import json import boto3 import requests from requests_aws4auth import AWS4Auth from datetime import datetime, timedelta import re def parse_date_from_snapshot_name(snapshot_name): # Pattern for format: snapshot-YYYY-MM-DDtHH-MM-SS try: # Skip "snapshot-" prefix and parse the date part date_str = snapshot_name[9:] # Remove "snapshot-" return datetime.strptime(date_str, '%Y-%m-%dt%H-%M-%S') except (ValueError, IndexError): return None def lambda_handler(event, context): # OpenSearch endpoint and repository details host = 'domain-endpoint' repository = 'my-snapshot-repo' region = 'us-west-2' service = 'es' # Get AWS credentials credentials = boto3.Session().get_credentials() awsauth = AWS4Auth( credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token ) try: # First, get all snapshots list_url = f'https://{host}/_snapshot/{repository}/_all' list_response = requests.get( list_url, auth=awsauth, headers={"Content-Type": "application/json"} ) if list_response.status_code != 200: raise Exception(f"Failed to list snapshots: {list_response.text}") response_data = list_response.json() snapshots = response_data.get('snapshots', []) current_time = datetime.now() deletion_results = [] # Process each snapshot for snapshot in snapshots: snapshot_name = snapshot.get('snapshot') try: snapshot_date = parse_date_from_snapshot_name(snapshot_name) if snapshot_date and (current_time - snapshot_date).days > 30: # Delete snapshot delete_url = f'https://{host}/_snapshot/{repository}/{snapshot_name}' delete_response = requests.delete( delete_url, auth=awsauth, headers={"Content-Type": "application/json"} ) deletion_results.append({ 'snapshot': snapshot_name, 'status': 'deleted' if delete_response.status_code == 200 else 'failed', 'response': delete_response.text }) else: deletion_results.append({ 'snapshot': snapshot_name, 'status': 'skipped', 'reason': 'Not older than 30 days or date not found in name' }) except Exception as e: deletion_results.append({ 'snapshot': snapshot_name, 'status': 'error', 'error': str(e) }) return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Snapshot deletion process completed', 'results': deletion_results }) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({ 'message': 'Error in snapshot deletion process', 'error': str(e) }) }
Observação: substitua domain-endpoint pelo endpoint do seu domínio sem https://, region pela sua região e my-snapshot-repo pelo nome do seu repositório. É uma prática recomendada configurar o tempo limite da função do Lambda para 60 segundos.
Solucione problemas
Execute as seguintes ações com base no erro recebido.
Erro “No permissions for [cluster:admin/snapshot/create]”
Se você ativou o controle de acesso refinado em seu domínio do OpenSearch Service, deve conceder ao OpenSearch Service acesso ao perfil da função do Lambda. Se você não conceder acesso, recebe o seguinte erro de permissão:
""statusCode": 403, "body": "{"message": "Failed to create snapshot", "error": "{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [cluster:admin/snapshot/create] and User [name=arn:aws:iam::123456789012:role/service-role/Lambda_ES_Snapshot-role"
Para resolver esse problema, execute o comando a seguir para conceder ao OpenSearch Service acesso ao perfil de função do Lambda:
awscurl \ --access_key ABCDE \ --secret_key EXAMPLESECRET\ --region us-west-2 \ --service es \ -X PUT \ -H "Content-Type: application/json" \ 'https://domain-endpoint/_plugins/_security/api/rolesmapping/all_access' \ -d '{"backend_roles": ["arn:aws:iam::account-id:role/service-role/Lambda_AOS_Snapshot-role"], "hosts": [], "users": ["master-user", "arn:aws:iam::account-id:user/second-primary-user" ]}'
Observação: substitua ABCDE pela sua chave de acesso, EXAMPLESECRET pelo seu segredo e us-west-2 pela sua região. Além disso, substitua domain-endpoint pelo endpoint do seu domínio do OpenSearch Service, account-id pelo ID da sua conta e Lambda_AOS_Snapshot-role pelo perfil da sua função do Lambda.
Erro “AccessDeniedException”
Se você receber a mensagem de erro “AccessDeniedException”, deve configurar uma relação de confiança para o perfil do IAM que acessa o bucket do S3. Para solucionar esse problema, use o simulador de políticas do IAM para identificar qual parte da sua política do IAM você deve atualizar.
Erro “S3Exception”
Se você receber a mensagem de erro “S3Exception: The bucket is in region 'us-west-1'”, então deve mover o bucket para a mesma região do domínio do OpenSearch Service.
Erro “SignatureDoesNotMatch”
Se você receber a mensagem de erro “SignatureDoesNotMatch”, suas credenciais da AWS expiraram ou você usou informações incorretas em sua assinatura. Mantenha suas credenciais da AWS atualizadas e certifique-se de que a região esteja correta em sua assinatura.
Erro “not authorized to perform: iam:PassRole”
Se você não usa o AWS Signature versão 4, recebe a seguinte mensagem de erro:
"Message":"User: anonymous is not authorized to perform: iam:PassRole on resource: arn:aws:iam::account-id:role/TheSnapshotRole because no resource-based policy allows the iam:PassRole action"
Para solucionar esse erro, consulte Por que recebo o erro “User: anonymous is not authorized” quando tento acessar meu cluster do OpenSearch Service?
Para obter mais informações sobre solução de problemas, consulte Como resolvo o erro de snapshot manual no meu cluster do OpenSearch Service?
Informações relacionadas
Unleash the power of Snapshot Management to take automated snapshots using OpenSearch Service (Libere o poder do Gerenciamento de snapshot para tirar snapshots automatizados usando o OpenSearch Service)
Take manual snapshots and restore in a different domain spanning across various Regions and accounts in Amazon OpenSearch Service (Tire snapshots manuais e restaure em um domínio diferente, abrangendo várias regiões e contas no OpenSearch Service)
Como restaurar dados de um domínio do OpenSearch Service em outra conta da AWS?
- Tópicos
- Analytics
- Idioma
- Português

Conteúdo relevante
feita há 2 meses
feita há um ano