Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Carga de datos de streaming desde Amazon DynamoDB
Puede utilizar AWS Lambda para enviar datos al dominio de OpenSearch Service desde Amazon DynamoDB. Cuando llegan datos nuevos a la tabla de base de datos, activan una notificación de eventos en Lambda que, a su vez, ejecuta el código personalizado para realizar la indexación.
Requisitos previos
Antes de continuar, debe contar con los siguientes recursos.
Requisito previo | Descripción |
---|---|
Tabla de DynamoDB | La tabla contiene los datos de origen. Para más información, consulte Operaciones básicas en tablas de DynamoDB en la Guía para desarrolladores de Amazon DynamoDB. La tabla debe encontrarse en la misma región que el dominio de OpenSearch Service y debe tener un flujo configurado como Nueva imagen. Para más información, consulte Habilitación de un flujo. |
Dominio de OpenSearch Service | Es el destino de los datos después de que la función de Lambda los procesa. Para más información, consulte Creación de dominios OpenSearch de servicio. |
Rol de IAM | Este rol debe tener permisos de ejecución básicos para OpenSearch Service, DynamoDB y Lambda, como los siguientes:
El rol debe tener la siguiente relación de confianza:
Para más información, consulte Creación de roles de IAM en la Guía del usuario de IAM. |
Creación de la función de Lambda
Siga las instrucciones de Crear el paquete de implementación de Lambda, pero cree un directorio denominado ddb-to-opensearch
y utilice el siguiente 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 las variables para region
y host
.
Instale pip
cd ddb-to-opensearch pip install --target ./package requests pip install --target ./package requests_aws4auth
A continuación, siga las instrucciones de Creación de la función de Lambda, pero especifique el rol de IAM de Requisitos previos y la configuración siguiente para el desencadenador:
-
Tabla: tabla de DynamoDB
-
Tamaño del lote: 100
-
Posición inicial: Trim horizon
Para más información, consulte Process New Items with DynamoDB Streams and Lambda en la Guía para desarrolladores de Amazon DynamoDB.
En este momento, dispone de un conjunto completo de recursos: una tabla de DynamoDB para los datos fuente, un flujo de DynamoDB de cambios en la tabla, una función que se ejecuta cuando cambian los datos fuente y se indexan y un dominio de OpenSearch Service para la búsqueda y la visualización.
Probar la función de Lambda
Después de crear la función, puede probarla al agregar un elemento a la tabla de DynamoDB mediante la 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
A continuación, utilice la consola de OpenSearch Service o los OpenSearch Dashboards para verificar que lambda-index
contiene un documento. También puede utilizar la solicitud siguiente:
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"
}
}
}