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á.
Carregamento de dados de transmissão do Amazon DynamoDB
Você pode usar o AWS Lambda para enviar dados do Amazon DynamoDB para o domínio do OpenSearch Service. Os novos dados recebidos na tabela do banco de dados acionam uma notificação de evento para o Lambda, que executa seu código personalizado para realizar a indexação.
Pré-requisitos
Para continuar, você deve ter os recursos a seguir.
Pré-requisito | Descrição |
---|---|
Tabela do DynamoDB | A tabela contém os dados de origem. Para obter mais informações, consulte Operações básicas nas tabelas do DynamoDB no Guia do desenvolvedor do Amazon DynamoDB. A tabela deve residir na mesma região que o domínio do OpenSearch Service e ter um stream definido como Nova imagem. Para saber mais, consulte Como habilitar um stream. |
Domínio do OpenSearch Service | O destino dos dados depois que a função do Lambda os processa. Para ter mais informações, consulte Criação OpenSearch de domínios de serviço. |
IAM role (Perfil do IAM) | Essa função deve ter permissões básicas de execução do OpenSearch Service, DynamoDB e Lambda, como as seguintes:
A função deve ter a seguinte relação de confiança:
Para saber mais, consulte Criação de funções do IAM no Manual do usuário do IAM. |
Criar a função do Lambda
Siga as instruções no Criar o pacote de implantação do Lambda, mas crie um diretório chamado ddb-to-opensearch
e use o seguinte código para sample.py
:
import boto3 import requests from requests_aws4auth import AWS4Auth region = '' # e.g. us-east-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) host = '' # the OpenSearch Service domain, e.g. https://search-mydomain.us-west-1.es.amazonaws.com index = 'lambda-index' datatype = '_doc' url = host + '/' + index + '/' + datatype + '/' headers = { "Content-Type": "application/json" } def handler(event, context): count = 0 for record in event['Records']: # Get the primary key for use as the OpenSearch ID id = record['dynamodb']['Keys']['id']['S'] if record['eventName'] == 'REMOVE': r = requests.delete(url + id, auth=awsauth) else: document = record['dynamodb']['NewImage'] r = requests.put(url + id, auth=awsauth, json=document, headers=headers) count += 1 return str(count) + ' records processed.'
Edite as variáveis de region
e host
.
Caso ainda não tenha feito, instale o pip
cd ddb-to-opensearch pip install --target ./package requests pip install --target ./package requests_aws4auth
Depois siga as instruções em Criar a função do Lambda, mas especifique a função do IAM por Pré-requisitos e as seguintes configurações do gatilho:
-
Tabela: a tabela do DynamoDB
-
Tamanho do lote: 100
-
Posição inicial: redução horizontal
Para saber mais, consulte Processar novos itens com o DynamoDB Streams e o Lambda no Guia do desenvolvedor do Amazon DynamoDB.
A esta altura, você tem um conjunto completo de recursos: uma tabela do DynamoDB para os dados de origem, um fluxo do DynamoDB de alterações feitas na tabela, uma função que será executada depois que os dados de origem forem alterados e indexará essas alterações e um domínio do OpenSearch Service para pesquisa e visualização.
Testar a função do Lambda
Depois de criar a função, você poderá testá-la adicionando um novo item à tabela do DynamoDB usando a AWS CLI:
aws dynamodb put-item --table-name test --item '{"director": {"S": "Kevin Costner"},"id": {"S": "00001"},"title": {"S": "The Postman"}}' --region
us-west-1
Em seguida, use o console do OpenSearch Service ou o OpenSearch Dashboards para verificar se o lambda-index
contém um documento. Você também pode usar a seguinte solicitação:
GET https://domain-name
/lambda-index/_doc/00001
{
"_index": "lambda-index",
"_type": "_doc",
"_id": "00001",
"_version": 1,
"found": true,
"_source": {
"director": {
"S": "Kevin Costner"
},
"id": {
"S": "00001"
},
"title": {
"S": "The Postman"
}
}
}