Programación de Amazon DynamoDB con JavaScript - Amazon DynamoDB

Programación de Amazon DynamoDB con JavaScript

Esta guía ofrece orientación a los programadores que desean utilizar Amazon DynamoDB con JavaScript. Obtenga información sobre los AWS SDK for JavaScript, las capas de abstracción disponibles, la configuración de las conexiones, la gestión de errores, la definición de las políticas de reintentos, la gestión del mantenimiento activo y mucho más.

Acerca de AWS SDK for JavaScript

El AWS SDK for JavaScript proporciona acceso a los Servicios de AWS que usan scripts de navegador o Node.js. Esta documentación se centra en la versión más reciente del SDK (V3). AWS actualiza el AWS SDK for JavaScript V3 como un proyecto de código abierto alojado en GitHub. Los problemas y las solicitudes de características son públicos. Puede acceder a ellos desde la página de problemas del repositorio de GitHub.

JavaScript V2 es similar a V3, pero incluye algunas diferencias de sintaxis. La V3 es más modular, lo que facilita el envío de dependencias más pequeñas y tiene una compatibilidad con TypeScript de primer nivel. Recomendamos el uso de la versión más reciente del SDK.

Uso del AWS SDK for JavaScript V3

Puede añadir el SDK a su aplicación Node.js mediante el administrador de paquetes del nodo. En los ejemplos siguientes se muestra cómo añadir los paquetes de SDK más habituales para trabajar con DynamoDB.

  • npm install @aws-sdk/client-dynamodb

  • npm install @aws-sdk/lib-dynamodb

  • npm install @aws-sdk/util-dynamodb

Al instalar los paquetes, se añaden referencias a la sección de dependencias del archivo de proyecto package.json. Tiene la opción de usar la sintaxis del módulo ECMAScript más reciente. Para obtener más información sobre estos dos enfoques, consulte la sección Consideraciones.

Acceso a la documentación de JavaScript

Comience a utilizar la documentación de JavaScript con los siguientes recursos:

  • Acceda a la guía para desarrolladores para ver la documentación básica de JavaScript. Las instrucciones de instalación están disponibles en la sección Configuración.

  • Acceda a la documentación de la referencia de la API para explorar todas las clases y métodos disponibles.

  • El SDK para JavaScript es compatible con muchos otros Servicios de AWS además de DynamoDB. Utilice el siguiente procedimiento para localizar la cobertura de la API específica para DynamoDB:

    1. En Servicios, elija DynamoDB y Bibliotecas. Esto documenta el cliente de bajo nivel.

    2. Elija lib-dynamodb. Esto documenta el cliente de alto nivel. Los dos clientes representan dos capas de abstracción distintas que puede utilizar. Consulte la sección siguiente para obtener más información sobre las capas de abstracción.

Capas de abstracción

El SDK para JavaScript V3 tiene un cliente de bajo nivel (DynamoDBClient) y un cliente de alto nivel (DynamoDBDocumentClient).

Cliente de bajo nivel (DynamoDBClient)

El cliente de bajo nivel no proporciona abstracciones adicionales en comparación con el protocolo de conexión subyacente. Este cliente le da control total sobre todos los aspectos de la comunicación, pero como no hay abstracciones, debe hacer cosas como proporcionar definiciones de elementos con el formato JSON de DynamoDB.

Tal como se muestra en el siguiente ejemplo, con este formato los tipos de datos deben indicarse de forma explícita. La S hace referencia a un valor de cadena y la N, a un valor numérico. Los números de la conexión siempre se envían como cadenas etiquetadas como tipos de número para garantizar que no se pierda precisión. Las llamadas a la API de bajo nivel tienen un patrón de nomenclatura como PutItemCommand y GetItemCommand.

En el siguiente ejemplo, se utiliza un cliente de bajo nivel con Item definido con el JSON de DynamoDB:

const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb"); const client = new DynamoDBClient({}); async function addProduct() { const params = { TableName: "products", Item: { "id": { S: "Product01" }, "description": { S: "Hiking Boots" }, "category": { S: "footwear" }, "sku": { S: "hiking-sku-01" }, "size": { N: "9" } } }; try { const data = await client.send(new PutItemCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } addProduct();

Cliente de alto nivel (DynamoDBDocumentClient)

El cliente de documentos de alto nivel de DynamoDB integra unas características muy prácticas, como eliminar la necesidad de ordenar los datos manualmente y permitir lecturas y escrituras directas con objetos JavaScript estándar. En la documentación para lib-dynamodb se incluye la lista de ventajas.

Para crear una instancia de DynamoDBDocumentClient, construya un DynamoDBClient de bajo nivel y, a continuación, envuélvalo con un DynamoDBDocumentClient. La convención de nomenclatura de las funciones difiere ligeramente entre los dos paquetes. Por ejemplo, el bajo nivel usa PutItemCommand, mientras que el alto nivel usa PutCommand. Los distintos nombres permiten que ambos conjuntos de funciones cohabiten en el mismo contexto, lo que permite mezclar ambos en el mismo script.

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, PutCommand } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); async function addProduct() { const params = { TableName: "products", Item: { id: "Product01", description: "Hiking Boots", category: "footwear", sku: "hiking-sku-01", size: 9, }, }; try { const data = await docClient.send(new PutCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } addProduct();

El patrón de uso es coherente cuando se leen elementos con operaciones de la API como GetItem, Query o Scan.

Uso de la función de utilidad de serialización

Puede utilizar el cliente de bajo nivel y serializar o desactivar la serialización de los tipos de datos por su cuenta. El paquete de utilidades, util-dynamodb, tiene una función de utilidad marshall() que acepta JSON y produce JSON de DynamoDB, así como una función unmarshall() que hace lo contrario. En el siguiente ejemplo, se utiliza el cliente de bajo nivel y la llamada a marshall() gestiona la serialización de los datos.

const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb"); const { marshall } = require("@aws-sdk/util-dynamodb"); const client = new DynamoDBClient({}); async function addProduct() { const params = { TableName: "products", Item: marshall({ id: "Product01", description: "Hiking Boots", category: "footwear", sku: "hiking-sku-01", size: 9, }), }; try { const data = await client.send(new PutItemCommand(params)); } catch (error) { console.error("Error:", error); } } addProduct();

Lectura de elementos

Para leer un solo elemento de DynamoDB, se utiliza la operación de la API GetItem. De igual modo que con el comando PutItem, tiene la opción de utilizar el cliente de bajo nivel o el cliente Document de alto nivel. En el siguiente ejemplo se muestra el uso del cliente Document de alto nivel para recuperar un elemento.

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, GetCommand } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); async function getProduct() { const params = { TableName: "products", Key: { id: "Product01", }, }; try { const data = await docClient.send(new GetCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } getProduct();

Utilice la operación de la API Query para leer varios elementos. Puede usar el cliente de bajo nivel o el cliente Document. En el siguiente ejemplo se utiliza el cliente Document de alto nivel.

const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, QueryCommand, } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); async function productSearch() { const params = { TableName: "products", IndexName: "GSI1", KeyConditionExpression: "#category = :category and begins_with(#sku, :sku)", ExpressionAttributeNames: { "#category": "category", "#sku": "sku", }, ExpressionAttributeValues: { ":category": "footwear", ":sku": "hiking", }, }; try { const data = await docClient.send(new QueryCommand(params)); console.log('result : ' + JSON.stringify(data)); } catch (error) { console.error("Error:", error); } } productSearch();

Escrituras condicionales

Las operaciones de escritura de DynamoDB pueden especificar una expresión de condición lógica que debe evaluarse como verdadera para que la escritura continúe. Si la evaluación de condición no es verdadera, la operación de escritura genera una excepción. La expresión de condición puede comprobar si el elemento ya existe o si sus atributos coinciden con determinadas restricciones.

ConditionExpression = "version = :ver AND size(VideoClip) < :maxsize"

Si se produce un error en la expresión de condición, puede usar ReturnValuesOnConditionCheckFailure para solicitar que la respuesta al error incluya el elemento que no cumplía las condiciones para deducir cuál era el problema. Para obtener más información, consulte Handle conditional write errors in high concurrency scenarios with Amazon DynamoDB.

try { const response = await client.send(new PutCommand({ TableName: "YourTableName", Item: item, ConditionExpression: "attribute_not_exists(pk)", ReturnValuesOnConditionCheckFailure: "ALL_OLD" })); } catch (e) { if (e.name === 'ConditionalCheckFailedException') { console.log('Item already exists:', e.Item); } else { throw e; } }

Los ejemplos de código adicionales que muestran otros aspectos del uso de JavaScript SDK V3 están disponibles en la documentación de JavaScript SDK V3 y en el repositorio de GitHub de DynamoDB-SDK-Examples.

Paginación

Las solicitudes de lectura como Scan y Query es probable que devuelvan varios elementos de un conjunto de datos. Si realiza un Scan o Query con un parámetro Limit, una vez que el sistema haya leído todos esos elementos, se enviará una respuesta parcial y tendrá que paginar para recuperar los elementos adicionales.

El sistema solo leerá un máximo de 1 megabyte de datos por solicitud. Si incluye una expresión Filter, el sistema seguirá leyendo un megabyte, como máximo, de datos del disco, pero devolverá los elementos de ese megabyte que coincidan con el filtro. La operación de filtrado podría devolver 0 elementos para una página, pero requerir una paginación adicional antes de que se agote la búsqueda.

Debe buscar la LastEvaluatedKey en la respuesta y usarla como parámetro ExclusiveStartKey en una solicitud posterior para continuar con la recuperación de datos. Esto sirve como marcador, tal como se indica en el siguiente ejemplo.

nota

El ejemplo pasa una lastEvaluatedKey nula como la ExclusiveStartKey de la primera iteración. Esto está permitido.

Ejemplo de uso de la LastEvaluatedKey:

const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); const client = new DynamoDBClient({}); async function paginatedScan() { let lastEvaluatedKey; let pageCount = 0; do { const params = { TableName: "products", ExclusiveStartKey: lastEvaluatedKey, }; const response = await client.send(new ScanCommand(params)); pageCount++; console.log(`Page ${pageCount}, Items:`, response.Items); lastEvaluatedKey = response.LastEvaluatedKey; } while (lastEvaluatedKey); } paginatedScan().catch((err) => { console.error(err); });

Uso del método de conveniencia paginateScan

El SDK proporciona métodos de conveniencia denominados paginateScan y paginateQuery que hacen que este trabajo funcione y realiza las solicitudes repetidas entre bastidores. Especifique el número máximo de elementos que se van a leer por solicitud mediante el parámetro Limit estándar.

const { DynamoDBClient, paginateScan } = require("@aws-sdk/client-dynamodb"); const client = new DynamoDBClient({}); async function paginatedScanUsingPaginator() { const params = { TableName: "products", Limit: 100 }; const paginator = paginateScan({client}, params); let pageCount = 0; for await (const page of paginator) { pageCount++; console.log(`Page ${pageCount}, Items:`, page.Items); } } paginatedScanUsingPaginator().catch((err) => { console.error(err); });
nota

El análisis regular de toda la tabla no es un patrón de acceso recomendado, a menos que la tabla sea pequeña.

Especificación de la configuración

Al configurar el DynamoDBClient, puede especificar varias anulaciones de configuración transfiriendo un objeto de configuración al constructor. Por ejemplo, puede especificar la región a la que desea conectarse si el contexto de llamada o la URL del punto de conexión que desea utilizar todavía son desconocidas. Esto resulta útil si desea dirigirse a una instancia local de DynamoDB con fines de desarrollo.

const client = new DynamoDBClient({ region: "eu-west-1", endpoint: "http://localhost:8000", });

Config para tiempos de espera

DynamoDB usa HTTPS para la comunicación entre cliente y servidor. Puede controlar algunos aspectos de la capa HTTP proporcionando un objeto NodeHttpHandler. Por ejemplo, puede ajustar los valores de tiempo de espera clave connectionTimeout y requestTimeout. connectionTimeout es el tiempo máximo, en milisegundos, que el cliente esperará mientras intenta establecer una conexión antes de darse por vencido.

requestTimeout define cuánto tiempo esperará el cliente a recibir una respuesta después de que se envíe una solicitud, también en milisegundos. El valor predeterminado para ambos es cero, lo que significa que el tiempo de espera está desactivado y no hay límite en cuanto al tiempo que el cliente esperará si la respuesta no llega. Debe establecer los tiempos de espera en un valor razonable para que, en caso de un problema con la red, se produzca un error en la solicitud y se pueda lanzar una nueva solicitud. Por ejemplo:

import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { NodeHttpHandler } from "@smithy/node-http-handler"; const requestHandler = new NodeHttpHandler({ connectionTimeout: 2000, requestTimeout: 2000, }); const client = new DynamoDBClient({ requestHandler });
nota

En el ejemplo que se proporciona se utiliza la importación Smithy. Smithy es un lenguaje de código abierto actualizado por AWS para definir servicios y SDK.

Además de configurar los valores de tiempo de espera, puede establecer el número máximo de conexiones, lo que permite aumentar el número de conexiones simultáneas por origen. La guía para desarrolladores incluye detalles sobre la configuración del parámetro maxSockets.

Config para keep-alive

Cuando se usa HTTPS, la primera solicitud siempre requiere una comunicación de ida y vuelta para establecer una conexión segura. HTTP Keep-Alive permite que las solicitudes posteriores reutilicen la conexión ya establecida, lo que las hace más eficientes y reduce la latencia. HTTP Keep-Alive está activado de forma predeterminada con JavaScript V3.

Hay un límite en cuanto al tiempo que se puede mantener activa una conexión inactiva. Considere la posibilidad de enviar solicitudes periódicas, tal vez cada minuto, si tiene una conexión inactiva pero quiere que la siguiente solicitud utilice una conexión ya establecida.

nota

Tenga en cuenta que en la versión anterior del SDK, keep-alive estaba desactivado de forma predeterminada, lo que significaba que se cerraba cada conexión inmediatamente después usarla. Si usa la V2, puede anular esta configuración.

Config para reintentos

Cuando el SDK reciba una respuesta de error y el error se pueda reanudar según lo que determine el SDK, como una excepción de limitación o una excepción de servicio temporal, volverá a intentarlo. Al ser usted quien llama, no se da cuenta de nada, excepto si nota que la solicitud ha tardado más en tramitarse.

El SDK para JavaScript V3 realizará un total de tres solicitudes de forma predeterminada antes de darse por vencido y pasar el error al contexto de la llamada. Puede ajustar el número y la frecuencia de estos reintentos.

El constructor DynamoDBClient acepta una configuración maxAttempts que limita el número de intentos que se realizará. En el siguiente ejemplo se incrementa el valor predeterminado de 3 a un total de 5. Si lo establece en 0 o 1, significa que no quiere ningún reintento automático y que usted quiere gestionar cualquier error reanudable dentro del bloque Catch.

const client = new DynamoDBClient({ maxAttempts: 5, });

También puede controlar el tiempo de los reintentos con una estrategia de reintentos personalizada. Para ello, importe el paquete de utilidades util-retry y cree una función de espera personalizada que calcule el tiempo de espera entre reintentos en función del recuento de reintentos actual.

En el siguiente ejemplo, se recomienda realizar un máximo de 5 intentos con retardos de 15, 30, 90 y 360 milisegundos en caso de que falle el primer intento. La función de espera personalizada calculateRetryBackoff calcula los retardos aceptando el número de reintentos (comienza con 1 en el primer intento) y devuelve el número de milisegundos que hay que esperar para dicha solicitud.

const { ConfiguredRetryStrategy } = require("@aws-sdk/util-retry"); const calculateRetryBackoff = (attempt) => { const backoffTimes = [15, 30, 90, 360]; return backoffTimes[attempt - 1] || 0; }; const client = new DynamoDBClient({ retryStrategy: new ConfiguredRetryStrategy( 5, // max attempts. calculateRetryBackoff // backoff function. ), });

Esperadores

El cliente DynamoDB incluye dos funciones de esperador muy útiles que se pueden utilizar al crear, modificar o eliminar tablas si desea que el código espere hasta que finalice la modificación de la tabla. Por ejemplo, puede desplegar una tabla y llamar a la función waitUntilTableExists. El código se bloqueará hasta que la tabla se ACTIVE. El esperador sondea internamente el servicio DynamoDB con una describe-table cada 20 segundos.

import {waitUntilTableExists, waitUntilTableNotExists} from "@aws-sdk/client-dynamodb"; … <create table details> const results = await waitUntilTableExists({client: client, maxWaitTime: 180}, {TableName: "products"}); if (results.state == 'SUCCESS') { return results.reason.Table } console.error(`${results.state} ${results.reason}`);

La característica waitUntilTableExists devuelve el control solo cuando puede ejecutar un comando describe-table que muestre el estado ACTIVE de la tabla. Esto garantiza que podrá usar waitUntilTableExists para esperar a que se complete la creación, así como realizar modificaciones, como añadir un índice GSI, que puede tardar algún tiempo en aplicarse antes de que la tabla vuelva al estado ACTIVE.

Control de errores

En los primeros ejemplos, hemos detectado todos los errores ampliamente. Sin embargo, en las aplicaciones prácticas, es importante discernir entre varios tipos de error e implementar una gestión de errores más precisa.

Las respuestas de error de DynamoDB contienen metadatos, incluido el nombre del error. Puede detectar los errores y luego compararlos con los posibles nombres de cadena de las condiciones de error para determinar cómo continuar. En el caso de los errores del servidor, puede utilizar el operador instanceof con los tipos de error exportados por el paquete @aws-sdk/client-dynamodb para administrar eficazmente la gestión de errores.

Es importante tener en cuenta que estos errores solo se manifiestan una vez agotados todos los reintentos. Si se vuelve a intentar un error y, finalmente, se realiza una llamada correcta, desde el punto de vista del código, no se trata de ningún error, sino de una latencia ligeramente elevada. Los reintentos se mostrarán en los gráficos de Amazon CloudWatch como solicitudes fallidas, como las solicitudes de limitación o de error. Si el cliente alcanza el número máximo de reintentos, se dará por vencido y generará una excepción. Esta es la forma que tiene el cliente de decir que no va a volver a intentarlo.

A continuación se muestra un fragmento para detectar el error y tomar medidas en función del tipo de error devuelto.

import { ResourceNotFoundException ProvisionedThroughputExceededException, DynamoDBServiceException, } from "@aws-sdk/client-dynamodb"; try { await client.send(someCommand); } catch (e) { if (e instanceof ResourceNotFoundException) { // Handle ResourceNotFoundException } else if (e instanceof ProvisionedThroughputExceededException) { // Handle ProvisionedThroughputExceededException } else if (e instanceof DynamoDBServiceException) { // Handle DynamoDBServiceException } else { // Other errors such as those from the SDK if (e.name === "TimeoutError") { // Handle SDK TimeoutError. } else { // Handle other errors. } } }

Consulte Control de errores con DynamoDB para ver las cadenas de error más comunes en la Guía para desarrolladores de DynamoDB. Los errores exactos que se pueden producir con cualquier llamada a la API en concreto aparecen en la documentación de esa llamada a la API, como los documentos de la API Query.

Los metadatos de los errores incluyen propiedades adicionales, en función del error. En el caso de un TimeoutError, los metadatos incluyen el número de intentos realizados y el totalRetryDelay, tal y como se muestra a continuación.

{ "name": "TimeoutError", "$metadata": { "attempts": 3, "totalRetryDelay": 199 } }

Si administra su propia política de reintentos, se recomienda diferenciar entre limitaciones y errores:

  • Una limitación (indicada con una ProvisionedThroughputExceededException o ThrottlingException) representa un servicio en buen estado que le informa de que ha superado la capacidad de lectura o escritura en una tabla o partición de DynamoDB. Cada milisegundo que pasa, se dispone de un poco más de capacidad de lectura o escritura, por lo que puede volver a intentarlo rápidamente (por ejemplo, cada 50 ms) para intentar acceder a la capacidad recién liberada.

    Con las limitaciones no se requiere un retroceso exponencial, pues las limitaciones son ligeras para que DynamoDB las devuelva. Además, no se le cobra por solicitud. El retroceso exponencial asigna retardos más prolongados a los subprocesos de los clientes que ya han esperado más tiempo, lo que, estadísticamente, prolonga la p50 y la p99 hacia fuera.

  • Un error (indicado por un InternalServerError o un ServiceUnavailable, entre otros) representa un problema transitorio con el servicio, posiblemente de toda la tabla o solo de la partición desde la que está leyendo o escribiendo. En el caso de los errores, puede hacer una pausa más larga antes de volver a intentarlo, por ejemplo, 250 ms o 500 ms, y utilizar la fluctuación para escalonar los reintentos.

Registro

Active el registro para obtener más información sobre lo que hace el SDK. Puede establecer un parámetro en el DynamoDBClient tal como se muestra en el ejemplo siguiente. Aparecerá más información de registro en la consola que incluirá metadatos como el código de estado y la capacidad consumida. Si ejecuta el código de forma local en una ventana de terminal, los registros aparecen allí. Si ejecuta el código en AWS Lambda y tiene configurados los registros de Amazon CloudWatch, el resultado de la consola se escribirá allí.

const client = new DynamoDBClient({ logger: console });

También puede enlazar con las actividades internas del SDK y realizar un registro personalizado a medida que se produzcan determinados eventos. En el siguiente ejemplo se utiliza la middlewareStack del cliente para interceptar cada solicitud a medida que se envía desde el SDK y la registra a medida que se produce.

const client = new DynamoDBClient({}); client.middlewareStack.add( (next) => async (args) => { console.log("Sending request from AWS SDK", { request: args.request }); return next(args); }, { step: "build", name: "log-ddb-calls", } );

La MiddlewareStack es un enlace potente para observar y controlar el comportamiento del SDK. Consulte el blog Introducing Middleware Stack in Modular AWS SDK for JavaScript para obtener más información.

Consideraciones

A la hora de implementar AWS SDK for JavaScript en su proyecto, debe considerar algunos factores adicionales.

Sistemas de módulos

El SDK admite dos sistemas de módulos: CommonJS y ES (ECMAScript). CommonJS usa la función require, mientras que ES usa la palabra clave import.

  1. Common JS: const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb");

  2. ES (ECMAScript: import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb";

El tipo de proyecto dicta el sistema de módulos que se utilizará y se especifica en la sección de tipos del archivo package.json. El valor predeterminado es CommonJS. Use "type": "module" para indicar un proyecto ES. Si ya tiene un proyecto Node.JS que utiliza el formato de paquete CommonJS, puede añadir funciones con la sintaxis de importación del SDK V3 más moderna, si asigna la extensión .mjs a los archivos de funciones. Esto permitirá que el archivo de código se trate como ES (ECMAScript).

Operaciones asíncronas

Verá muchos ejemplos de código que utilizan callbacks y que prometen gestionar el resultado de las operaciones de DynamoDB. Con el JavaScript moderno, esta complejidad ya no es necesaria y los desarrolladores pueden aprovechar la sintaxis async/await, más sucinta y legible, para las operaciones asíncronas.

Tiempo de ejecución del navegador web

Los desarrolladores web y móviles que creen con React o React Native pueden usar el SDK para JavaScript en sus proyectos. Con la V2 anterior del SDK, los desarrolladores web tenían que cargar el SDK completo en el navegador y hacer referencia a una imagen del SDK alojada en https://sdk.amazonaws.com/js/.

Con la V3, se pueden agrupar solo los módulos del cliente V3 necesarios y todas las funciones de JavaScript requeridas en un solo archivo JavaScript mediante Webpack. Este archivo se puede añadir en una etiqueta de script en el <head> de sus páginas HTML, tal como se explica en la sección Comenzar en el navegador de la documentación del SDK.

Operaciones del plano de datos de DAX

Por el momento, el SDK para JavaScript V3 no admite las operaciones del plano de datos de Amazon DynamoDB Streams Accelerator (DAX). Si solicita compatibilidad con DAX, considere la posibilidad de utilizar el SDK para JavaScript V2, que admite las operaciones del plano de datos de DAX.