Documente Academic
Documente Profesional
Documente Cultură
Developer Guide
API Version 2012-08-10
Amazon DynamoDB Developer Guide
Table of Contents
Qu es Amazon DynamoDB? ............................................................................................................. 1
Funcionamiento .......................................................................................................................... 2
Componentes bsicos ......................................................................................................... 2
API de DynamoDB ............................................................................................................ 10
Reglas de nomenclatura y tipos de datos ............................................................................. 12
Consistencia de lectura ...................................................................................................... 16
Capacidad de desempeo .................................................................................................. 17
Partitions y distribucin de datos ......................................................................................... 20
De SQL a NoSQL ..................................................................................................................... 23
SQL o NoSQL? .............................................................................................................. 23
Acceso a la base de datos ................................................................................................. 25
Creacin de una tabla ....................................................................................................... 27
Obtencin de informacin sobre una tabla ............................................................................ 28
Escritura de datos en una tabla .......................................................................................... 29
Lectura de datos de una tabla ............................................................................................ 32
Administracin de ndices ................................................................................................... 37
Modificacin de los datos de una tabla ................................................................................ 40
Eliminacin de datos de una tabla ....................................................................................... 41
Eliminacin de una tabla .................................................................................................... 42
Configuracin de DynamoDB .............................................................................................................. 44
Configuracin de la versin de DynamoDB local (descargable) ........................................................ 44
Descargar y ejecutar DynamoDB en su equipo ...................................................................... 44
Configuracin del punto de enlace local ............................................................................... 47
Notas de uso ................................................................................................................... 48
Configuracin de DynamoDB (servicio web) .................................................................................. 49
Inscripcin en AWS ........................................................................................................... 49
Obtener una clave de acceso de AWS ................................................................................. 50
Configuracin de las credenciales ....................................................................................... 50
Acceso a DynamoDB ........................................................................................................................ 51
Uso de la consola ..................................................................................................................... 51
Uso de la CLI .......................................................................................................................... 52
Descarga y configuracin de la AWS CLI ............................................................................. 52
Uso de la AWS CLI con DynamoDB .................................................................................... 53
Uso de la AWS CLI con la versin descargable de DynamoDB ................................................ 54
Uso del API ............................................................................................................................. 54
Introduccin a DynamoDB .................................................................................................................. 55
Java y DynamoDB .................................................................................................................... 55
Requisitos previos ............................................................................................................. 56
Paso 1: Crear una tabla .................................................................................................... 56
Paso 2: Carga de datos de ejemplo .................................................................................... 57
Paso 3: Crear, leer, actualizar y eliminar elementos ............................................................... 60
Paso 4: Consultar y examinar los datos ............................................................................... 67
Paso 5: (Opcional) Eliminar la tabla ..................................................................................... 71
Resumen ......................................................................................................................... 72
JavaScript y DynamoDB ............................................................................................................ 72
Requisitos previos ............................................................................................................. 73
Paso 1: Crear una tabla .................................................................................................... 74
Paso 2: Carga de datos de ejemplo .................................................................................... 75
Paso 3: Crear, leer, actualizar y eliminar elementos ............................................................... 78
Paso 4: Consultar y examinar los datos ............................................................................... 86
Paso 5: (Opcional) Eliminar la tabla ..................................................................................... 91
Resumen ......................................................................................................................... 92
Node.js y DynamoDB ................................................................................................................ 93
Requisitos previos ............................................................................................................. 93
Qu es Amazon DynamoDB?
Amazon DynamoDB es un servicio de bases de datos NoSQL totalmente administrado que ofrece un
desempeo rpido y previsible, as como una escalabilidad ptima. DynamoDB le permite delegar las
cargas administrativas que supone tener que utilizar y escalar bases de datos distribuidas, para que no
tenga que preocuparse del provisionamiento, la instalacin ni la configuracin del hardware, ni tampoco de
las tareas de replicacin, aplicacin de parches de software o escalado de clsteres.
Con DynamoDB, puede crear tablas de base de datos capaces de almacenar y recuperar cualquier
cantidad de datos, as como de atender cualquier nivel de trfico de solicitudes. Puede escalar la
capacidad de desempeo de las tablas para aumentarla o reducirla sin tiempos de inactividad ni reduccin
del desempeo, as como utilizar la consola de administracin de AWS para monitorizar la utilizacin de
recursos y las mtricas de desempeo.
DynamoDB permite eliminar automticamente los elementos vencidos de las tablas, para ayudarle a
reducir el consumo de almacenamiento y el costo que suponen los datos que ya no son pertinentes. Para
obtener ms informacin, consulte Tiempo de vida (p. 377).
DynamoDB distribuye automticamente los datos y el trfico de las tablas entre un nmero suficiente de
servidores para satisfacer sus requisitos de almacenamiento y desempeo, al mismo tiempo que mantiene
un desempeo uniforme y rpido. Todos los datos se almacenan en discos de estado slido (SSD) y se
replican automticamente en varias zonas de disponibilidad de una regin de AWS, con objeto de ofrecer
prestaciones integradas de alta disponibilidad y durabilidad de los datos.
Amazon DynamoDB: funcionamiento (p. 2): para aprender los conceptos esenciales de DynamoDB.
Configuracin de DynamoDB (p. 44): para aprender a configurar DynamoDB (versin descargable o
servicio web).
Acceso a DynamoDB (p. 51): para aprender a obtener acceso a DynamoDB mediante la consola, la
CLI o el API.
Para empezar a trabajar rpidamente con DynamoDB, consulte Introduccin a DynamoDB (p. 55).
Para obtener ms informacin sobre el desarrollo de aplicaciones, consulte los enlaces siguientes:
Para encontrar con rapidez recomendaciones que le permitan maximizar el desempeo y minimizar sus
costos, consulte Prcticas recomendadas para DynamoDB (p. 695). Para obtener informacin sobre
cmo etiquetar los recursos de DynamoDB consulte Etiquetado para DynamoDB (p. 327).
Para conocer las prcticas recomendadas, guas de instrucciones y herramientas, consulte la pgina
Recursos para desarrolladores de DynamoDB: http://aws.amazon.com/dynamodb/developer-resources/.
Puede utilizar AWS Database Migration Service para migrar datos de una base de datos relacional o
MongoDB a una tabla de Amazon DynamoDB. Para obtener ms informacin, consulte la Gua del usuario
de AWS Database Migration Service. Para obtener informacin sobre cmo utilizar MongoDB como
origen de migracin, consulte Using MongoDB as a Source for AWS Database Migration Service. Para
obtener informacin sobre cmo utilizar DynamoDB como destino de migracin, consulte Using an Amazon
DynamoDB Database as a Target for AWS Database Migration Service.
Despus de leer esta introduccin, intente seguir la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291), en la que se explican paso a paso el proceso de creacin de ejemplos de tablas, carga de
datos y realizacin de algunas operaciones bsicas con la base de datos.
Para ver tutoriales especficos del lenguaje con cdigo de muestra, consulte Introduccin a
DynamoDB (p. 55).
Temas
Componentes bsicos de DynamoDB (p. 2)
API de DynamoDB (p. 10)
Reglas de nomenclatura y tipos de datos (p. 12)
Consistencia de lectura (p. 16)
Capacidad de desempeo para lecturas y escrituras (p. 17)
Partitions y distribucin de datos (p. 20)
Temas
Tablas, elementos y atributos (p. 3)
Clave principal (p. 6)
ndices secundarios (p. 7)
Tablas: al igual que otros sistemas de administracin de bases de datos, DynamoDB almacena datos
en tablas. Una tabla es una coleccin de datos. Por ejemplo, consulte la tabla de ejemplo denominada
People, que puede utilizar para almacenar informacin de contacto personal sobre amigos, familiares u
otras personas de inters. Tambin podra utilizar una tabla Cars para almacenar informacin sobre los
vehculos que conducen las personas.
Elementos: cada tabla contiene varios elementos. Un elemento es un grupo de atributos que puede
identificarse de forma exclusiva entre todos los dems elementos. En una tabla People, cada elemento
representa a una persona. En una tabla Cars, cada elemento representa un vehculo. Los elementos de
DynamoDB son similares en muchos aspectos a las filas, los registros o las tuplas de otros sistemas de
bases de datos. En DynamoDB, no existe ningn lmite respecto al nmero de elementos que pueden
almacenarse en una tabla.
Atributos: cada elemento se compone de uno o varios atributos. Un atributo es un componente
fundamental de los datos, que no es preciso dividir ms. Por ejemplo, un elemento de una tabla People
contiene los atributos PersonID, LastName, FirstName, etc. En una tabla Department, un elemento
podra tener atributos tales como DepartmentID, Name,Manager, etc. En DynamoDB, los atributos se
parecen en muchos aspectos a los campos o columnas en otros sistemas de bases de datos.
En el siguiente diagrama se muestra una tabla denominada People que contiene algunos ejemplos de
elementos y atributos.
Cada elemento de la tabla tiene un identificador nico, o clave principal, que lo distingue de todos los
dems. En la tabla People, la clave principal consta de un atributo (PersonID).
Dejando a un lado la clave principal, la tabla People no tiene esquema. Esto significa que no es preciso
definir de antemano los atributos ni sus tipos de datos. Cada elemento puede tener sus propios atributos
diferentes.
La mayora de los atributos son escalares, lo que significa que solo pueden tener un valor. Las cadenas
y los nmeros son ejemplos comunes de escalares.
Algunos de los elementos tienen un atributo anidado (Address). DynamoDB admite atributos anidados
hasta un mximo de 32 niveles de profundidad.
A continuacin se muestra otro ejemplo de tabla denominada Music que podra utilizar para llevar un
registro de una coleccin de msica.
La clave principal de Music consta de dos atributos (Artist y SongTitle). Cada elemento de la tabla debe
tener estos dos atributos. La combinacin de Artist y SongTitle distingue a cada elemento de la tabla de
todos los dems.
Dejando a un lado la clave principal, la tabla Music no tiene esquema. Esto significa que no es preciso
definir de antemano los atributos ni sus tipos de datos. Cada elemento puede tener sus propios atributos
diferentes.
Uno de los elementos tiene un atributo anidado (PromotionInfo), que contiene otros atributos anidados.
DynamoDB admite atributos anidados hasta un mximo de 32 niveles de profundidad.
Clave principal
Al crear una tabla, adems de asignarle un nombre, debe especificar su clave principal. La clave principal
identifica de forma nica a cada elemento de la tabla, de manera que no puede haber dos elementos con
la misma clave.
Clave de particin: una clave principal simple que consta de un solo atributo denominado clave de
particin.
DynamoDB utiliza el valor de clave de particin como informacin de entrada a una funcin hash interna.
El resultado de la funcin hash determina la particin (almacenamiento fsico interno de DynamoDB)
donde se almacenar el elemento.
En una tabla que solo tiene una clave de particin, no puede haber dos elementos que tengan el mismo
valor de clave de particin.
La tabla People descrita en Tablas, elementos y atributos (p. 3) es un ejemplo de una tabla con
una clave principal simple (PersonID). Puede obtener acceso a cualquier elemento de la tabla People
inmediatamente proporcionando el valor de PersonId de dicho elemento.
Clave de particin y clave de ordenacin: este tipo de clave se denomina clave principal compuesta y
consta de dos atributos. El primer atributo es la clave de particin y el segundo, la clave de ordenacin.
DynamoDB utiliza el valor de clave de particin como informacin de entrada a una funcin hash interna.
El resultado de la funcin hash determina la particin (almacenamiento fsico interno de DynamoDB)
donde se almacenar el elemento. Todos los elementos con la misma clave de particin se almacenan
en posiciones contiguas, ordenados segn el valor de la clave de ordenacin.
En una tabla que tenga una clave de particin y una clave de ordenacin, es posible que dos elementos
tengan el mismo valor de clave de particin. Sin embargo, esos dos elementos deben tener valores de
clave de ordenacin distintos.
La tabla Music descrita en Tablas, elementos y atributos (p. 3) es un ejemplo de una tabla con una
clave principal compuesta (Artist y SongTitle). Puede obtener acceso a cualquier elemento de la tabla
Music inmediatamente proporcionando los valores de Artist y SongTitle de dicho elemento.
Una clave principal compuesta ofrece ms flexibilidad a la hora de consultar datos. Por ejemplo, si
proporciona el valor de Artist, DynamoDB recupera todas las canciones de ese intrprete. Podra
incluso proporcionar un valor de Artist y un intervalo de valores de SongTitle para recuperar tan solo un
subconjunto de las canciones de un intrprete determinado.
Note
La clave de particin de un elemento tambin se denomina atributo hash. El trmino atributo hash
alude al uso de una funcin hash interna en DynamoDB para distribuir los elementos de datos de
manera uniforme entre las particiones, segn sus valores de clave de particin.
La clave de ordenacin de un elemento tambin se denomina atributo de rango. El trmino
atributo de rango alude al hecho de que DynamoDB almacena en ubicaciones fsicamente
contiguas todos los elementos que tienen la misma clave de particin, ordenados segn el valor
de la clave de ordenacin.
Cada atributo de clave principal debe ser escalar (es decir, solo puede contener un nico valor). Los nicos
tipos de datos que se permiten para los atributos de clave principal son String, Number y Binary. A los
dems atributos sin clave no se les aplican restricciones de esta ndole.
API Version 2012-08-10
6
Amazon DynamoDB Developer Guide
Componentes bsicos
ndices secundarios
Puede crear uno o varios ndices secundarios en una tabla. Un ndice secundario le permite consultar
los datos de la tabla usando una clave alternativa, adems de realizar consultas basadas en la clave
principal. DynamoDB no requiere que se usen ndices; sin embargo, estos ofrecen a las aplicaciones
mayor flexibilidad a la hora de consultar los datos. Despus de crear un ndice secundario en una tabla,
podr leer los datos en el ndice prcticamente de la misma forma que en la tabla.
Global secondary index: ndice con una clave de particin y una clave de ordenacin que pueden diferir
de las claves de la tabla.
ndice secundario local: ndice que tiene la misma clave de particin que la tabla, pero una clave de
ordenacin distinta.
Puede definir hasta 5 ndices secundarios globales y 5 ndices secundarios locales por cada tabla.
En el ejemplo de la tabla Music mostrado anteriormente, puede consultar los elementos de datos por Artist
(clave de particin) o por Artist y SongTitle (claves de particin y ordenacin). Qu sucede si tambin
desea consultar los datos por gnero musical (Genre) y ttulo de lbum (AlbumTitle)? Para ello, puede
crear un ndice basado en Genre y AlbumTitle y, a continuacin, consultarlo prcticamente de la misma
forma que se consultara la tabla Music.
El siguiente diagrama muestra la tabla Music de ejemplo, con un nuevo ndice llamado GenreAlbumTitle.
En el ndice, Genre es la clave de particin y AlbumTitle es la clave de ordenacin.
Cada ndice pertenece a una tabla, que se denomina la tabla base del ndice. En el ejemplo anterior,
Music es la tabla base del ndice GenreAlbumTitle.
Puede consultar el ndice GenreAlbumTitle para encontrar todos los lbumes de un gnero musical
determinado (por ejemplo, todos los lbumes de msica Rock). Tambin puede consultar el ndice para
encontrar todos los lbumes de un determinado gnero musical que tengan un ttulo de lbum especfico
(por ejemplo, todos los lbumes de msica Country cuyo ttulo comience por la letra H).
Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el acceso a los
datos (p. 463).
Flujos de DynamoDB
Flujos de DynamoDB es una caracterstica opcional que captura los eventos de modificacin de datos
que se producen en las tablas de DynamoDB. Los datos de estos eventos aparecen en la secuencia
prcticamente en tiempo real y en el orden en que se han producido.
Cada evento se representa mediante un registro de secuencia. Si habilita una secuencia en una tabla,
Flujos de DynamoDB escribe un registro de secuencia cada vez que se produzcan los siguientes eventos:
Si se agrega un nuevo elemento a la tabla, la secuencia captura una imagen del elemento completo,
incluidos todos sus atributos.
Si un elemento se actualiza, la secuencia captura las imgenes de "antes" y "despus" de los atributos
del elemento que se han modificado.
Si se elimina un elemento de la tabla, la secuencia captura una imagen del elemento completo antes de
eliminarlo.
Cada registro de secuencia tambin contiene el nombre de la tabla, la marca temporal del evento y
otros metadatos. Los registros de secuencia tienen una vida til de 24horas; despus, se eliminan
automticamente de la secuencia.
Puede utilizar Flujos de DynamoDB conjuntamente con AWS Lambda para crear un disparador; es
decir, un cdigo que se ejecute automticamente cada vez que aparezca un evento de inters en una
secuencia. Por ejemplo, tomemos una tabla Customers que contiene la informacin de clientes de una
compaa. Supongamos que desea enviar un mensaje de correo electrnico de bienvenida a cada
nuevo cliente. Podra habilitar una secuencia en esa tabla y, a continuacin, asociar la secuencia con
una funcin Lambda. La funcin Lambda se ejecutara cada vez que apareciese un nuevo registro en
la secuencia, pero solamente procesara los nuevos elementos agregados a la tabla Customers. Para
cualquier elemento que tuviera el atributo EmailAddress, la funcin Lambda podra invocar Amazon Simple
Email Service (Amazon SES) para que enviase un mensaje de correo electrnico a esa direccin.
Note
En este ejemplo, observe que el ltimo cliente, Craig Roe, no recibir un mensaje de correo
electrnico, porque no tiene el atributo EmailAddress.
Adems de los disparadores, Flujos de DynamoDB permite utilizar soluciones sumamente eficientes, tales
como replicacin de datos en el seno de regiones de AWS y entre ellas, vistas materializadas de datos en
las tablas de DynamoDB o anlisis de datos mediante vistas materializadas de Kinesis, entre otras.
Para obtener ms informacin, consulte Captura de la actividad de las tablas con Flujos de
DynamoDB (p. 540).
API de DynamoDB
Para trabajar con Amazon DynamoDB, la aplicacin debe utilizar algunas operaciones de API sencillas. A
continuacin se ofrece un resumen de estas operaciones, organizadas por categoras.
Temas
Plano de control (p. 11)
Plano de datos (p. 11)
Flujos de DynamoDB (p. 12)
Plano de control
Las operaciones del plano de control permiten crear y administrar tablas de DynamoDB. Tambin permiten
usar ndices, secuencias y otros objetos que dependen de las tablas.
CreateTable: crea una nueva tabla. Si lo prefiere, puede crear uno o varios ndices secundarios y
habilitar Flujos de DynamoDB para la tabla.
DescribeTable: devuelve informacin sobre una tabla, como su esquema de clave principal, ajustes
de desempeo, informacin de ndices, etc.
ListTables: devuelve los nombres de todas las tablas en una lista.
UpdateTable: modifica los ajustes de una tabla o sus ndices, crea o elimina nuevos ndices en una
tabla o modifica los ajustes de Flujos de DynamoDB de una tabla.
DeleteTable: elimina de DynamoDB una tabla y todos los objetos que dependen de ella.
Plano de datos
Las operaciones del plano de datos permiten llevar a cabo acciones de creacin, lectura, actualizacin
y eliminacin (tambin denominadas operaciones CRUD, por sus siglas en ingls) con los datos de una
tabla. Algunas de las operaciones del plano de datos permiten tambin leer datos de un ndice secundario.
Creacin de datos
PutItem: escribe un solo elemento en una tabla. Debe especificar los atributos de clave principal, pero
no es preciso especificar otros atributos.
BatchWriteItem: escribe hasta 25 elementos en una tabla. Resulta ms eficiente que llamar a
PutItem varias veces, porque la aplicacin solo tiene que completar un nico recorrido de ida y
vuelta para escribir todos los elementos. Tambin puede usar BatchWriteItem para eliminar varios
elementos de una o varias tablas.
Lectura de datos
GetItem: recupera un solo elemento de una tabla. Es preciso especificar la clave principal del elemento
que se desea recuperar. Puede recuperar la totalidad del elemento o solo un subconjunto de sus
atributos.
BatchGetItem: recupera hasta 100 elementos de una o varias tablas. Resulta ms eficiente que llamar
a GetItem varias veces, porque la aplicacin solo tiene que completar un nico recorrido de ida y vuelta
para leer todos los elementos.
Query: recupera todos los elementos que tienen una clave de particin determinada. Debe especificar el
valor de clave de particin. Puede recuperar la totalidad de los elementos o solo un subconjunto de sus
atributos. De forma opcional, puede aplicar una condicin a los valores de la clave de ordenacin de tal
forma que solo se recupere un subconjunto de los datos que tienen la misma clave de particin. Puede
utilizar esta operacin en una tabla, siempre y cuando esta tenga tanto una clave de particin como una
clave de ordenacin. Tambin puede utilizar esta operacin en un ndice, siempre y cuando este tenga
tanto una clave de particin como una clave de ordenacin.
Scan: recupera todos los elementos de la tabla o el ndice especificados. Puede recuperar la totalidad
de los elementos o solo un subconjunto de sus atributos. Si lo desea, puede aplicar una condicin de
filtrado para devolver solamente aquellos valores que le interesan y descartar los dems.
Actualizacin de datos
UpdateItem: modifica uno o varios atributos de un elemento. Es preciso especificar la clave principal
del elemento que se desea modificar. Puede agregar nuevos atributos, as como modificar o eliminar
los existentes. Tambin puede realizar actualizaciones condicionales, de tal forma que la actualizacin
solamente se lleve a cabo cuando se cumpla una condicin definida por el usuario. Si lo desea, puede
implementar un contador atmico, que incrementa o disminuye el valor de un atributo numrico sin
interferir con las dems solicitudes de escritura.
Eliminacin de datos
DeleteItem: elimina un solo elemento de una tabla. Es preciso especificar la clave principal del
elemento que se desea eliminar.
BatchWriteItem: elimina hasta 25 elementos de una o varias tablas. Resulta ms eficiente que llamar
a DeleteItem varias veces, porque la aplicacin solo tiene que completar un nico recorrido de ida y
vuelta para eliminar todos los elementos. Tambin puede usar BatchWriteItem para aadir varios
elementos a una o varias tablas.
Flujos de DynamoDB
Las operaciones de Flujos de DynamoDB permiten habilitar o deshabilitar una secuencia en una tabla y
obtener acceso a los registros de modificacin de datos contenidos en una secuencia.
ListStreams: devuelve una lista de todas las secuencias o solamente la secuencia de una tabla
concreta.
DescribeStream: devuelve informacin sobre una secuencia, como su nombre de recurso de Amazon
(ARN) y sobre dnde puede comenzar la aplicacin a leer los primeros registros de la secuencia.
GetShardIterator: devuelve un iterador de fragmentos, que es una estructura de datos que la
aplicacin utiliza para recuperar los registros de la secuencia.
GetRecords: recupera uno o varios registros de secuencia mediante el iterador de fragmentos
especificado.
Temas
Reglas de nomenclatura (p. 12)
Tipos de datos (p. 13)
Reglas de nomenclatura
Las tablas, los atributos y otros objetos de DynamoDB deben tener nombres. Los nombres deben ser
significativos y concisos; por ejemplo, Products, Books y Authors son nombres que indican claramente su
significado.
Todos los nombres deben codificarse mediante UTF-8 y distinguen entre maysculas y minsculas.
Los nombres de las tablas y los ndices deben tener entre 3 y 255caracteres, que solo pueden ser los
siguientes:
a-z
A-Z
0-9
_ (guion bajo)
- (guion)
. (punto)
Los nombres de los atributos deben tener entre 1 y 255caracteres.
Aunque DynamoDB permite utilizar estas palabras reservadas y caracteres especiales en los nombres,
recomendamos que evite hacerlo, porque tendra que definir variables de marcador de posicin cada
vez que utilizase estos nombres en una expresin. Para obtener ms informacin, consulte Nombres de
atributos de expresin (p. 356).
Tipos de datos
DynamoDB admite muchos tipos de datos para los atributos de una tabla. Se pueden categorizar como se
indica a continuacin:
Tipos escalares: un tipo escalar es aquel que puede representar exactamente un valor. Los tipos
escalares son Number, String, Binary, Boolean y Null.
Tipos de documentos: un tipo de documento puede representar una estructura compleja con atributos
anidados, como los que se encontrara en un documento JSON. Los tipos de documentos son List y
Map.
Tipos de conjuntos: un tipo de conjunto puede representar varios valores escalares. Los tipos de
conjuntos son String Set, Number Set y Binary Set.
Al crear una tabla o un ndice secundario, debe especificar los nombres y los tipos de datos de cada uno
de los atributos de clave principal (clave de particin y clave de ordenacin). Adems, cada atributo de
clave principal debe definirse como de tipo String, Number o Binary.
DynamoDB es una base de datos NoSQL sin esquema. Esto significa que, a excepcin de los atributos de
clave principal, no tiene que definir atributos ni tipos de datos cuando crea las tablas. En comparacin, las
bases de datos relacionales requieren que se definan los nombres y los tipos de datos de cada columna al
crear la tabla.
A continuacin se muestran las descripciones de cada tipo de datos, junto con ejemplos en formato JSON.
Tipos escalares
Los tipos escalares son Number, String, Binary, Boolean y Null.
Cadena
Los valores de tipo String son Unicode con codificacin binaria UTF-8. La longitud de una cadena debe ser
mayor que cero y est restringida por el lmite mximo de tamao de elemento de DynamoDB, 400 KB.
Si define un atributo de clave principal como atributo de tipo String, se aplican las siguientes restricciones
adicionales:
Para una clave principal simple, la longitud mxima del valor del primer atributo (clave de particin) es
2048 bytes.
Para una clave principal compuesta, la longitud mxima del valor del segundo atributo (clave de
ordenacin) es 1024 bytes.
DynamoDB recopila y compara las cadenas utilizando los bytes de la codificacin de cadena UTF-8
subyacente. Por ejemplo, "a" (0x61) es mayor que "A" (0x41) y "" (0xC2BF) es mayor que "z" (0x7A).
Puede utilizar el tipo de datos String para representar una fecha o una marca temporal. Una forma de
hacerlo es utilizar cadenas ISO 8601, tal y como se muestra en estos ejemplos:
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
Nmero
Los nmeros pueden ser positivos, negativos o cero. Los nmeros pueden tener hasta 38dgitos de
precisin. Si excede este tope, se generar una excepcin.
En DynamoDB, los nmeros se representan con longitud variable. Los ceros iniciales y finales se recortan.
Todos los nmeros se envan a travs de la red a DynamoDB como cadenas, para maximizar la
compatibilidad entre lenguajes y bibliotecas. Sin embargo, DynamoDB los trata como atributos de tipo
Number en las operaciones matemticas.
Note
Si la precisin del nmero es importante, debe pasar los nmeros a DynamoDB utilizando
cadenas que se conviertan a partir de un tipo Number.
Puede utilizar el tipo de datos Number para representar una fecha o una marca temporal. Una forma de
hacerlo es utilizar fechas en formato de tiempo Unix, es decir, el nmero de segundos desde las 00:00:00
UTC del 1 de enero de 1970. Por ejemplo, la fecha 1437136300 en formato de tiempo Unix representa las
12:31:40 UTC del 17 de julio de 2015.
Binary
Los atributos de tipo Binary pueden almacenar cualquier tipo de datos binarios, como texto comprimidos,
datos cifrados o imgenes. Siempre que DynamoDB compara valores de tipo Binary, trata cada byte de los
datos binarios como sin signo.
La longitud de un atributo de tipo Binary debe ser mayor que cero y est restringida por el lmite mximo de
tamao de elemento de DynamoDB, 400 KB.
Si define un atributo de clave principal como atributo de tipo Binary, se aplican las siguientes restricciones
adicionales:
Para una clave principal simple, la longitud mxima del valor del primer atributo (clave de particin) es
2048 bytes.
Para una clave principal compuesta, la longitud mxima del valor del segundo atributo (clave de
ordenacin) es 1024 bytes.
Las aplicaciones deben codificar los valores de tipo Binary en formato codificado en base64 antes de
enviarlos a DynamoDB. Al recibirlos, DynamoDB decodifica los datos y los convierte a matrices de bytes
sin signo; a continuacin, utiliza ese resultado como longitud del atributo de tipo Binary.
El siguiente ejemplo es un atributo de tipo Binary en el que se utiliza texto con la codificacin en base64:
dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk
Booleano
Null
Tipos de documentos
Los tipos de documentos son List y Map. Estos tipos de datos pueden anidarse unos en otros para
representar estructuras de datos complejas con un mximo de 32 niveles de profundidad.
No existe ningn lmite respecto al nmero de valores de una lista o un mapa, siempre y cuando el
elemento que contenga los valores se ajuste al lmite de tamao de elemento de DynamoDB (400 KB).
Un valor de atributo no puede ser un valor de tipo String o Set (String Set, Number Set o Binary Set) vaco.
Sin embargo, s se admiten valores de tipo List o Map vacos. Para obtener ms informacin, consulte
Atributos (p. 770).
List
Un atributo de tipo List puede almacenar una coleccin ordenada de valores. Las listas deben ir entre
corchetes: [ ... ].
Una lista es similar a una matriz JSON. No hay ninguna limitacin respecto a los tipos de datos que se
pueden almacenar en una entrada de lista y no es preciso que las entradas de una entrada de lista sean
del mismo tipo.
En el siguiente ejemplo se muestra una lista que contiene dos cadenas y un nmero:
Note
DynamoDB permite usar entradas individuales contenidas en las listas, aunque estas entradas
estn anidadas a gran profundidad. Para obtener ms informacin, consulte Uso de expresiones
en DynamoDB (p. 352).
Map
Un atributo de tipo Map puede almacenar una coleccin desordenada de pares nombre-valor. Los mapas
deben ir entre llaves: { ... }.
Un mapa es similar a un objeto JSON. No hay ninguna limitacin respecto a los tipos de datos que se
pueden almacenar en una entrada de mapa y no es preciso que las entradas de un mapa sean del mismo
tipo.
Los mapas son idneos para almacenar documentos JSON en DynamoDB. En el siguiente ejemplo se
muestra un mapa que contiene una cadena, un nmero y una lista anidada que contiene otro mapa.
{
Day: "Monday",
UnreadEmails: 42,
ItemsOnMyDesk: [
"Coffee Cup",
"Telephone",
{
Pens: { Quantity : 3},
Pencils: { Quantity : 2},
Erasers: { Quantity : 1}
}
]
}
Note
DynamoDB permite usar entradas individuales contenidas en los mapas, aunque estas entradas
estn anidadas a gran profundidad. Para obtener ms informacin, consulte Uso de expresiones
en DynamoDB (p. 352).
Sets
DynamoDB admite tipos que representan conjuntos de valores de tipo Number, String o Binary. Todas las
entradas de un conjunto deben ser del mismo tipo. Por ejemplo, un atributo de tipo Number Set solo puede
contener nmeros, de tipo String Set solo puede contener cadenas y as sucesivamente.
No existe ningn lmite respecto al nmero de valores de un conjunto, siempre y cuando el elemento que
contenga los valores se ajuste al lmite de tamao de elemento de DynamoDB (400 KB).
Cada valor contenido en un conjunto debe ser nico. El orden de los valores dentro de un conjunto no se
conserva; por tanto, las aplicaciones no deben depender de que las entradas de un conjunto se dispongan
en un orden determinado. Por ltimo, DynamoDB no admite conjuntos vacos.
Consistencia de lectura
Amazon DynamoDB est disponible en varias regiones de AWS de todo el mundo. Cada regin es
independiente y se encuentra aislada de las dems regiones de AWS. Por ejemplo, si tenemos una tabla
denominada People en la regin us-east-2 y otra tabla denominada People en la regin us-west-2, se
consideran dos tablas completamente independientes. Para obtener una lista de todas las regiones de
AWS en las que DynamoDB est disponible, consulte Regiones y puntos de conexin de AWS en la
Referencia general de Amazon Web Services.
Cada regin de AWS consta de varias ubicaciones distintas denominadas zonas de disponibilidad. Cada
zona de disponibilidad est aislada de los errores que se produzcan en otras zonas de disponibilidad y
proporciona conectividad de red de baja latencia econmica con otras zonas de disponibilidad de la misma
regin. Esto permite la replicacin rpida de los datos entre varias zonas de disponibilidad de una regin.
Cuando la aplicacin escribe datos en una tabla de DynamoDB y recibe una respuesta HTTP 200 (OK), se
actualizan todas las copias de los datos. Los datos presentan consistencia final en todas las ubicaciones
de almacenamiento, normalmente en el plazo de un segundo o menos.
Al leer datos de una tabla de DynamoDB, la respuesta podra no reflejar los resultados de una operacin
de escritura reciente. La respuesta podra incluir algunos datos anticuados. Si repite la solicitud de lectura
tras un breve intervalo de tiempo, la respuesta debera devolver los datos ms recientes.
Cuando se solicita una lectura de consistencia alta, DynamoDB devuelve una respuesta con los datos ms
actualizados, de tal forma que refleja las actualizaciones de todas las operaciones de escritura anteriores
que se han llevado a cabo correctamente. Una lectura de consistencia alta podra no estar disponible si se
produce un retraso o una interrupcin en la red.
Note
DynamoDB utiliza las lecturas consistentes finales a menos que especifique lo contrario.
Las operaciones de lectura (como GetItem, Queryy Scan) proporcionan un parmetro
ConsistentRead. Si establece este parmetro en true, DynamoDB utiliza lecturas de
consistencia alta durante la operacin.
Al crear una tabla o un ndice en Amazon DynamoDB, debe especificar los requisitos de capacidad para
la actividad de lectura y escritura. Si define la capacidad de desempeo de antemano, DynamoDB puede
reservar los recursos necesarios para satisfacer las necesidades de su aplicacin en cuanto a la actividad
de lectura y escritura, al tiempo que se garantiza un desempeo uniforme y de baja latencia.
Una unidad de capacidad de lectura equivale a una lectura de consistencia alta por segundo, o bien a
dos lecturas consistentes finales por segundo, para un elemento con un tamao de hasta 4 KB. Para
leer un elemento mayor que 4 KB, DynamoDB tendr que consumir unidades de capacidad de lectura
adicionales. El nmero total de unidades de capacidad de lectura necesarias depende del tamao del
elemento y de si se desea utilizar lecturas consistentes finales o de consistencia alta.
Una unidad de capacidad de escritura equivale a una escritura por segundo para un elemento con un
tamao de hasta 1 KB. Para escribir un elemento mayor que 1 KB, DynamoDB tendr que consumir
unidades de capacidad de escritura adicionales. El nmero total de unidades de capacidad de escritura
necesarias depende del tamao del elemento.
Por ejemplo, supongamos que creamos una tabla con 5unidades de capacidad de lectura y 5unidades de
capacidad de escritura. Con estos ajustes, la aplicacin podra:
Realizar lecturas de consistencia alta de hasta 20KB por segundo (4 KB 5unidades de capacidad de
lectura).
Realizar lecturas consistentes finales de hasta 40KB por segundo (el doble de desempeo de lectura).
Escribir hasta 5KB por segundo (1 KB 5unidades de capacidad de escritura).
Si la aplicacin lee o escribe elementos mayores (hasta el tamao de elemento mximo de DynamoDB de
400 KB), consumir ms unidades de capacidad.
Si las solicitudes de lectura o escritura superan los ajustes de desempeo de una tabla, DynamoDB
puede aplicar una limitacin controlada a esas solicitudes. DynamoDB tambin puede limitar de forma
controlada las solicitudes de lectura superadas para un ndice. La limitacin controlada impide que la
aplicacin consuma demasiadas unidades de capacidad. Cuando se aplica una limitacin controlada a una
solicitud, se produce un error en ella con el cdigo HTTP 400 (Bad Request) y se genera una excepcin
ProvisionedThroughputExceededException. Los SDK de AWS incluyen compatibilidad integrada
para reintentar las solicitudes que han sido objeto de una limitacin controlada (consulte Reintentos de
error y retardo exponencial (p. 200)), de modo que no tendr que escribir personalmente esta lgica.
Puede utilizar la Consola de administracin de AWS para monitorizar el desempeo provisionado y real y
modificar los ajustes de desempeo si es preciso.
Con la funcin Auto Scaling de DynamoDB, una tabla o un ndices secundario global pueden aumentar
su capacidad de lectura y escritura provisionada para hacer frente a los aumentos repentinos de trfico,
sin que se aplique la limitacin controlada a las solicitudes. Cuando la carga de trabajo disminuye, Auto
Scaling de DynamoDB puede reducir el desempeo para evitar que tenga que pagar por una capacidad
provisionada que no se utiliza.
Note
Si usa la Consola de administracin de AWS para crear una tabla o un ndices secundario global,
la funcin Auto Scaling de DynamoDB se habilita de forma predeterminada.
Puede administrar los ajustes de Auto Scaling en cualquier momento mediante la consola, la AWS
CLI o uno de los SDK de AWS.
Desempeo provisionado
Si no utiliza la funcin Auto Scaling de DynamoDB, deber definir manualmente los requisitos de
desempeo. El desempeo provisionado es la cantidad mxima de capacidad que una tabla o un ndice
de una aplicacin pueden consumir. Si la aplicacin supera los ajustes de desempeo provisionado, las
solicitudes podran ser objeto de una limitacin controlada.
Por ejemplo, supongamos que desea leer 80elementos por segundo en una tabla. Los elementos tienen
un tamao de 3KB y desea realizar lecturas de consistencia alta. En este caso, cada lectura requiere una
unidad de capacidad de lectura provisionada. Para determinarlo, hay que dividir el tamao de elemento
de la operacin por 4 KB y, a continuacin, redondearlo al nmero entero ms prximo, como en este
ejemplo:
1unidad de capacidad de lectura por elemento 80lecturas por segundo = 80unidades de capacidad
de lectura
Ahora, suponga que desea escribir 100elementos por segundo en la tabla y que los elementos tienen
un tamao de 512bytes. En este caso, cada escritura requiere una unidad de capacidad de escritura
provisionada. Para determinarlo, hay que dividir el tamao de elemento de la operacin por 1 KB y, a
continuacin, redondearlo al nmero entero ms prximo:
512bytes / 1 KB = 0,5, o 1
Capacidad reservada
En calidad de cliente de DynamoDB, puede adquirir capacidad reservada por adelantado, como se
describe en Precios de Amazon DynamoDB. Con la capacidad reservada, se abona una tarifa inicial
nica y se adquiere el compromiso de consumir un nivel de uso mnimo durante un periodo concreto. Al
reservar las unidades de capacidad de lectura y escritura por adelantado, lograr un ahorro importante en
comparacin con los ajustes de desempeo provisionado a peticin.
Para administrar la capacidad reservada, vaya a la consola de DynamoDB y elija Reserved Capacity.
Note
Puede impedir que los usuarios vean o adquieran capacidad reservada pero que s puedan
obtener acceso al resto de la consola. Para obtener ms informacin, consulte cmo conceder
permisos para evitar la adquisicin de ofertas de capacidad reservada en Autenticacin y control
de acceso de Amazon DynamoDB (p. 635).
Al crear una tabla, su estado inicial es CREATING. Durante esta fase, DynamoDB asigna particiones
suficientes a la tabla para que pueda satisfacer los requisitos de desempeo provisionado. Puede
comenzar a escribir y leer datos en la tabla una vez que su estado haya cambiado a ACTIVE.
Si aumenta los ajustes de desempeo provisionado de la tabla de tal forma que se supere el lmite
admitido por las particiones existentes.
Si una particin existente se llena al lmite de su capacidad y se requiere ms espacio de
almacenamiento.
Para obtener ms informacin, consulte Comprensin del comportamiento de las particiones (p. 699).
La administracin de las particiones tiene lugar automticamente en segundo plano y es transparente para
las aplicaciones. La tabla permanece disponible a lo largo del proceso y responde en todo momento a los
requisitos de desempeo provisionado.
Los ndices secundarios globales de DynamoDB tambin constan de particiones. Los datos de un ndice
secundario global se almacenan de forma independiente de los datos de la tabla base, pero las particiones
de ndices se comportan prcticamente igual que las particiones de tablas.
Para escribir un elemento en la tabla, DynamoDB utiliza el valor de la clave de particin como informacin
de entrada para una funcin hash interna. El valor del resultado de la funcin hash determina la particin
donde se almacenar el elemento.
Para leer un elemento de la tabla, debe especificar el valor de clave de particin del elemento. DynamoDB
utiliza este valor como informacin de entrada para la funcin hash para obtener la particin en la que se
encuentra el elemento.
En el siguiente diagrama se muestra una tabla denominada Pets que abarca varias particiones. La clave
principal de la tabla es AnimalType (solo se muestra este atributo de clave). DynamoDB utiliza la funcin
hash para determinar dnde se almacenar un nuevo elemento, en este caso de acuerdo con el valor hash
de la cadena Dog. Tenga en cuenta que los elementos no se almacenan de forma ordenada. La ubicacin
de cada elemento viene determinada por el valor hash de su clave de particin.
Note
DynamoDB est optimizado para distribuir los elementos uniformemente entre las particiones
de una tabla, con independencia del nmero de particiones que haya. Recomendamos elegir
una clave de particin que pueda tener un amplio abanico de valores distintos en relacin
con el nmero de elementos de la tabla. Para obtener ms informacin, consulte Prcticas
recomendadas para las tablas (p. 697).
Para escribir un elemento en la tabla, DynamoDB calcula el valor hash de su clave de particin, con el fin
de determinar qu particin debe contener el elemento. En esa particin, podra haber varios elementos
con el mismo valor de clave de particin, de modo que DynamoDB almacena el elemento entre los dems
elementos que tienen la misma clave de particin en orden ascendente segn su clave de ordenacin.
Para leer un elemento de la tabla, debe especificar los valores de sus claves de particin y ordenacin.
DynamoDB calcula el valor hash de la clave de particin para obtener la particin en la que se encuentra el
elemento.
Puede leer varios elementos de la tabla en una misma operacin (Query), siempre y cuando los elementos
que desee leer tengan el mismo valor de clave de particin. DynamoDB devuelve todos los elementos
que contienen ese valor de clave de particin. De forma opcional, puede aplicar una condicin a la
clave de ordenacin para que devuelva solamente los elementos comprendidos en un rango de valores
determinado.
Supongamos que la tabla Pets tiene una clave principal compuesta que consta de AnimalType (clave
de particin) y Name (clave de ordenacin). En el siguiente diagrama se ilustra lo que ocurre cuando
DynamoDB escribe un elemento con un valor de clave de particin Dog y un valor de clave de ordenacin
Fido.
Para leer el mismo elemento de la tabla Pets, DynamoDB calcula el valor hash de Dog para obtener la
particin en la que estn almacenados estos elementos. A continuacin, DynamoDB examina los valores
de los atributos de clave de ordenacin hasta que encuentra Fido.
Para leer todos los elementos cuyo valor de AnimalType es Dog, puede emitir una operacin Query sin
especificar una condicin de clave de ordenacin. De forma predeterminada, los elementos se devuelven
en el orden en el que estn almacenados (es decir, en orden ascendente segn su clave de ordenacin).
Si lo prefiere, puede solicitar que se muestren por orden descendente.
Para consultar solo algunos de los elementos Dog, puede aplicar una condicin a la clave de ordenacin
(por ejemplo, solo los elementos Dog cuyo valor de Name comience por una letra comprendida entre la A y
la K).
Note
De SQL a NoSQL
Si es desarrollador de aplicaciones, es posible que tenga alguna experiencia con los sistemas de
administracin de bases de datos relacionales (RDBMS, por sus siglas en ingls) y con el lenguaje de
consulta estructurada SQL. Cuando comience a utilizar Amazon DynamoDB, observar numerosas
similitudes, pero tambin bastantes diferencias. En esta seccin se describen las tareas que suelen
llevarse a cabo con las bases de datos y se comparan y contrastan las instrucciones de SQL con las
operaciones de DynamoDB equivalentes.
El trmino NoSQL se utiliza para describir los sistemas de bases de datos no relacionales que tienen un
alto grado de disponibilidad y escalabilidad y estn optimizados para ofrecer un desempeo elevado. En
lugar del modelo relacional, las bases de datos NoSQL (como DynamoDB) utilizan modelos alternativos
de administracin de datos, como los pares clave-valor o el almacenamiento de documentos. Para obtener
ms informacin, consulte http://aws.amazon.com/nosql.
Note
Los ejemplos de SQL de esta seccin son compatibles con el sistema de administracin de bases
de datos relacionales MySQL.
En los ejemplos de DynamoDB de esta seccin se muestra el nombre de la operacin de
DynamoDB junto con los parmetros de dicha operacin en formato JSON. Para obtener ejemplos
de cdigo en los que se utilizan estas operaciones, consulte Introduccin a DynamoDB (p. 55).
Temas
SQL o NoSQL? (p. 23)
Acceso a la base de datos (p. 25)
Creacin de una tabla (p. 27)
Obtencin de informacin sobre una tabla (p. 28)
Escritura de datos en una tabla (p. 29)
Lectura de datos de una tabla (p. 32)
Administracin de ndices (p. 37)
Modificacin de los datos de una tabla (p. 40)
Eliminacin de datos de una tabla (p. 41)
Eliminacin de una tabla (p. 42)
SQL o NoSQL?
Los requisitos de las aplicaciones actuales son ms exigentes que nunca. Por ejemplo, un juego online
podra comenzar con unos pocos usuarios y una pequea cantidad de datos. No obstante, si el juego tiene
xito, puede superar fcilmente los recursos del sistema de administracin de bases de datos subyacente.
No es infrecuente que las aplicaciones basadas en Web tengan cientos, miles o millones de usuarios
simultneos, que generen nuevos datos del orden de terabytes o ms. Las bases de datos de este tipo de
aplicaciones deben administrar decenas o cientos de miles de lecturas y escrituras por segundo.
Amazon DynamoDB es apropiada para cargas de trabajo de este tipo. Como desarrollador, puede
comenzar con una pequea cantidad de desempeo provisionado y aumentarla gradualmente a medida
que su aplicacin adquiera popularidad. DynamoDB se escala de manera fluida hasta administrar enormes
cantidades de datos y de usuarios.
En la siguiente tabla se muestran algunas diferencias generales nivel entre un sistema de administracin
de bases de datos relacionales (RDBMS) y DynamoDB:
En el siguiente diagrama se muestra la interaccin del cliente con una base de datos relacional y con
DynamoDB.
En la tabla siguiente se muestra ms informacin acerca de las tareas de interaccin del cliente:
SQL
Use la instruccin CREATE TABLE para crear una tabla, como se muestra en el ejemplo siguiente.
Debe definir la clave principal, as como todas las columnas y tipos de datos de la tabla. Puede usar la
instruccin ALTER TABLE para cambiar estas definiciones ms adelante si fuera preciso.
DynamoDB
Use la accin CreateTable para crear una tabla; para ello, especifique los parmetros que se muestran a
continuacin:
{
TableName : "Music",
KeySchema: [
{
AttributeName: "Artist",
KeyType: "HASH", //Partition key
},
{
AttributeName: "SongTitle",
KeyType: "RANGE" //Sort key
}
],
AttributeDefinitions: [
{
AttributeName: "Artist",
AttributeType: "S"
},
{
AttributeName: "SongTitle",
AttributeType: "S"
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1
}
}
La clave principal de esta tabla consta de Artist (clave de particin) y SongTitle (clave de ordenacin).
Note
Para obtener ejemplos de cdigo en los que se utiliza CreateTable, consulte Introduccin a
DynamoDB (p. 55).
SQL
La mayora de los sistemas de administracin de bases de datos relacionales (RDBMS) permiten describir
una estructura de tabla; a saber, columnas, tipos de datos, definicin de clave principal, etc. No existe una
manera estndar de realizar esta tarea en SQL. Sin embargo, en muchos sistemas de base de datos se
proporciona un comando DESCRIBE. Este es un ejemplo de MySQL:
DESCRIBE Music;
Este cdigo devuelve la estructura de la tabla, con todos los nombres de columnas, los tipos de datos y los
tamaos:
+------------+-------------+------+-----+---------+-------+
DynamoDB
DynamoDB posee una accin DescribeTable, que es parecida. El nico parmetro obligatorio es el
nombre de la tabla, como se muestra a continuacin:
{
TableName : "Music"
}
{
"Table": {
"AttributeDefinitions": [
{
"AttributeName": "Artist",
"AttributeType": "S"
},
{
"AttributeName": "SongTitle",
"AttributeType": "S"
}
],
"TableName": "Music",
"KeySchema": [
{
"AttributeName": "Artist",
"KeyType": "HASH" //Partition key
},
{
"AttributeName": "SongTitle",
"KeyType": "RANGE" //Sort key
}
],
...
DescribeTable tambin devuelve informacin. acerca de los ndices de la tabla, los ajustes de
desempeo provisionado, el recuento de elementos aproximado y otros metadatos.
En esta seccin se describe cmo escribir una fila (o un elemento) en una tabla.
SQL
Una tabla de una base de datos relacional es una estructura de datos bidimensional formada por filas y
columnas. Algunos sistemas de administracin de bases de datos tambin ofrecen compatibilidad con
datos semiestructurados, normalmente con los tipos de datos de JSON o XML nativos. Sin embargo, los
detalles de implementacin varan segn el proveedor.
En SQL, se utiliza la instruccin INSERT para agregar una fila a una tabla:
La clave principal de esta tabla consta de Artist y SongTitle. Debe especificar los valores de estas
columnas.
Note
En este ejemplo, se utiliza la columna Tags para almacenar datos semiestructurados relativos a
las canciones de la tabla Music. Hemos definido la columna Tags con el tipo TEXT, que permite
almacenar hasta 65535caracteres en MySQL.
DynamoDB
En Amazon DynamoDB, se utiliza la accin PutItem para agregar un elemento a una tabla:
{
TableName: "Music",
Item: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today",
"AlbumTitle":"Somewhat Famous",
"Year": 2015,
"Price": 2.14,
"Genre": "Country",
"Tags": {
"Composers": [
"Smith",
"Jones",
"Davis"
],
"LengthInSeconds": 214
}
}
}
La clave principal de esta tabla consta de Artist y SongTitle. Debe especificar los valores de estos
atributos.
A continuacin se indican algunos aspectos clave que es preciso tener en cuenta sobre este ejemplo de
PutItem:
DynamoDB proporciona compatibilidad nativa con documentos utilizando JSON. Por ello, DynamoDB
resulta idneo para almacenar datos semiestructurados, como las etiquetas. Adems, puede recuperar y
manipular los datos contenidos en los documentos JSON.
La tabla Music no tiene atributos predefinidos aparte de la clave principal (Artist y SongTitle).
La mayora de las bases de datos SQL estn orientadas a transacciones. Cuando se emite una
instruccin INSERT, las modificaciones de los datos no son permanentes hasta que se emite una
instruccin COMMIT. Con Amazon DynamoDB, los efectos de una accin PutItem son permanentes
cuando DynamoDB responde con un cdigo de estado HTTP 200 (OK).
Note
Para obtener ejemplos de cdigo en los que se utiliza PutItem, consulte Introduccin a
DynamoDB (p. 55).
{
TableName: "Music",
Item: {
"Artist": "No One You Know",
"SongTitle": "My Dog Spot",
"AlbumTitle":"Hey Now",
"Price": 1.98,
"Genre": "Country",
"CriticRating": 8.4
}
}
{
TableName: "Music",
Item: {
"Artist": "No One You Know",
"SongTitle": "Somewhere Down The Road",
"AlbumTitle":"Somewhat Famous",
"Genre": "Country",
"CriticRating": 8.4,
"Year": 1984
}
}
{
TableName: "Music",
Item: {
"Artist": "The Acme Band",
"SongTitle": "Still In Love",
"AlbumTitle":"The Buck Starts Here",
"Price": 2.47,
"Genre": "Rock",
"PromotionInfo": {
"RadioStationsPlaying":[
"KHCR", "KBQX", "WTNR", "WJJH"
],
"TourDates": {
"Seattle": "20150625",
"Cleveland": "20150630"
},
"Rotation": "Heavy"
}
}
}
TableName: "Music",
Item: {
"Artist": "The Acme Band",
"SongTitle": "Look Out, World",
"AlbumTitle":"The Buck Starts Here",
"Price": 0.99,
"Genre": "Rock"
}
}
Note
GetItem: recupera un solo elemento de una tabla. Se trata de la forma ms eficiente de leer un nico
elemento, ya que proporciona acceso directo a la ubicacin fsica del elemento. DynamoDB tambin
proporciona la operacin BatchGetItem, que permite llevar a cabo hasta 100 llamadas a GetItem en
una sola operacin.
Query: recupera todos los elementos que tienen una clave de particin determinada. Dentro del
conjunto de esos elementos, puede aplicar una condicin a la clave de ordenacin y recuperar
nicamente un subconjunto de los datos. Query proporciona un acceso rpido y eficiente a las
particiones en las que se almacenan los datos. (Para obtener ms informacin, consulte Partitions y
distribucin de datos (p. 20).)
Scan: recupera todos los elementos de la tabla especificada. Esta operacin no debe utilizarse con
grandes tablas, ya que puede consumir gran cantidad de recursos del sistema.
Note
En una base de datos relacional, puede usar la instruccin SELECT para unir los datos de varias
tablas y devolver los resultados. Las uniones son fundamentales para el modelo relacional.
Con el fin de garantizar que las uniones se lleven a cabo de forma eficiente, es preciso ajustar
continuamente el desempeo de la base de datos y de sus aplicaciones.
DynamoDB es una base de datos NoSQL no relacional que no admite uniones de tablas. En lugar
de ello, las aplicaciones leen los datos de una tabla cada vez.
En las siguientes secciones se describen varios casos de uso de la lectura de datos y se explica cmo
realizar estas tareas con una base de datos relacional y con DynamoDB.
Temas
Lectura de un elemento usando su clave principal (p. 32)
Consulta de una tabla (p. 34)
Examen de una tabla (p. 36)
SQL
En SQL, se utiliza la instruccin SELECT para recuperar datos de una tabla. Puede solicitar una o varias
columnas en el resultado (o todas ellas, si se utiliza el operador *). La clusula WHERE determina qu fila o
filas se devolvern.
A continuacin se muestra una instruccin SELECT que recupera una sola fila de la tabla Music. La
clusula WHERE especifica los valores de la clave principal.
SELECT *
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
Puede modificar esta consulta para recuperar tan solo un subconjunto de las columnas:
DynamoDB
DynamoDB proporciona la accin GetItem para recuperar un elemento por su clave principal. GetItem
es muy eficiente, porque proporciona acceso directo a la ubicacin fsica del elemento. (Para obtener ms
informacin, consulte Partitions y distribucin de datos (p. 20).)
De forma predeterminada, GetItem devuelve el elemento completo con todos sus atributos.
{
TableName: "Music",
Key: {
"Artist": "No One You Know",
"SongTitle": "Call Me Today"
}
}
Puede agregar un parmetro ProjectionExpression para que solo se devuelvan algunos de los
atributos:
{
TableName: "Music",
Key: {
"Artist": "No One You Know",
"SongTitle": "Call Me Today"
},
"ProjectionExpression": "AlbumTitle, Year, Price"
}
La accin GetItem de DynamoDB es muy eficiente: utiliza uno o varios valores de clave principal para
determinar la ubicacin de almacenamiento exacta del elemento en cuestin y lo recupera directamente
desde ella. La eficiencia de la instruccin SELECT de SQL es parecida para recuperar elementos por sus
valores de clave principal.
La instruccin SELECT de SQL admite muchos tipos de consultas y exmenes de tablas. DynamoDB
proporciona una funcionalidad semejante con las acciones Query y Scan, que se describen en Consulta
de una tabla (p. 34) y Examen de una tabla (p. 36).
La instruccin SELECT de SQL puede llevar a cabo uniones de tablas para permitirle recuperar datos de
varias tablas al mismo tiempo. Las uniones son ms eficaces cuando las tablas de base de datos estn
normalizadas y las relaciones entre las tablas estn claras. Sin embargo, si se unen demasiadas tablas en
una misma instruccin SELECT, el desempeo de la aplicacin podra verse afectado. Puede solucionar
este problema utilizando la replicacin de bases de datos, las vistas materializadas o las reescrituras de
consultas.
DynamoDB es una base de datos no relacional. Como tal, no admite las uniones de tablas. Si va a migrar
una aplicacin existente a partir de una base de datos relacional a DynamoDB, debe desnormalizar el
modelo de datos para eliminar la necesidad de uniones.
Note
Para obtener ejemplos de cdigo en los que se utiliza GetItem, consulte Introduccin a
DynamoDB (p. 55).
SQL
La instruccin SELECT de SQL permite realizar consultas por columnas de clave, columnas que no son
de clave o cualquier combinacin de ellas. La clusula WHERE determina qu filas se devuelven, como se
muestra en los ejemplos siguientes:
/* Return all of the songs by an artist, with a particular word in the title...
...but only if the price is less than 1.00 */
DynamoDB
La accin DynamoDB Query permite recuperar datos de forma parecida. La accin Query proporciona un
acceso rpido y eficiente a las ubicaciones fsicas en las que se almacenan los datos. (Para obtener ms
informacin, consulte Partitions y distribucin de datos (p. 20).)
Puede usar Query con cualquier tabla que tenga una clave principal compuesta (una clave de particin
y una clave de ordenacin). Debe especificar una condicin de igualdad para la clave de particin y, si lo
desea, puede proporcionar otra condicin para la clave de ordenacin.
El parmetro KeyConditionExpression especifica los valores de clave que se desea consultar. Puede
utilizar una expresin FilterExpression opcional para eliminar algunos elementos de los resultados
antes de que se devuelvan.
{
TableName: "Music",
KeyConditionExpression: "Artist = :a and SongTitle = :t",
ExpressionAttributeValues: {
":a": "No One You Know",
":t": "Call Me Today"
}
}
{
TableName: "Music",
KeyConditionExpression: "Artist = :a",
ExpressionAttributeValues: {
":a": "No One You Know"
}
}
{
TableName: "Music",
KeyConditionExpression: "Artist = :a and begins_with(SongTitle, :t)",
ExpressionAttributeValues: {
":a": "No One You Know",
":t": "Call"
}
}
// Return all of the songs by an artist, with a particular word in the title...
// ...but only if the price is less than 1.00
{
TableName: "Music",
KeyConditionExpression: "Artist = :a and contains(SongTitle, :t)",
FilterExpression: "price < :p",
ExpressionAttributeValues: {
":a": "No One You Know",
":t": "Today",
":p": 1.00
}
}
Note
Para obtener ejemplos de cdigo en los que se utiliza Query, consulte Introduccin a
DynamoDB (p. 55).
Tanto si va a usar una base de datos SQL o NoSQL, los exmenes deben utilizarse con moderacin, ya
que puede consumir gran cantidad de recursos del sistema. En ocasiones, un examen es lo apropiado (por
ejemplo, para examinar una tabla pequea) o algo inevitable (por ejemplo, para realizar una exportacin
masiva de datos). Sin embargo, por norma general, debe disear las aplicaciones de tal forma que se evite
la realizacin de exmenes.
SQL
En SQL, puede examinar una tabla y recuperar todos sus datos utilizando una instruccin SELECT sin
especificar una clusula WHERE. Puede solicitar una o ms columnas en el resultado. O bien puede solicitar
todas ellas si utiliza el carcter comodn (*).
DynamoDB
DynamoDB proporciona la accin Scan, cuyo funcionamiento es parecido. Estos son algunos ejemplos:
La accin Scan proporciona adems un parmetro FilterExpression, que permite descartar los
elementos que no deban aparecer en los resultados. La expresin FilterExpression se aplica despus
de que examinar la tabla completa, pero antes de que se devuelvan los resultados. Esto no se recomienda
en tablas de gran tamao, porque se le cobrar la operacin Scan completa aunque solamente se
devuelvan algunos elementos coincidentes.
Note
Para obtener ejemplos de cdigo en los que se utiliza Scan, consulte Introduccin a
DynamoDB (p. 55).
Administracin de ndices
Los ndices permiten obtener acceso a patrones de consulta alternativos y agilizar las consultas. En esta
seccin se compara y contrasta la creacin y el uso de ndices entre SQL y DynamoDB.
Tanto si est utilizando una base de datos relacional o DynamoDB, la creacin de ndices debe realizarse
con cautela. Cada vez que se produce una escritura en una tabla, es preciso actualizar todos los ndices
de esa tabla. En un entorno con uso intensivo de escrituras y grandes tablas, esto puede consumir gran
cantidad de recursos del sistema. Aunque esto no es motivo de preocupacin en entornos de solo lectura
o principalmente de lectura, hay que asegurarse de que la aplicacin utilice los ndices realmente, de tal
forma que estos no se limiten a consumir espacio.
Temas
Creacin de un ndice (p. 37)
Consulta y examen de un ndice (p. 38)
Creacin de un ndice
SQL
En las bases de datos relacionales, los ndices son estructuras de datos que permiten realizar consultas
rpidas en diferentes columnas de una tabla. Puede usar la instruccin CREATE INDEX de SQL para
agregar un ndice a una tabla existente y especificar las columnas que se van a indexar. Una vez que se
ha creado el ndice, puede consultar los datos de la tabla como de costumbre, si bien ahora la base de
datos podr utilizar el ndice para encontrar rpidamente las filas especificadas de la tabla, en lugar de
tener que examinar la tabla completa.
Despus de crear un ndice, la base de datos lo mantiene automticamente. Cada vez que se modifica
algn dato de la tabla, el ndice se modifica automticamente para reflejar los cambios de la tabla.
DynamoDB
En DynamoDB, puede crear y usar un ndice secundario con fines semejantes.
Los ndices de DynamoDB son diferentes de sus homlogos relacionales. Al crear un ndice secundario,
hay que especificar sus atributos de clave: una clave de particin y una clave de ordenacin. Una vez
creado el ndice secundario, puede utilizar las operaciones Query o Scan para consultarlo o examinarlo,
respectivamente, como si se tratase de una tabla. DynamoDB no tiene un optimizador de consultas, de
modo que el ndice secundario solamente se utiliza cuando se utilizan las operaciones Query o Scan con
l.
Los ndices secundarios globales: la clave principal del ndice puede constar de dos atributos
cualesquiera de la tabla a la que pertenece.
Los ndices secundarios locales: la clave de particin del ndice debe ser igual que la clave de particin
de la tabla a la que pertenece. Sin embargo, la clave de ordenacin puede ser cualquier otro atributo.
DynamoDB se asegura de que los datos de un ndice secundario presenten consistencia final con la tabla
a la que pertenece. Puede solicitar acciones Query o Scan de consistencia alta en una tabla o un local
secondary index. No obstante, los ndices secundarios globales solo admiten la consistencia final.
Puede agregar un ndices secundario global a una tabla existente; para ello, utilice la accin
UpdateTable y especifique GlobalSecondaryIndexUpdates:
{
TableName: "Music",
AttributeDefinitions:[
{AttributeName: "Genre", AttributeType: "S"},
{AttributeName: "Price", AttributeType: "N"}
],
GlobalSecondaryIndexUpdates: [
{
Create: {
IndexName: "GenreAndPriceIndex",
KeySchema: [
{AttributeName: "Genre", KeyType: "HASH"}, //Partition key
{AttributeName: "Price", KeyType: "RANGE"}, //Sort key
],
Projection: {
"ProjectionType": "ALL"
},
ProvisionedThroughput: {
"ReadCapacityUnits": 1,"WriteCapacityUnits": 1
}
}
}
]
}
Parte de esta operacin implica reponer datos de la tabla en el nuevo ndice. Durante la reposicin, la
tabla permanece disponible. Sin embargo, el ndice no est preparado hasta que el atributo Backfilling
cambia de true a false. Puede utilizar la accin DescribeTable para ver este atributo.
Note
Para obtener ejemplos de cdigo en los que se utiliza UpdateTable, consulte Introduccin a
DynamoDB (p. 55).
A continuacin se muestran algunas instrucciones SQL en las que se puede utilizar GenreAndPriceIndex
para mejorar el desempeo. Damos por hecho que la tabla Music contiene suficientes datos para que el
optimizador de consultas decida utilizar el ndice en lugar de examinar la tabla completa.
DynamoDB
En DynamoDB, se llevan a cabo operaciones Query que consultan el ndice directamente, exactamente
igual que se hara en una tabla. Debe especificar tanto TableName como IndexName.
{
TableName: "Music",
IndexName: "GenreAndPriceIndex",
KeyConditionExpression: "Genre = :genre",
ExpressionAttributeValues: {
":genre": "Rock"
},
};
{
TableName: "Music",
IndexName: "GenreAndPriceIndex",
KeyConditionExpression: "Genre = :genre and Price < :price",
ExpressionAttributeValues: {
":genre": "Country",
":price": 0.50
},
ProjectionExpression: "Artist, SongTitle, Price"
};
En este ejemplo se utiliza una expresin ProjectionExpression para indicar que solamente deseamos
que aparezcan en los resultados algunos de los atributos y no todos ellos.
Tambin puede llevar a cabo operaciones Scan en un ndice secundario, exactamente igual que se hara
en una tabla. A continuacin se muestra un examen de GenreAndPriceIndex:
{
TableName: "Music",
IndexName: "GenreAndPriceIndex"
}
SQL
En SQL, se utiliza la instruccin UPDATE para modificar una o varias filas. La clusula SET especifica
los nuevos valores de una o varias columnas y la clusula WHERE determina qu filas se modifican. A
continuacin se muestra un ejemplo:
UPDATE Music
SET RecordLabel = 'Global Records'
WHERE Artist = 'No One You Know' AND SongTitle = 'Call Me Today';
Si no hay ninguna fila que coincida con la clusula WHERE, la instruccin UPDATE no surte efecto.
DynamoDB
En DynamoDB, se utiliza la accin UpdateItem para modificar un solo elemento. Si desea modificar
varios elementos, debe utilizar varias operaciones UpdateItem.
{
TableName: "Music",
Key: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today"
},
UpdateExpression: "SET RecordLabel = :label",
ExpressionAttributeValues: {
":label": "Global Records"
}
}
Debe especificar los atributos Key del elemento que va a modificar y una expresin UpdateExpression
para especificar los valores de los atributos.
UpdateItem se comporta como una operacin "upsert" (de actualizacin/insercin): si el elemento est
presente en tabla, se actualiza y, si no est presente, se agrega (inserta).
UpdateItem admite las escrituras condicionales, en las que la operacin nicamente se lleva a cabo
correctamente si una expresin ConditionExpression determinada se evala en true. Por ejemplo,
la accin UpdateItem siguiente no lleva a cabo la actualizacin a no ser que el precio de la cancin sea
mayor o igual que 2,00:
{
TableName: "Music",
Key: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today"
},
UpdateExpression: "SET RecordLabel = :label",
ConditionExpression: "Price >= :p",
ExpressionAttributeValues: {
":label": "Global Records",
":p": 2.00
}
}
UpdateItem tambin admite los contadores atmicos, que son atributos del tipo Number que se pueden
incrementar o reducir. Los contadores atmicos se parecen en muchos aspectos a los generadores de
secuencia, las columnas de identidad o los campos de incremento automtico de las bases de datos SQL.
A continuacin se muestra un ejemplo de accin UpdateItem utilizada para inicializar un nuevo atributo
(Plays) que permite realizar el seguimiento del nmero de veces que se ha reproducido una cancin:
{
TableName: "Music",
Key: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today"
},
UpdateExpression: "SET Plays = :val",
ExpressionAttributeValues: {
":val": 0
},
ReturnValues: "UPDATED_NEW"
}
El parmetro ReturnValues se establece en UPDATED_NEW, que devuelve los nuevos valores de todos
los atributos que se han actualizado. En este caso, devuelve 0 (cero).
Cada vez que alguien reproduce esta cancin, podemos usar la accin UpdateItem para incrementar
Plays en una unidad:
{
TableName: "Music",
Key: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today"
},
UpdateExpression: "SET Plays = Plays + :incr",
ExpressionAttributeValues: {
":incr": 1
},
ReturnValues: "UPDATED_NEW"
}
Note
Para obtener ejemplos de cdigo en los que se utiliza UpdateItem, consulte Introduccin a
DynamoDB (p. 55).
SQL
En SQL, se utiliza la instruccin DELETE para eliminar una o varias filas. La clusula WHERE determina qu
filas se van a modificar. A continuacin se muestra un ejemplo:
Puede modificar la clusula WHERE para eliminar varias filas. Por ejemplo, puede eliminar todas las
canciones de un determinado intrprete, tal y como se muestra a continuacin:
Note
Si omite la clusula WHERE, la base de datos intentar eliminar todas las filas de la tabla.
DynamoDB
En DynamoDB, se utiliza la accin DeleteItem para eliminar datos de una tabla, de elemento en
elemento. Debe especificar los valores de clave principal del elemento. A continuacin se muestra un
ejemplo:
{
TableName: "Music",
Key: {
Artist: "The Acme Band",
SongTitle: "Look Out, World"
}
}
Note
Adems de DeleteItem, Amazon DynamoDB admite la accin BatchWriteItem para eliminar
varios elementos a la vez.
DeleteItem admite las escrituras condicionales, en las que la operacin nicamente se lleva a cabo
correctamente si una expresin ConditionExpression determinada se evala en true. Por ejemplo, la
accin DeleteItem siguiente elimina un elemento nicamente si tiene el atributo RecordLabel:
{
TableName: "Music",
Key: {
Artist: "The Acme Band",
SongTitle: "Look Out, World"
},
ConditionExpression: "attribute_exists(RecordLabel)"
}
Note
Para obtener ejemplos de cdigo en los que se utiliza DeleteItem, consulte Introduccin a
DynamoDB (p. 55).
SQL
Cuando ya no necesita una tabla y se desea descartarla de forma permanente, se utiliza la instruccin
DROP TABLE de SQL:
Despus de eliminar una tabla, ya no se puede recuperar. En algunas bases de datos relacionales se
permite deshacer una operacin DROP TABLE, pero se trata de una funcionalidad especfica del proveedor
que no se implementa de manera generalizada.
DynamoDB
DynamoDB posee una accin parecida, DeleteTable. En el siguiente ejemplo, se elimina la tabla de
forma permanente:
{
TableName: "Music"
}
Note
Para obtener ejemplos de cdigo en los que se utiliza DeleteTable, consulte Introduccin a
DynamoDB (p. 55).
Configuracin de DynamoDB
Adems del servicio web de Amazon DynamoDB, AWS proporciona una versin descargable de
DynamoDB que puede ejecutar en su equipo. La versin descargable le permite crear y probar
aplicaciones localmente sin obtener acceso al servicio web de DynamoDB.
En los temas de esta seccin se describe cmo configurar DynamoDB (versin descargable) y el servicio
web de DynamoDB.
Temas
Configuracin de la versin de DynamoDB local (descargable) (p. 44)
Configuracin de DynamoDB (servicio web) (p. 49)
El uso de una versin local supone un ahorro en cuanto a desempeo aprovisionado, almacenamiento de
datos y tarifas de transferencia de datos. Adems, no es necesario disponer de una conexin a Internet
mientras se desarrolla la aplicacin.
Temas
Descargar y ejecutar DynamoDB en su equipo (p. 44)
Configuracin del punto de enlace local (p. 47)
Notas de uso (p. 48)
Para ejecutar DynamoDB en su equipo, debe disponer de Java Runtime Environment (JRE)
versin 6.x o posterior. La aplicacin no se ejecuta en versiones anteriores de JRE.
2. Despus de descargar el archivo, extraiga el contenido y copie el directorio extrado en la ubicacin
que prefiera.
3. Para iniciar DynamoDB en el equipo, abra una ventana del smbolo del sistema, vaya al directorio
donde ha extrado DynamoDBLocal.jar y escriba el comando siguiente:
Note
DynamoDB procesa las solicitudes entrantes hasta que lo detiene. Para detener DynamoDB,
escriba Ctrl+C en la ventana del smbolo del sistema.
DynamoDB utiliza el puerto 8000 de forma predeterminada. Si el puerto 8000 no est
disponible, este comando genera una excepcin. Para obtener una lista completa de
opciones de tiempo de ejecucin de DynamoDB, incluida -port, escriba este comando:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -
help
1. Descargue e instale Apache Maven. Para obtener ms informacin, consulte Downloading Apache
Maven e Installing Apache Maven.
2. Agregue el repositorio de Maven para DynamoDB al archivo POM (Project Object Model) de la
aplicacin:
API Version 2012-08-10
45
Amazon DynamoDB Developer Guide
Descargar y ejecutar DynamoDB en su equipo
<!--Dependency:-->
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>DynamoDBLocal</artifactId>
<version>[1.11,2.0)</version>
</dependency>
</dependencies>
<!--Custom repository:-->
<repositories>
<repository>
<id>dynamodb-local-oregon</id>
<name>DynamoDB Local Release Repository</name>
<url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>
</repository>
</repositories>
Note
Si lo prefiere, puede usar una de las direcciones URL de repositorio siguientes, segn cul
sea su regin:
id Repository URL
dynamodb-local-mumbai https://s3.ap-south-1.amazonaws.com/
dynamodb-local-mumbai/release
dynamodb-local-singapore https://s3-ap-southeast-1.amazonaws.com/
dynamodb-local-singapore/release
dynamodb-local-tokyo https://s3-ap-northeast-1.amazonaws.com/
dynamodb-local-tokyo/release
dynamodb-local-frankfurt https://s3.eu-central-1.amazonaws.com/
dynamodb-local-frankfurt/release
dynamodb-local-sao-paulo https://s3-sa-east-1.amazonaws.com/
dynamodb-local-sao-paulo/release
-cors value: habilita la compatibilidad con el uso compartido de recursos entre orgenes (CORS, por
sus siglas en ingls) para JavaScript. Debe proporcionar una lista de dominios especficos "permitidos"
separados por comas. El ajuste predeterminado para -cors es el asterisco (*), que permite el acceso
pblico.
-dbPath value: directorio donde DynamoDB escribe el archivo de base de datos. Si no especifica esta
opcin, el archivo se escribe en el directorio actual. Puede especificar tanto -dbPath como -inMemory
a la vez.
-delayTransientStatuses: hace que DynamoDB introduzca retardos para algunas operaciones.
DynamoDB (versin descargable) puede realizar algunas tareas casi instantneamente, como
operaciones de creacin, actualizacin y eliminacin en tablas e ndices. Sin embargo, el servicio
DynamoDB requiere ms tiempo para estas tareas. El establecimiento de este parmetro ayuda a que
DynamoDB ejecutndose en su equipo simule mejor el comportamiento del servicio web de DynamoDB.
En la actualidad, este parmetro introduce retardos solo para los ndices secundarios globales que se
encuentran en el estado CREATING o DELETING.
-help: imprime un resumen de uso y las opciones posibles.
-inMemory: DynamoDB se ejecuta en memoria, en lugar de usar un archivo de base de datos. Cuando
se detenga DynamoDB, no se guardar ninguno de los datos. Puede especificar tanto -dbPath como -
inMemory a la vez.
-optimizeDbBeforeStartup: optimiza las tablas de la base de datos subyacente antes de iniciar
DynamoDB en el equipo. Si utiliza este parmetro, tambin debe especificar -dbPath.
-port value: nmero de puerto que DynamoDB utiliza para comunicarse con la aplicacin. Si no
especifica esta opcin, el puerto predeterminado es 8000.
Note
http://localhost:8000
Para obtener acceso a la instancia de DynamoDB que se ejecuta localmente, use el parmetro --
endpoint-url. A continuacin se muestra un ejemplo de cmo usar la AWS CLI para obtener una lista
de las tablas de DynamoDB en el equipo:
Note
La AWS CLI no puede usar la versin descargable de DynamoDB como punto de enlace
predeterminado; por consiguiente, es preciso especificar --endpoint-url en cada comando de
la AWS CLI.
AWS SDK
La forma de especificar el punto de enlace depende del lenguaje de programacin y del SDK de AWS que
se utilizan en cada caso. En las secciones siguientes se describe cmo hacerlo:
Note
Notas de uso
Excepto en lo tocante al punto de enlace, las aplicaciones que se ejecutan con la versin descargable de
DynamoDB en el sistema deberan funcionar tambin con el servicio web de DynamoDB. Sin embargo, si
utiliza DynamoDB localmente, debe tener en cuenta lo siguiente:
Si utiliza la opcin -sharedDb, DynamoDB crea un nico archivo de base de datos denominado shared-
local-instance.db. Todos los programas que se conectan con DynamoDB obtienen acceso a este
archivo. Si elimina el archivo, perder todos los datos que haya guardado en l.
Si omite -sharedDb, el archivo de base de datos recibir el nombre myaccesskeyid_region.db, con el ID
de clave de acceso y la regin de AWS que aparecen en la configuracin de la aplicacin. Si elimina el
archivo, perder todos los datos que haya guardado en l.
Si usa la opcin -inMemory, DynamoDB no escribe ningn archivo de base de datos. En lugar de ello,
todos los datos se escriben en la memoria y ninguno de ellos se guarda cuando se cierra DynamoDB.
Si utiliza la opcin -optimizeDbBeforeStartup, tambin debe especificar el parmetro -dbPath
para que DynamoDB pueda encontrar el archivo de base de datos.
Los SDK de AWS para DynamoDB requieren que se especifiquen en la configuracin de la aplicacin
un valor de clave de acceso y un valor de regin de AWS. A no ser que utilice la opcin -sharedDb o -
inMemory, DynamoDB usar estos valores para asignar el nombre al archivo de base de datos local.
Estos valores no tienen que ser valores de AWS vlidos para la ejecucin local. Sin embargo, tal vez le
convenga utilizar valores vlidos para que pueda ejecutar el cdigo en la nube ms adelante cambiando
simplemente el punto de enlace que est utilizando.
a cabo de inmediato y el estado de la tabla siempre es ACTIVE. Las operaciones UpdateTable que
solo cambian los ajustes de desempeo aprovisionado de las tablas y/o los ndices secundarios globales
se realizan de inmediato. Si una operacin UpdateTable crea o elimina un ndices secundario global
o varios, estos ndices pasan sucesivamente por los estados normales (tales como CREATING o
DELETING, respectivamente) antes de entrar en el estado ACTIVE. La tabla permanece en el estado
ACTIVE durante este tiempo.
Las operaciones de lectura son de consistencia final. No obstante, debido a la velocidad de DynamoDB
cuando se ejecuta en el equipo, la mayora de las lecturas parecern ser de coherencia alta.
No se realiza el seguimiento de las unidades de capacidad consumidas. En las respuestas a las
operaciones, se devuelven valores Null en lugar de unidades de capacidad.
No se realiza el seguimiento de las mtricas ni de los tamaos de las colecciones de elementos. En las
respuestas a las operaciones, se devuelven valores Null en lugar de las mtricas de las colecciones de
elementos.
En DynamoDB, existe un lmite de 1MB para los datos devueltos en cada conjunto de resultados.
Tanto el servicio web de DynamoDB como la versin descargable imponen este lmite. Sin embargo, al
consultar un ndice, el servicio de DynamoDB solo calcula el tamao de la clave y los atributos previstos.
En cambio, la versin descargable de DynamoDB calcula el tamao del elemento completo.
Si utiliza Flujos de DynamoDB, la velocidad a la que se crean las particiones puede ser diferente. En
el servicio web de DynamoDB, el comportamiento de creacin de particiones depende en parte de la
actividad de particin de la tabla. Cuando ejecuta DynamoDB localmente, la tabla no se particiona. La
aplicacin no debe depender del comportamiento de los fragmentos, puesto que son efmeros en ambos
casos.
Inscripcin en AWS
Para utilizar el servicio DynamoDB, debe disponer de una cuenta de AWS. Si an no tiene una, se le
pedir que la cree cuando se inscriba. No se le cobrar por los servicios de AWS en los que se inscriba,
salvo si los utiliza.
Parte del procedimiento de inscripcin consiste en recibir una llamada telefnica e introducir un
nmero PIN con el teclado del telfono.
API Version 2012-08-10
49
Amazon DynamoDB Developer Guide
Obtener una clave de acceso de AWS
Las claves de acceso constan de un ID de clave de acceso y una clave de acceso secreta, que se utilizan
para firmar mediante programacin las solicitudes que realiza a AWS. Si no tiene claves de acceso, puede
crearlas desde la Consola de administracin de AWS. Le recomendamos que utilice las claves de acceso
de IAM en lugar de las claves de acceso de la cuenta raz de AWS. IAM le permite controlar de forma
segura el acceso a los servicios de AWS y a los recursos de su cuenta de AWS.
El nico momento en que puede ver o descargar las claves de acceso secretas es cuando crea las claves.
No puede recuperarlas ms adelante. Sin embargo, puede crear nuevas claves de acceso en cualquier
momento. Tambin debe tener permisos para realizar las acciones de IAM requeridas. Para obtener ms
informacin, consulte Granting IAM User Permission to Manage Password Policy and Credentials en la
Gua del usuario de IAM.
Mantenga las claves en secreto para proteger su cuenta y no las enve nunca por correo electrnico.
No las comparta fuera de su organizacin, aunque reciba una peticin que parezca provenir de AWS o
Amazon.com. Nadie que represente legtimamente a Amazon le pedir nunca su clave secreta.
Temas relacionados
Puede hacer esto de varias formas. Por ejemplo, puede crear manualmente el archivo de credenciales
para almacenar el ID de clave de acceso y la clave de acceso secreta de AWS. Tambin puede utilizar el
comando aws configure de la AWS CLI para crear automticamente el archivo. Otra opcin consiste en
usar variables de entorno. Para obtener ms informacin sobre cmo configurar sus credenciales, consulte
la gua para desarrolladores del SDK de AWS especfico de su lenguaje de programacin.
Para instalar y configurar la AWS CLI, consulte Uso de la CLI (p. 52).
Acceso a DynamoDB
Puede tener acceso a Amazon DynamoDB mediante la Consola de administracin de AWS, la AWS
Command Line Interface (AWS CLI) o la API de DynamoDB.
Temas
Uso de la consola (p. 51)
Uso de la CLI (p. 52)
Uso del API (p. 54)
Uso de la consola
Puede obtener acceso a la Consola de administracin de AWS de DynamoDB aqu: https://
console.aws.amazon.com/dynamodb/home.
Monitorizar las alertas recientes, la capacidad total, el estado del servicio y las ltimas noticias de
DynamoDB en el panel de DynamoDB.
Crear, actualizar y eliminar tablas. La calculadora de capacidad ofrece clculos aproximados de cuntas
unidades de capacidad debe solicitar en funcin de la informacin de uso que proporcione.
Administrar secuencias.
Ver, aadir, actualizar y eliminar los elementos almacenados en las tablas. Administrar Tiempo de vida
(TTL) para definir cundo vencen los elementos de una tabla y eliminarlos automticamente de la base
de datos.
Consultar y examinar una tabla.
Configurar y ver alarmas para monitorizar el uso de la capacidad de la tabla. Ver las principales mtricas
de monitorizacin de la tabla en grficos de CloudWatch elaborados en tiempo real.
Modificar la capacidad aprovisionada de una tabla.
Crear y eliminar ndices secundarios globales.
Crear disparadores para conectar las secuencias de DynamoDB con funciones AWS Lambda.
Aplicar etiquetas a los recursos para organizarlos e identificarlos mejor.
Adquirir capacidad reservada.
La consola muestra una pantalla de introduccin que le pide que cree la primera tabla. Para ver las tabla,
elija Tables en el panel de navegacin del lado izquierdo de la consola.
A continuacin encontrar informacin general sobre las acciones disponibles para las tablas en cada
pestaa de navegacin:
Overview: permite consultar los detalles de las secuencias y tablas y administrar secuencias y Tiempo
de vida (TTL).
Items: permite administrar elementos y llevar a cabo consultas y exmenes.
Metrics: permite monitorizar las mtricas de CloudWatch.
Alarms: permite administrar las alarmas de CloudWatch.
Capacity: permite modificar la capacidad aprovisionada de una tabla.
Indexes: permite administrar ndices secundarios globales.
Triggers: permite administrar los disparadores para conectar secuencias de DynamoDB con funciones
Lambda.
Access control: permite configurar un control de acceso preciso con las identidades web federadas.
Tags: permite aplicar etiquetas a los recursos para organizarlos e identificarlos mejor.
Uso de la CLI
Puede usar la AWS Command Line Interface (AWS CLI) para controlar varios servicios de AWS desde
la lnea de comandos y automatizarlos mediante scripts. Puede usar la AWS CLI para operaciones ad-
hoc, como crear una tabla. Tambin puede usarla para incluir operaciones de DynamoDB en scripts de
utilidades.
Para poder utilizar la AWS CLI con DynamoDB, debe obtener un ID de clave de acceso y una clave de
acceso secreta. Para obtener ms informacin, consulte Obtener una clave de acceso de AWS (p. 50).
Para obtener un listado completo de todos los comandos disponibles para DynamoDB en la AWS CLI,
visite http://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html.
Temas
Descarga y configuracin de la AWS CLI (p. 52)
Uso de la AWS CLI con DynamoDB (p. 53)
Uso de la AWS CLI con la versin descargable de DynamoDB (p. 54)
Por ejemplo, el comando siguiente crea una tabla llamada Music. La clave de particin es Artist y la de
ordenacin, SongTitle. Para facilitar la legibilidad, los comandos largos de esta seccin se dividen en
lneas separadas.
Los comandos siguientes aaden nuevos elementos a la tabla. En estos ejemplos se usa una combinacin
de sintaxis abreviada y JSON.
Puede ser difcil crear cdigo JSON vlido en la lnea de comandos. Sin embargo, la AWS CLI puede leer
archivos JSON. Por ejemplo, fjese en el fragmento de cdigo JSON siguiente, que se almacena en un
archivo denominado key-conditions.json:
{
"Artist": {
"AttributeValueList": [
{
"S": "No One You Know"
}
],
"ComparisonOperator": "EQ"
},
"SongTitle": {
"AttributeValueList": [
{
"S": "Call Me Today"
}
],
"ComparisonOperator": "EQ"
}
}
Ahora puede emitir una solicitud de Query con la AWS CLI. En este ejemplo, el contenido del archivo key-
conditions.json se usa para el parmetro --key-conditions:
--endpoint-url http://localhost:8000
A continuacin se incluye un ejemplo en el que se usa la AWS CLI para mostrar las tablas de una base de
datos local:
Si DynamoDB utiliza un nmero de puerto distinto del predeterminado (8000), modifique el valor de --
endpoint-url en consecuencia.
Note
La AWS CLI no puede utilizar la versin descargable de DynamoDB como punto de enlace
predeterminado. Por lo tanto, debe especificar --endpoint-url con cada comando.
Los SDK de AWS ofrecen una amplia compatibilidad con DynamoDB en Java, JavaScript en el navegador,
.NET, Node.js, PHP, Python, Ruby, C++, Go, Android e iOS. Para comenzar rpidamente a trabajar con
estos lenguajes, consulte Introduccin a DynamoDB (p. 55).
Para poder utilizar los SDK de AWS con DynamoDB, debe obtener un ID de clave de acceso y una clave
de acceso secreta de AWS. Para obtener ms informacin, consulte Configuracin de DynamoDB (servicio
web) (p. 49).
Para obtener informacin general sobre la programacin de aplicaciones de DynamoDB con los SDK de
AWS, consulte Programacin con DynamoDB y los SDK de AWS (p. 186).
Introduccin a DynamoDB
Esta seccin contiene tutoriales prcticos para ayudarle a conocer Amazon DynamoDB. Le recomendamos
que realice alguno de los tutoriales especficos de los distintos lenguajes. El cdigo de muestra de estos
tutoriales se puede ejecutar en la versin descargable de DynamoDB o en el servicio web de Amazon
DynamoDB.
Note
Los SDK de AWS estn disponibles para una amplia variedad de lenguajes. Para obtener una
lista completa, consulte Herramientas para Amazon Web Services.
Temas
Java y DynamoDB (p. 55)
JavaScript y DynamoDB (p. 72)
Node.js y DynamoDB (p. 93)
.NET y DynamoDB (p. 107)
PHP y DynamoDB (p. 136)
Python y DynamoDB (p. 154)
Ruby y DynamoDB (p. 169)
Java y DynamoDB
En este tutorial, utilizaremos el AWS SDK for Java para escribir programas sencillos que lleven a cabo las
operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies y cargar ejemplos de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
Ejecutar consultas sencillas.
SDK para Java ofrece varios modelos de programacin para diferentes casos de uso. En este ejercicio, en
el cdigo Java se utiliza el modelo de documento, que proporciona un nivel de abstraccin que facilita el
trabajo con documentos JSON.
En este tutorial se utiliza la versin descargable de DynamoDB. Para obtener informacin sobre cmo
ejecutar el mismo cdigo en el servicio web de DynamoDB, consulte el Resumen (p. 72).
Mientras realiza este tutorial, puede consultar la AWS SDK for Java API Reference.
Requisitos previos
Descargue y ejecute DynamoDB en el equipo. Para obtener ms informacin, consulte Configuracin de
la versin de DynamoDB local (descargable) (p. 44).
DynamoDB (versin descargable) tambin est disponible como parte de AWS Toolkit for Eclipse. Para
obtener ms informacin, consulte AWS Toolkit For Eclipse.
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Configure el AWS SDK for Java:
Instale un entorno de desarrollo de Java. Si utiliza el IDE de Eclipse, instale AWS Toolkit for Eclipse.
Instale el AWS SDK for Java.
Configure las credenciales de seguridad de AWS para usarlas con el SDK para Java.
Para obtener instrucciones, consulte Getting Started en la AWS SDK for Java Developer Guide.
package com.amazonaws.codesamples.gsg;
import java.util.Arrays;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
try {
System.out.println("Attempting to create table; please wait...");
Table table = dynamoDB.createTable(tableName,
Arrays.asList(new KeySchemaElement("year", KeyType.HASH), // Partition
// key
new KeySchemaElement("title", KeyType.RANGE)), // Sort key
Arrays.asList(new AttributeDefinition("year", ScalarAttributeType.N),
new AttributeDefinition("title", ScalarAttributeType.S)),
new ProvisionedThroughput(10L, 10L));
table.waitForActive();
System.out.println("Success. Table status: " +
table.getDescription().getTableStatus());
}
catch (Exception e) {
System.err.println("Unable to create table: ");
System.err.println(e.getMessage());
}
}
}
Note
El punto de enlace debe configurarse de modo que indique que est creando la tabla en
DynamoDB en el equipo.
En la llamada createTable, especifique el nombre de la tabla, los atributos de clave
principal y los tipos de datos.
El parmetro ProvisionedThroughput es obligatorio; sin embargo, en la versin
descargable de DynamoDB se hace caso omiso de l. El desempeo provisionado est
fuera del alcance de este ejercicio.
2. Compile y ejecute el programa.
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 58)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 58)
En este escenario se utiliza un ejemplo de archivo de datos que contiene informacin sobre varios miles de
pelculas de IMDb (Internet Movie Database). Los datos de las pelculas se encuentran en formato JSON,
tal y como se muestra en el siguiente ejemplo. Para cada pelcula, se indican el ao, year, el ttulo, title
y un mapa JSON denominado info.
[
{
"year" : ... ,
"title" : ... ,
"info" : { ... }
},
{
"year" : ...,
"title" : ...,
"info" : { ... }
},
...
year y title se utilizan como valores de atributos de clave principal de la tabla Movies.
El resto de los valores info se almacenan en un nico atributo denominado info. Este programa ilustra
cmo almacenar JSON en un atributo de DynamoDB.
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
package com.amazonaws.codesamples.gsg;
import java.io.File;
import java.util.Iterator;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
ObjectNode currentNode;
while (iter.hasNext()) {
currentNode = (ObjectNode) iter.next();
try {
table.putItem(new Item().withPrimaryKey("year", year, "title",
title).withJSON("info",
currentNode.path("info").toString()));
System.out.println("PutItem succeeded: " + year + " " + title);
}
catch (Exception e) {
System.err.println("Unable to add movie: " + year + " " + title);
System.err.println(e.getMessage());
break;
}
}
parser.close();
}
}
Este programa utiliza la biblioteca Jackson de cdigo abierto para procesar JSON. Jackson se incluye
en el AWS SDK for Java. No es necesario instalarla por separado.
2. Compile y ejecute el programa.
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 60)
Paso 3.2: Leer un elemento (p. 61)
Paso 3.3: Actualizar un elemento (p. 62)
Paso 3.4: Incrementar un contador atmico (p. 64)
Paso 3.5: Actualizar un elemento (condicionalmente) (p. 65)
Paso 3.6: Eliminar un elemento (p. 66)
package com.amazonaws.codesamples.gsg;
import java.util.HashMap;
import java.util.Map;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.PutItemOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
try {
System.out.println("Adding a new item...");
}
catch (Exception e) {
System.err.println("Unable to add item: " + year + " " + title);
System.err.println(e.getMessage());
}
}
}
Note
La clave principal es obligatoria. Este cdigo agrega un elemento que tiene la clave principal
(year, title) y atributos info. El atributo info almacena un ejemplo de cdigo JSON que
proporciona ms informacin sobre la pelcula.
2. Compile y ejecute el programa.
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo getItem para leer el elemento en la tabla Movies. Debe especificar los valores
de clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
package com.amazonaws.codesamples.gsg;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.GetItemSpec;
.build();
try {
System.out.println("Attempting to read the item...");
Item outcome = table.getItem(spec);
System.out.println("GetItem succeeded: " + outcome);
}
catch (Exception e) {
System.err.println("Unable to read item: " + year + " " + title);
System.err.println(e.getMessage());
}
}
}
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
}
import java.util.Arrays;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome;
import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
import com.amazonaws.services.dynamodbv2.model.ReturnValue;
try {
System.out.println("Updating the item...");
UpdateItemOutcome outcome = table.updateItem(updateItemSpec);
System.out.println("UpdateItem succeeded:\n" +
outcome.getItem().toJSONPretty());
}
catch (Exception e) {
System.err.println("Unable to update item: " + year + " " + title);
System.err.println(e.getMessage());
}
}
}
Note
Este programa utiliza una expresin UpdateExpression para describir todas las
actualizaciones que desee realizar con el elemento especificado.
El parmetro ReturnValues indica a DynamoDB que devuelva solamente los atributos
actualizados (UPDATED_NEW).
2. Compile y ejecute el programa.
El programa siguiente muestra cmo aumentar el valor de rating para una pelcula. Cada vez que se
ejecuta, el programa incrementa el valor de este atributo en una unidad.
package com.amazonaws.codesamples.gsg;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome;
import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
import com.amazonaws.services.dynamodbv2.model.ReturnValue;
try {
System.out.println("Incrementing an atomic counter...");
UpdateItemOutcome outcome = table.updateItem(updateItemSpec);
System.out.println("UpdateItem succeeded:\n" +
outcome.getItem().toJSONPretty());
}
catch (Exception e) {
System.err.println("Unable to update item: " + year + " " + title);
System.err.println(e.getMessage());
}
}
}
package com.amazonaws.codesamples.gsg;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.PrimaryKey;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome;
import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
import com.amazonaws.services.dynamodbv2.model.ReturnValue;
}
catch (Exception e) {
System.err.println("Unable to update item: " + year + " " + title);
System.err.println(e.getMessage());
}
}
}
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
3. Modifique el programa para que ConditionExpression tenga el aspecto siguiente:
package com.amazonaws.codesamples.gsg;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.PrimaryKey;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.DeleteItemSpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
try {
System.out.println("Attempting a conditional delete...");
table.deleteItem(deleteItemSpec);
System.out.println("DeleteItem succeeded");
}
catch (Exception e) {
System.err.println("Unable to delete item: " + year + " " + title);
System.err.println(e.getMessage());
}
}
}
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor de year.
Tambin puede proporcionar el atributo title para recuperar un subconjunto de pelculas que cumplan
determinada condicin (segn la clave de ordenacin), como buscar las pelculas estrenadas en 2014 cuyo
ttulo comience por la letra "A".
Adems de query, hay un mtodo scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consultar (p. 67)
Paso 4.2: Examinar (p. 70)
package com.amazonaws.codesamples.gsg;
import java.util.HashMap;
import java.util.Iterator;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.QueryOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec;
try {
System.out.println("Movies from 1985");
items = table.query(querySpec);
iterator = items.iterator();
while (iterator.hasNext()) {
item = iterator.next();
System.out.println(item.getNumber("year") + ": " +
item.getString("title"));
}
catch (Exception e) {
System.err.println("Unable to query movies from 1985");
System.err.println(e.getMessage());
}
valueMap.put(":yyyy", 1992);
valueMap.put(":letter1", "A");
valueMap.put(":letter2", "L");
try {
System.out.println("Movies from 1992 - titles A-L, with genres and lead
actor");
items = table.query(querySpec);
iterator = items.iterator();
while (iterator.hasNext()) {
item = iterator.next();
System.out.println(item.getNumber("year") + ": " +
item.getString("title") + " " + item.getMap("info"));
}
}
catch (Exception e) {
System.err.println("Unable to query movies from 1992:");
System.err.println(e.getMessage());
}
}
}
Note
nameMap permite sustituir nombres. Se utiliza porque year es una palabra reservada
en DynamoDB, por lo que no se puede utilizar directamente en una expresin, incluida
KeyConditionExpression. Para solucionar este problema se utiliza el nombre de
atributo de expresin #yr.
valueMap permite sustituir valores. Se utiliza porque no se pueden utilizar literales en
ninguna expresin, incluida KeyConditionExpression. Para solucionar este problema
se utiliza el valor de atributo de expresin :yyyy.
En primer lugar, se crea el objeto querySpec, que describe los parmetros de consulta. A
continuacin, se pasa el objeto al mtodo query.
2. Compile y ejecute el programa.
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal. En
DynamoDB, puede crear si lo desea uno o varios ndices secundarios en una tabla y consultarlos
de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las aplicaciones
mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms informacin,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
package com.amazonaws.codesamples.gsg;
import java.util.Iterator;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.ScanSpec;
import com.amazonaws.services.dynamodbv2.document.utils.NameMap;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
try {
ItemCollection<ScanOutcome> items = table.scan(scanSpec);
}
catch (Exception e) {
Note
Tambin puede usar la operacin Scan con cualesquiera ndices secundarios que haya creado
en la tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el
acceso a los datos (p. 463).
package com.amazonaws.codesamples.gsg;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
try {
System.out.println("Attempting to delete table; please wait...");
table.delete();
table.waitForDelete();
System.out.print("Success.");
}
catch (Exception e) {
System.err.println("Unable to delete table: ");
System.err.println(e.getMessage());
}
}
}
Resumen
En este tutorial, hemos creado la tabla Movies en DynamoDB en el equipo y realizado las operaciones
bsicas. La versin para descargar de DynamoDB resulta til para tareas de desarrollo y pruebas
de aplicaciones. Sin embargo, cuando la aplicacin est preparada para ejecutarla en un entorno de
produccin, debe modificar el cdigo de modo que utilice el servicio web de Amazon DynamoDB.
import com.amazonaws.client.builder.AwsClientBuilder;
AmazonDynamoDB client =
AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();
3. Ahora, modifique el cliente de forma que obtenga acceso a una regin de AWS en lugar de a un punto
de enlace especfico:
Por ejemplo, si desea obtener acceso a la us-west-2 region, tendra que hacer lo siguiente:
En lugar de utilizar DynamoDB en el equipo, ahora el programa usar el punto de enlace del servicio web
de Amazon DynamoDB de la regin EE.UU. Oeste (Oregn).
Amazon DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa,
consulte Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms
informacin sobre cmo configurar las regiones y los puntos de enlace en el cdigo, consulte AWS Region
Selection en la AWS SDK for Java Developer Guide.
JavaScript y DynamoDB
En este tutorial, utilizaremos JavaScript para escribir programas sencillos que lleven a cabo las
operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies y cargar ejemplos de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
Ejecutar consultas sencillas.
En este tutorial se utiliza la versin descargable de DynamoDB. Para obtener informacin sobre cmo
ejecutar el mismo cdigo en el servicio web de DynamoDB, consulte el Resumen (p. 92).
Mientras realiza este tutorial, puede consultar la AWS SDK for JavaScript API Reference.
Requisitos previos
Descargue y ejecute DynamoDB en el equipo. Para obtener ms informacin, consulte Configuracin de
la versin de DynamoDB local (descargable) (p. 44).
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Configure el AWS SDK for JavaScript. Para ello, agregue o modifique la siguiente etiqueta de script en
las pginas de cdigo HTML:
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
Note
La versin de AWS SDK for JavaScript podra haberse actualizado. Para obtener la ltima
versin, consulte la AWS SDK for JavaScript API Reference.
Habilite el uso compartido de recursos entre orgenes (CORS, Cross-Origin Resource Sharing), para
que pueda producirse la comunicacin entre el navegador del equipo y la versin descargable de
DynamoDB.
1. Descargue la extensin ModHeader gratuita para el navegador Chrome (o cualquier otra extensin
del navegador que permita modificar los encabezados de respuesta HTTP).
2. Ejecute la extensin ModHeader para el navegador Chrome y agregue un encabezado de respuesta
HTTP con el nombre establecido en "Access-Control-Allow-Origin" y el valor "null" o "*".
Important
Esta configuracin solo es necesaria si ejecuta el programa del tutorial para JavaScript
en el equipo. Una vez que haya completado el tutorial, debe deshabilitar o eliminar esta
configuracin.
3. Ahora, ya puede ejecutar los archivos del programa del tutorial de JavaScript.
Si prefiere ejecutar una versin completa del programa del tutorial de JavaScript en lugar de realizar
instrucciones paso a paso, haga lo siguiente:
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function createMovies() {
var params = {
TableName : "Movies",
KeySchema: [
{ AttributeName: "year", KeyType: "HASH"},
{ AttributeName: "title", KeyType: "RANGE" }
],
AttributeDefinitions: [
{ AttributeName: "year", AttributeType: "N" },
{ AttributeName: "title", AttributeType: "S" }
],
ProvisionedThroughput: {
ReadCapacityUnits: 5,
WriteCapacityUnits: 5
}
};
</script>
</head>
<body>
<input id="createTableButton" type="button" value="Create Table"
onclick="createMovies();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Note
El punto de enlace debe configurarse de modo que indique que est creando la tabla en
DynamoDB en el equipo.
En la funcin createMovies, especifique el nombre de la tabla, los atributos de clave
principal y los tipos de datos.
El parmetro ProvisionedThroughput es obligatorio; sin embargo, en la versin
descargable de DynamoDB se hace caso omiso de l. El desempeo provisionado est
fuera del alcance de este tutorial.
2. Abra el archivo MoviesCreateTable.html en el navegador.
3. Seleccione Create Table.
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 76)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 76)
En este escenario se utiliza un ejemplo de archivo de datos que contiene informacin sobre varios miles de
pelculas de IMDb (Internet Movie Database). Los datos de las pelculas se encuentran en formato JSON,
tal y como se muestra en el siguiente ejemplo. Para cada pelcula, se indican el ao, year, el ttulo, title
y un mapa JSON denominado info.
[
{
"year" : ... ,
"title" : ... ,
"info" : { ... }
},
{
"year" : ...,
"title" : ...,
"info" : { ... }
},
...
year y title se utilizan como valores de atributos de clave principal de la tabla Movies.
El resto de los valores info se almacenan en un nico atributo denominado info. Este programa ilustra
cmo almacenar JSON en un atributo de DynamoDB.
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script type="text/javascript">
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
function processFile(evt) {
document.getElementById('textarea').innerHTML = "";
document.getElementById('textarea').innerHTML += "Importing movies into DynamoDB.
Please wait..." + "\n";
var file = evt.target.files[0];
if (file) {
var r = new FileReader();
r.onload = function(e) {
var contents = e.target.result;
var allMovies = JSON.parse(contents);
allMovies.forEach(function (movie) {
document.getElementById('textarea').innerHTML += "Processing: " +
movie.title + "\n";
var params = {
TableName: "Movies",
Item: {
"year": movie.year,
"title": movie.title,
"info": movie.info
}
};
docClient.put(params, function (err, data) {
if (err) {
document.getElementById('textarea').innerHTML += "Unable to add
movie: " + count + movie.title + "\n";
document.getElementById('textarea').innerHTML += "Error JSON: "
+ JSON.stringify(err) + "\n";
} else {
document.getElementById('textarea').innerHTML += "PutItem
succeeded: " + movie.title + "\n";
textarea.scrollTop = textarea.scrollHeight;
}
});
});
};
r.readAsText(file);
} else {
alert("Could not read movie data file");
}
}
</script>
</head>
<body>
<input type="file" id="fileinput" accept='application/json'/>
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
<script>
document.getElementById('fileinput').addEventListener('change', processFile,
false);
</script>
</body>
</html>
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 78)
Paso 3.2: Leer un elemento (p. 79)
Paso 3.3: Actualizar un elemento (p. 80)
Paso 3.4: Incrementar un contador atmico (p. 82)
Paso 3.5: Actualizar un elemento (condicionalmente) (p. 83)
Paso 3.6: Eliminar un elemento (p. 85)
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function createItem() {
var params = {
TableName :"Movies",
Item:{
"year": 2015,
"title": "The Big New Movie",
"info":{
"plot": "Nothing happens at all.",
"rating": 0
}
}
};
</script>
</head>
<body>
<input id="createItem" type="button" value="Create Item" onclick="createItem();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Note
La clave principal es obligatoria. Este cdigo agrega un elemento que tiene la clave principal
(year, title) y atributos info. El atributo info almacena un ejemplo de cdigo JSON que
proporciona ms informacin sobre la pelcula.
2. Abra el archivo MoviesItemOps01.html en el navegador.
3. Elija Create Item.
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo get para leer el elemento en la tabla Movies. Debe especificar los valores de
clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
function readItem() {
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
var params = {
TableName: table,
Key:{
"year": year,
"title": title
}
};
docClient.get(params, function(err, data) {
if (err) {
document.getElementById('textarea').innerHTML = "Unable to read item: " +
"\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "GetItem succeeded: " +
"\n" + JSON.stringify(data, undefined, 2);
}
});
}
</script>
</head>
<body>
<input id="readItem" type="button" value="Read Item" onclick="readItem();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
}
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function updateItem() {
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
var params = {
TableName:table,
Key:{
"year": year,
"title": title
},
UpdateExpression: "set info.rating = :r, info.plot=:p, info.actors=:a",
ExpressionAttributeValues:{
":r":5.5,
":p":"Everything happens all at once.",
":a":["Larry", "Moe", "Curly"]
},
ReturnValues:"UPDATED_NEW"
};
</script>
</head>
<body>
<input id="updateItem" type="button" value="Update Item" onclick="updateItem();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Note
Este programa utiliza UpdateExpression para describir todas las actualizaciones que
desee realizar con el elemento especificado.
El parmetro ReturnValues indica a DynamoDB que devuelva solamente los atributos
actualizados ("UPDATED_NEW").
2. Abra el archivo MoviesItemOps03.html en el navegador.
3. Elija Update Item.
El programa siguiente muestra cmo aumentar el valor de rating para una pelcula. Cada vez que se
ejecuta, el programa incrementa el valor de este atributo en una unidad.
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function increaseRating() {
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
var params = {
TableName:table,
Key:{
"year": year,
"title": title
},
UpdateExpression: "set info.rating = info.rating + :val",
ExpressionAttributeValues:{
":val":1
},
ReturnValues:"UPDATED_NEW"
};
</script>
</head>
<body>
<input id="increaseRating" type="button" value="Increase Rating"
onclick="increaseRating();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function conditionalUpdate() {
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
</script>
</head>
<body>
<input id="conditionalUpdate" type="button" value="Conditional Update"
onclick="conditionalUpdate();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
4. Modifique el programa para que ConditionExpression tenga el aspecto siguiente:
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function conditionalDelete() {
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
var params = {
TableName:table,
Key:{
"year":year,
"title":title
},
ConditionExpression:"info.rating <= :val",
ExpressionAttributeValues: {
":val": 5.0
}
};
if (err) {
document.getElementById('textarea').innerHTML = "The conditional delete
failed: " + "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "The conditional delete
succeeded: " + "\n" + JSON.stringify(data, undefined, 2);
}
});
}
</script>
</head>
<body>
<input id="conditionalDelete" type="button" value="Conditional Delete"
onclick="conditionalDelete();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
var params = {
TableName:table,
Key:{
"title":title,
"year":year
}
};
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor de year.
Tambin puede proporcionar el atributo title para recuperar un subconjunto de pelculas que cumplan
determinada condicin (segn la clave de ordenacin), como buscar las pelculas estrenadas en 2014 cuyo
ttulo comience por la letra "A".
Adems de query, hay un mtodo scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consulta de todas las pelculas estrenadas durante un ao (p. 87)
Paso 4.2: Consulta de todas las pelculas estrenadas durante un ao con unos ttulos
determinados (p. 88)
Paso 4.3: Examinar (p. 89)
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function queryData() {
document.getElementById('textarea').innerHTML += "Querying for movies from 1985.";
var params = {
TableName : "Movies",
KeyConditionExpression: "#yr = :yyyy",
ExpressionAttributeNames:{
"#yr": "year"
},
ExpressionAttributeValues: {
":yyyy":1985
}
};
</script>
</head>
<body>
<input id="queryData" type="button" value="Query" onclick="queryData();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Note
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal. En
DynamoDB, puede crear si lo desea uno o varios ndices secundarios en una tabla y consultarlos
de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las aplicaciones
mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms informacin,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function queryData() {
document.getElementById('textarea').innerHTML += "Querying for movies from 1985.";
var params = {
TableName : "Movies",
ProjectionExpression:"#yr, title, info.genres, info.actors[0]",
KeyConditionExpression: "#yr = :yyyy and title between :letter1 and :letter2",
ExpressionAttributeNames:{
"#yr": "year"
},
ExpressionAttributeValues: {
":yyyy":1992,
":letter1": "A",
":letter2": "L"
}
};
</script>
</head>
<body>
<input id="queryData" type="button" value="Query" onclick="queryData();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function scanData() {
document.getElementById('textarea').innerHTML += "Scanning Movies table." + "\n";
var params = {
TableName: "Movies",
ProjectionExpression: "#yr, title, info.rating",
FilterExpression: "#yr between :start_yr and :end_yr",
ExpressionAttributeNames: {
"#yr": "year",
},
ExpressionAttributeValues: {
":start_yr": 1950,
":end_yr": 1959
}
};
docClient.scan(params, onScan);
</script>
</head>
<body>
<input id="scanData" type="button" value="Scan" onclick="scanData();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Note
Tambin puede usar la operacin Scan con cualesquiera ndices secundarios que haya creado
en la tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el
acceso a los datos (p. 463).
<html>
<head>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script>
<script>
AWS.config.update({
region: "us-west-2",
endpoint: 'http://localhost:8000',
// accessKeyId default can be used while using the downloadable version of DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
accessKeyId: "fakeMyKeyId",
// secretAccessKey default can be used while using the downloadable version of
DynamoDB.
// For security reasons, do not store AWS Credentials in your files. Use Amazon
Cognito instead.
secretAccessKey: "fakeSecretAccessKey"
});
function deleteMovies() {
var params = {
TableName : "Movies"
};
</script>
</head>
<body>
<input id="deleteTableButton" type="button" value="Delete Table"
onclick="deleteMovies();" />
<br><br>
<textarea readonly id= "textarea" style="width:400px; height:800px"></textarea>
</body>
</html>
Resumen
En este tutorial, hemos creado la tabla Movies en DynamoDB en el equipo y realizado las operaciones
bsicas. La versin para descargar de DynamoDB resulta til para tareas de desarrollo y pruebas
de aplicaciones. Sin embargo, cuando la aplicacin est preparada para ejecutarla en un entorno de
produccin, debe modificar el cdigo de modo que utilice el servicio web de Amazon DynamoDB.
AWS.config.update({region: "aws-region"});
AWS.config.update({region: "us-west-2"});
Ahora, el programa utiliza el servicio web de Amazon DynamoDB en la regin EE.UU. Oeste (Oregn).
DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa, consulte
Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms informacin
sobre cmo configurar las regiones y los puntos de enlace en el cdigo, consulte Setting the Region en la
AWS SDK for JavaScript Getting Started Guide.
Para obtener ms informacin, consulte Configuracin de las credenciales de AWS en los archivos
mediante Amazon Cognito (p. 725).
Node.js y DynamoDB
En este tutorial, utilizaremos el AWS SDK for JavaScript para escribir programas sencillos que lleven a
cabo las operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies y cargar ejemplos de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
Ejecutar consultas sencillas.
En este tutorial se utiliza la versin descargable de DynamoDB. Para obtener informacin sobre cmo
ejecutar el mismo cdigo en el servicio web de DynamoDB, consulte el Resumen (p. 107).
Mientras realiza este tutorial, puede consultar la AWS SDK for JavaScript API Reference.
Requisitos previos
Descargue y ejecute DynamoDB en el equipo. Para obtener ms informacin, consulte Configuracin de
la versin de DynamoDB local (descargable) (p. 44).
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Configure el AWS SDK for JavaScript:
Vaya a http://nodejs.org e instale Node.js.
Vaya a https://aws.amazon.com/sdk-for-node-js e instale el AWS SDK for JavaScript.
Para obtener ms informacin, consulte la AWS SDK for JavaScript Getting Started Guide.
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName : "Movies",
KeySchema: [
{ AttributeName: "year", KeyType: "HASH"}, //Partition key
{ AttributeName: "title", KeyType: "RANGE" } //Sort key
],
AttributeDefinitions: [
{ AttributeName: "year", AttributeType: "N" },
Note
El punto de enlace debe configurarse de modo que indique que est creando la tabla en
DynamoDB en el equipo.
En la llamada createTable, especifique el nombre de la tabla, los atributos de clave
principal y los tipos de datos.
El parmetro ProvisionedThroughput es obligatorio; sin embargo, en la versin
descargable de DynamoDB se hace caso omiso de l. El desempeo provisionado est
fuera del alcance de este ejercicio.
2. Para ejecutar el programa, escriba el siguiente comando:
node MoviesCreateTable.js
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 95)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 95)
Utilizamos un ejemplo de archivo de datos que contiene informacin sobre varios miles de pelculas de
IMDb (Internet Movie Database). Los datos de las pelculas se encuentran en formato JSON, tal y como se
muestra en el siguiente ejemplo. Para cada pelcula, se indican el ao, year, el ttulo, title y un mapa
JSON denominado info.
[
{
"year" : ... ,
"title" : ... ,
"info" : { ... }
},
{
"year" : ...,
"title" : ...,
"info" : { ... }
},
...
year y title se utilizan como valores de atributos de clave principal de la tabla Movies.
El resto de los valores info se almacenan en un nico atributo denominado info. Este programa ilustra
cmo almacenar JSON en un atributo de DynamoDB.
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
node MoviesLoadData.js
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 96)
Paso 3.2: Leer un elemento (p. 97)
Paso 3.3: Actualizar un elemento (p. 98)
Paso 3.4: Incrementar un contador atmico (p. 100)
Paso 3.5: Actualizar un elemento (condicionalmente) (p. 100)
Paso 3.6: Eliminar un elemento (p. 102)
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName:table,
Item:{
"year": year,
"title": title,
"info":{
"plot": "Nothing happens at all.",
"rating": 0
}
}
};
Note
La clave principal es obligatoria. Este cdigo agrega un elemento que tiene la clave principal
(year, title) y atributos info. El atributo info almacena un ejemplo de cdigo JSON que
proporciona ms informacin sobre la pelcula.
2. Para ejecutar el programa, escriba el siguiente comando:
node MoviesItemOps01.js
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo get para leer el elemento en la tabla Movies. Debe especificar los valores de
clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName: table,
Key:{
"year": year,
"title": title
}
};
node MoviesItemOps02.js
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName:table,
Key:{
"year": year,
"title": title
},
UpdateExpression: "set info.rating = :r, info.plot=:p, info.actors=:a",
ExpressionAttributeValues:{
":r":5.5,
":p":"Everything happens all at once.",
":a":["Larry", "Moe", "Curly"]
},
ReturnValues:"UPDATED_NEW"
};
Note
Este programa utiliza UpdateExpression para describir todas las actualizaciones que
desee realizar con el elemento especificado.
El parmetro ReturnValues indica a DynamoDB que devuelva solamente los atributos
actualizados ("UPDATED_NEW").
2. Para ejecutar el programa, escriba el siguiente comando:
node MoviesItemOps03.js
El programa siguiente muestra cmo aumentar el valor de rating para una pelcula. Cada vez que se
ejecuta, el programa incrementa el valor de este atributo en una unidad.
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName:table,
Key:{
"year": year,
"title": title
},
UpdateExpression: "set info.rating = info.rating + :val",
ExpressionAttributeValues:{
":val":1
},
ReturnValues:"UPDATED_NEW"
};
node MoviesItemOps04.js
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName:table,
Key:{
"year": year,
"title": title
},
UpdateExpression: "remove info.actors[0]",
ConditionExpression: "size(info.actors) > :num",
ExpressionAttributeValues:{
":num":3
},
ReturnValues:"UPDATED_NEW"
};
node MoviesItemOps05.js
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
3. Modifique el programa para que ConditionExpression tenga el aspecto siguiente:
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName:table,
Key:{
"year":year,
"title":title
},
ConditionExpression:"info.rating <= :val",
ExpressionAttributeValues: {
":val": 5.0
}
};
node MoviesItemOps06.js
var params = {
TableName:table,
Key:{
"title":title,
"year":year
}
};
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor de year.
Tambin puede proporcionar el atributo title para recuperar un subconjunto de pelculas que cumplan
determinada condicin (segn la clave de ordenacin), como buscar las pelculas estrenadas en 2014 cuyo
ttulo comience por la letra "A".
Adems de query, hay un mtodo scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consulta de todas las pelculas estrenadas durante un ao (p. 103)
Paso 4.2: Consulta de todas las pelculas estrenadas durante un ao con unos ttulos
determinados (p. 104)
Paso 4.3: Examinar (p. 105)
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName : "Movies",
KeyConditionExpression: "#yr = :yyyy",
ExpressionAttributeNames:{
"#yr": "year"
},
ExpressionAttributeValues: {
":yyyy":1985
}
};
Note
node MoviesQuery01.js
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal. En
DynamoDB, puede crear si lo desea uno o varios ndices secundarios en una tabla y consultarlos
de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las aplicaciones
mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms informacin,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
console.log("Querying for movies from 1992 - titles A-L, with genres and lead actor");
var params = {
TableName : "Movies",
ProjectionExpression:"#yr, title, info.genres, info.actors[0]",
KeyConditionExpression: "#yr = :yyyy and title between :letter1 and :letter2",
ExpressionAttributeNames:{
"#yr": "year"
},
ExpressionAttributeValues: {
":yyyy":1992,
":letter1": "A",
":letter2": "L"
}
};
node MoviesQuery02.js
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName: "Movies",
ProjectionExpression: "#yr, title, info.rating",
FilterExpression: "#yr between :start_yr and :end_yr",
ExpressionAttributeNames: {
"#yr": "year",
},
ExpressionAttributeValues: {
":start_yr": 1950,
":end_yr": 1959
}
};
node MoviesScan.js
Note
Tambin puede usar la operacin Scan con cualesquiera ndices secundarios que ha creado en la
tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el acceso
a los datos (p. 463).
AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});
var params = {
TableName : "Movies"
};
node MoviesDeleteTable.js
Resumen
En este tutorial, hemos creado la tabla Movies en DynamoDB en el equipo y realizado las operaciones
bsicas. La versin para descargar de DynamoDB resulta til para tareas de desarrollo y pruebas
de aplicaciones. Sin embargo, cuando la aplicacin est preparada para ejecutarla en un entorno de
produccin, debe modificar el cdigo de modo que utilice el servicio web de Amazon DynamoDB.
AWS.config.update({endpoint: "https://dynamodb.aws-region.amazonaws.com"});
Por ejemplo, si desea utilizar la regin us-west-2, establezca el punto de enlace siguiente:
AWS.config.update({endpoint: "https://dynamodb.us-west-2.amazonaws.com"});
En lugar de utilizar DynamoDB en el equipo, ahora el programa usar el punto de enlace del servicio web
de DynamoDB de la regin EE.UU. Oeste (Oregn).
Amazon DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa,
consulte Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms
informacin sobre cmo configurar las regiones y los puntos de enlace en el cdigo, consulte Setting the
Region en la AWS SDK for JavaScript Developer Guide.
.NET y DynamoDB
En este tutorial, utilizaremos el AWS SDK para .NET para escribir programas sencillos que lleven a cabo
las operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies mediante un programa de utilidad escrito en C# y cargar ejemplos
de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
Ejecutar consultas sencillas.
El mdulo de DynamoDB del AWS SDK para .NET ofrece varios modelos de programacin para diferentes
casos de uso. En el cdigo C# de este ejercicio, se utiliza el modelo de documento, que proporciona
un nivel de abstraccin que suele resultar ms cmodo, as como el API de bajo nivel, que administra
los atributos anidados con mayor eficacia. Para obtener ms informacin sobre la API del modelo de
documento, consulte .NET: modelo de documento (p. 240). Para obtener informacin sobre la API de
bajo nivel, consulte Uso de tablas: .NET (p. 334).
En este tutorial se utiliza la versin descargable de DynamoDB. Para obtener ms informacin sobre cmo
ejecutar el mismo cdigo en el servicio web de DynamoDB en la nube, consulte el Resumen (p. 135).
Requisitos previos
Utilice un equipo en el que se ejecute una versin reciente de Windows y una versin actual de Microsoft
Visual Studio. Si todava no ha instalado Visual Studio, puede descargar una copia gratuita de la edicin
Community en el sitio web de Microsoft Visual Studio.
Descargue y ejecute DynamoDB (versin descargable). Para obtener ms informacin, consulte
Configuracin de la versin de DynamoDB local (descargable) (p. 44).
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Configure un perfil de seguridad para DynamoDB en Visual Studio. Para obtener instrucciones paso a
paso, consulte Ejemplos de cdigo de .NET (p. 298).
En Visual Studio, cree un nuevo proyecto denominado DynamoDB_intro mediante la plantilla Console
Application del nodo Installed/Templates/Visual C#/. Este es el proyecto que se usa en todo este tutorial.
Note
El siguiente tutorial no funciona con .NET Core, ya que no es compatible con los mtodos
sincrnicos. Para obtener ms informacin, consulte AWS Asynchronous APIs for .NET.
Instale el paquete NuGet para el mdulo de DynamoDB del AWS SDK para .NET, versin 3, en el nuevo
proyecto DynamoDB_intro. Para ello, en Visual Studio, abra la Consola del administrador de paquetes
NuGet en el men Herramientas. A continuacin, escriba el siguiente comando en el smbolo del sistema
PM>:
En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los
siguientes atributos:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
public static void Main(string[] args)
{
// First, set up a DynamoDB client for DynamoDB Local
AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig();
ddbConfig.ServiceURL = "http://localhost:8000";
AmazonDynamoDBClient client;
try
{
client = new AmazonDynamoDBClient(ddbConfig);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create a DynamoDB client; " +
ex.Message);
PauseForDebugWindow();
return;
}
{
createResponse = client.CreateTable(createRequest);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create the new table; " +
ex.Message);
PauseForDebugWindow();
return;
}
Note
En AmazonDynamoDBConfig, establezca ServiceURL en "http://localhost:8000" para
crear la tabla en la versin descargable de DynamoDB que se ejecuta localmente en el
equipo.
En CreateTableRequest, especifique el nombre de la tabla, as como los atributos de
clave principal y sus tipos de datos.
La parte de la clave de particin de la clave principal, que determina la particin lgica
donde DynamoDB almacena un elemento, se identifica en la entrada KeySchemaElement
de la solicitud CreateTableRequest porque el valor de KeyType es "HASH".
La parte de la clave de ordenacin de la clave principal, que determina el orden de los
elementos que tienen el mismo valor de clave de particin, se identifica en la entrada
KeySchemaElement de la solicitud CreateTableRequest porque el valor de KeyType
es "RANGE".
El campo ProvisionedThroughput es obligatorio, aunque en la versin descargable de
DynamoDB se omite.
2. Compile y ejecute el programa.
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 111)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 111)
En este escenario se utiliza un ejemplo de archivo de datos que contiene informacin sobre varios miles de
pelculas de IMDb (Internet Movie Database).
Los datos de pelculas estn codificados como JSON. Para cada pelcula, JSON define un par de nombre-
valor para year, un par de nombre-valor para title y un objeto info complejo, como se muestra en el
ejemplo siguiente:
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
1. En este programa se utiliza la biblioteca Json.NET de Newtonsoft de cdigo abierto para deserializar
los datos de JSON, bajo licencia del MIT (consulte https://github.com/JamesNK/Newtonsoft.Json/blob/
master/LICENSE.md).
Para cargar la biblioteca Json.NET en su proyecto, en Visual Studio, abra la Consola del
administrador de paquetes NuGet en el men Herramientas. A continuacin, escriba el siguiente
comando en el smbolo del sistema PM>:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
using Newtonsoft;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace DynamoDB_intro
{
class Program
{
public static Table GetTableObject(string tableName)
{
// First, set up a DynamoDB client for DynamoDB Local
AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig();
ddbConfig.ServiceURL = "http://localhost:8000";
AmazonDynamoDBClient client;
try
{
client = new AmazonDynamoDBClient(ddbConfig);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create a DynamoDB client; " +
ex.Message);
return (null);
}
}
finally
{
if (jtr != null)
jtr.Close();
if (sr != null)
sr.Close();
}
// Get a Table object for the table that you created in Step 1
Table table = GetTableObject("Movies");
if (table == null)
{
PauseForDebugWindow();
return;
}
// Load the movie data into the table (this could take some time)
Console.Write("\n Now writing {0:#,##0} movie records from moviedata.json
(might take 15 minutes)...\n ...completed: ", movieArray.Count);
for (int i = 0, j = 99; i < movieArray.Count; i++)
{
try
{
string itemJson = movieArray[i].ToString();
Document doc = Document.FromJson(itemJson);
table.PutItem(doc);
}
catch (Exception ex)
{
Console.WriteLine("\nError: Could not write the movie record
#{0:#,##0}, because {1}", i, ex.Message);
PauseForDebugWindow();
return;
}
if (i >= j)
{
j++;
Console.Write("{0,5:#,##0}, ", j);
if (j % 1000 == 0)
Console.Write("\n ");
j += 99;
}
}
Console.WriteLine("\n Finished writing all movie records to DynamoDB!");
PauseForDebugWindow();
}
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 114)
Paso 3.2: Leer un elemento (p. 115)
Paso 3.3: Actualizar un elemento (p. 117)
Paso 3.4: Incrementar un contador atmico (p. 120)
Paso 3.5: Actualizar un elemento (condicionalmente) (p. 122)
Paso 3.6: Eliminar un elemento (p. 125)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get a Table object for the table that you created in Step 1
Table table = GetTableObject("Movies");
if (table == null)
{
PauseForDebugWindow();
return;
}
}
}
Note
La clave principal es obligatoria. En esta tabla, la clave principal es una combinacin de un
atributo de clave de particin (year) y un atributo de clave de ordenacin (title).
El cdigo escribe en la tabla un elemento que tiene los dos atributos de clave principal (year
+ title) y un atributo info complejo que almacena ms informacin acerca de la pelcula.
2. Compile y ejecute el programa.
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo GetItem para leer el elemento en la tabla Movies. Debe especificar los valores
de clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get a Table object for the table that you created in Step 1
Table table = GetTableObject("Movies");
if (table == null)
{
PauseForDebugWindow();
return;
}
try
{
Document document = table.GetItem(2015, "The Big New Movie");
if (document != null)
Console.WriteLine("\nGetItem succeeded: \n" +
document.ToJsonPretty());
else
Console.WriteLine("\nGetItem succeeded, but the item was not
found");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get an AmazonDynamoDBClient for the local database
AmazonDynamoDBClient client = GetLocalClient();
if (client == null)
{
PauseForDebugWindow();
return;
}
uir = client.UpdateItem(updateRequest);
}
catch (Exception ex)
{
Console.WriteLine("\nError: UpdateItem failed, because: " +
ex.Message);
if (uir != null)
Console.WriteLine(" Status code was " +
uir.HttpStatusCode.ToString());
PauseForDebugWindow();
return;
}
// Get the item from the table and display it to validate that the update
succeeded
DisplayMovieItem(client, "2015", "The Big New Movie");
}
}
}
}
Note
Puesto que el modelo de documento del AWS SDK para .NET no admite la actualizacin
de atributos anidados, debe usar la API AmazonDynamoDBClient.UpdateItem en lugar
de Table.UpdateItem para actualizar los atributos incluidos en el atributo info de nivel
superior.
Para ello, cree una solicitud UpdateItemRequest que especifique el elemento que desea
actualizar y los nuevos valores que desea establecer.
El programa siguiente incrementa el valor de rating para una pelcula. Cada vez que se ejecuta, el
programa incrementa el valor de este atributo en una unidad. De nuevo, la expresin UpdateExpression
es la que determina lo que sucede:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get an AmazonDynamoDBClient for the local database
AmazonDynamoDBClient client = GetLocalClient();
if (client == null)
{
PauseForDebugWindow();
return;
}
// Get the item from the table and display it to validate that the update
succeeded
DisplayMovieItem(client, "2015", "The Big New Movie");
}
{
// Create Primitives for the HASH and RANGE portions of the primary key
Primitive hash = new Primitive(year, true);
Primitive range = new Primitive(title, false);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get an AmazonDynamoDBClient for the local database
AmazonDynamoDBClient client = GetLocalClient();
if (client == null)
{
PauseForDebugWindow();
return;
}
// Get the item from the table and display it to validate that the update
succeeded
DisplayMovieItem(client, "2015", "The Big New Movie");
}
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create a DynamoDB client; " +
ex.Message);
return (null);
}
return (client);
}
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
3. Modifique el programa de modo que el nmero de actores utilizado en la expresin
ConditionExpression sea 2 en lugar de 3:
Ahora, la condicin especifica que el nmero de actores debe ser mayor que2.
4. Ahora, al compilar y ejecutar el programa, la operacin UpdateItem debera realizarse
correctamente.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get a Table object for the table that you created in Step 1
Table table = GetTableObject("Movies");
if (table == null)
return;
Console.WriteLine();
}
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor del atributo de
clave de particin, year. Puede agregar el atributo de clave de ordenacin, title, para recuperar un
subconjunto de pelculas que cumplan determinada condicin (segn dicho atributo), como buscar las
pelculas estrenadas en 2014 cuyo ttulo comience por la letra "A".
Adems de Query, hay un mtodo Scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consultar (p. 127)
Paso 4.2: Examinar (p. 131)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static string commaSep = ", ";
static string movieFormatString = " \"{0}\", lead actor: {1}, genres: {2}";
// Get a Table object for the table that you created in Step 1
Table table = GetTableObject(client, "Movies");
if (table == null)
{
PauseForDebugWindow();
return;
}
/*-----------------------------------------------------------------------
* 4.1.1: Call Table.Query to initiate a query for all movies with
* year == 1985, using an empty filter expression.
*-----------------------------------------------------------------------*/
Search search;
try
{
search = table.Query(1985, new Expression());
}
catch (Exception ex)
{
Console.WriteLine("\n Error: 1985 query failed because: " +
ex.Message);
PauseForDebugWindow();
return;
}
/*-----------------------------------------------------------------------
* 4.1.2a: Call Table.Query to initiate a query for all movies where
* year equals 1992 AND title is between "B" and "Hzzz",
* returning the lead actor and genres of each.
*-----------------------------------------------------------------------*/
Primitive y_1992 = new Primitive("1992", true);
QueryOperationConfig config = new QueryOperationConfig();
config.Filter = new QueryFilter();
config.Filter.AddCondition("year", QueryOperator.Equal, new DynamoDBEntry[]
{ 1992 });
config.Filter.AddCondition("title", QueryOperator.Between, new
DynamoDBEntry[] { "B", "Hzz" });
config.AttributesToGet = new List<string> { "title", "info" };
config.Select = SelectValues.SpecificAttributes;
try
{
search = table.Query(config);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: 1992 query failed because: " +
ex.Message);
PauseForDebugWindow();
return;
}
"\n-----------------------------------------------------------------------------");
docList = new List<Document>();
Document infoDoc;
do
{
try
{
docList = search.GetNextSet();
}
catch (Exception ex)
{
Console.WriteLine("\n Error: Search.GetNextStep failed because: " +
ex.Message);
break;
}
foreach (var doc in docList)
{
infoDoc = doc["info"].AsDocument();
Console.WriteLine(movieFormatString,
doc["title"],
infoDoc["actors"].AsArrayOfString()[0],
string.Join(commaSep,
infoDoc["genres"].AsArrayOfString()));
}
} while (!search.IsDone);
/*-----------------------------------------------------------------------
* 4.1.2b: Call AmazonDynamoDBClient.Query to initiate a query for all
* movies where year equals 1992 AND title is between M and Tzz,
* returning the genres and the lead actor of each.
*-----------------------------------------------------------------------*/
QueryRequest qRequest = new QueryRequest
{
TableName = "Movies",
ExpressionAttributeNames = new Dictionary<string, string>
{
{ "#yr", "year" }
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":y_1992", new AttributeValue {
N = "1992"
} },
{ ":M", new AttributeValue {
S = "M"
} },
{ ":Tzz", new AttributeValue {
S = "Tzz"
} }
},
KeyConditionExpression = "#yr = :y_1992 and title between :M and :Tzz",
ProjectionExpression = "title, info.actors[0], info.genres"
};
QueryResponse qResponse;
try
{
qResponse = client.Query(qRequest);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: Low-level query failed, because: " +
ex.Message);
PauseForDebugWindow();
return;
}
"\n-------------------------------------------------------------------------");
foreach (Dictionary<string, AttributeValue> item in qResponse.Items)
{
Dictionary<string, AttributeValue> info = item["info"].M;
Console.WriteLine(movieFormatString,
item["title"].S,
info["actors"].L[0].S,
GetDdbListAsString(info["genres"].L));
}
}
Note
En la primera consulta, para todas las pelculas estrenadas en 1985, una expresin vaca
indica que no se desea aplicar ningn filtrado de la clave principal basado en la clave de
ordenacin.
En la segunda consulta, que utiliza el modelo de documento del AWS SDK para .NET para
consultar todas las pelculas estrenadas en 1992 cuyos ttulos comiencen por las letras de
la "A" a la "L", puede consultar solamente los atributos de nivel superior. Por lo tanto, debe
recuperar el atributo info completo. A continuacin, el cdigo de visualizacin obtiene
acceso a los atributos anidados que le interesan.
En la tercera consulta, usa la API de bajo nivel de AWS SDK para .NET, que ofrece
ms control sobre lo que se devuelve. Aqu, s puede recuperar solamente los
atributos anidados en el atributo info que le interesan, a saber, info.genres e
info.actors[0].
2. Compile y ejecute el programa.
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal.
En DynamoDB, tambin puede crear si lo desea uno o varios ndices secundarios en una tabla y
consultarlos de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las
aplicaciones mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms
informacin, consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get an AmazonDynamoDBClient for the local DynamoDB database
AmazonDynamoDBClient client = GetLocalClient();
// Get a Table object for the table that you created in Step 1
Table table = GetTableObject(client, "Movies");
if (table == null)
{
PauseForDebugWindow();
return;
}
/*-----------------------------------------------------------------------
* 4.2a: Call Table.Scan to return the movies released in the 1950's,
* displaying title, year, lead actor and lead director.
*-----------------------------------------------------------------------*/
ScanFilter filter = new ScanFilter();
filter.AddCondition("year", ScanOperator.Between, new DynamoDBEntry[]
{ 1950, 1959 });
ScanOperationConfig config = new ScanOperationConfig
{
AttributesToGet = new List<string> { "year, title, info" },
Filter = filter
};
Search search = table.Scan(filter);
infoDoc["actors"].AsArrayOfString()[0],
infoDoc["directors"].AsArrayOfString()[0]);
}
} while (!search.IsDone);
/*-----------------------------------------------------------------------
* 4.2b: Call AmazonDynamoDBClient.Scan to return all movies released
* in the 1960's, only downloading the title, year, lead
* actor and lead director attributes.
*-----------------------------------------------------------------------*/
ScanRequest sRequest = new ScanRequest
{
TableName = "Movies",
ExpressionAttributeNames = new Dictionary<string, string>
{
{ "#yr", "year" }
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":y_a", new AttributeValue {
N = "1960"
} },
{ ":y_z", new AttributeValue {
N = "1969"
} },
},
FilterExpression = "#yr between :y_a and :y_z",
ProjectionExpression = "#yr, title, info.actors[0], info.directors[0]"
};
ScanResponse sResponse;
try
{
sResponse = client.Scan(sRequest);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: Low-level scan failed, because: " +
ex.Message);
PauseForDebugWindow();
return;
}
El primer examen utiliza el modelo de documento de AWS SDK para .NET para analizar la tabla
Movies y devolver las pelculas estrenadas en la dcada de los 50. Como el modelo de documento
no admite atributos anidados en el campo AttributesToGet, debe descargar todo el atributo
info para tener acceso al actor protagonista y al director.
El segundo examen utiliza la API de bajo nivel de AWS SDK para .NET para analizar la tabla
Movies y devolver las pelculas estrenadas en la dcada de los 60. En este caso, puede descargar
nicamente los valores de los atributos en info que le interesen, es decir, info.actors[0] y
info.directors[0].
2. Compile y ejecute el programa.
Note
Tambin puede usar la operacin Scan con cualesquiera ndices secundarios que ha creado en la
tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el acceso
a los datos (p. 463).
using System;
using System.Text;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
namespace DynamoDB_intro
{
class Program
{
static void Main(string[] args)
{
// Get an AmazonDynamoDBClient for the local DynamoDB database
AmazonDynamoDBClient client = GetLocalClient();
try
{
client.DeleteTable("Movies");
}
catch (Exception ex)
{
Console.WriteLine("\n Error: the \'Movies\" table could not be deleted!
\n Reason: " + ex.Message);
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
return;
}
Console.WriteLine("\n Deleted the \'Movies\" table successfully!");
}
Resumen
En este tutorial, hemos creado la tabla Movies en DynamoDB en el equipo y realizado las operaciones
bsicas. DynamoDB (versin descargable) resulta til para tareas de desarrollo y pruebas de aplicaciones.
Sin embargo, cuando la aplicacin est preparada para ejecutarla en un entorno de produccin, debe
modificar el cdigo de modo que utilice el servicio de Amazon DynamoDB.
ddbConfig.ServiceURL = "http://localhost:8000";
2. Agregue una nueva lnea que especifique la regin de AWS a la que desee obtener acceso:
ddbConfig.RegionEndpoint = RegionEndpoint.REGION;
Por ejemplo, si desea obtener acceso a la us-west-2 region, tendra que hacer lo siguiente:
ddbConfig.RegionEndpoint = RegionEndpoint.USWest2;
En lugar de utilizar la versin descargable de DynamoDB, ahora el programa usar punto de enlace del
servicio de DynamoDB de la regin EE.UU. Oeste (Oregn).
Amazon DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa,
consulte Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms
informacin sobre cmo configurar las regiones y los puntos de enlace en el cdigo, consulte AWS Region
Selection en la AWS SDK para .NET Developer Guide.
PHP y DynamoDB
En este tutorial, utilizaremos el AWS SDK para PHP para escribir programas sencillos que lleven a cabo
las operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies y cargar ejemplos de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
Ejecutar consultas sencillas.
En este tutorial se utiliza la versin descargable de DynamoDB. Para obtener informacin sobre cmo
ejecutar el mismo cdigo en el servicio de DynamoDB, consulte el Resumen (p. 153).
Mientras realiza este tutorial, puede consultar la AWS SDK para PHP Developer Guide. En la seccin
Amazon DynamoDB de la AWS SDK para PHP API Reference se describen los parmetros y los
resultados de las operaciones de DynamoDB.
Requisitos previos
Descargue y ejecute DynamoDB en el equipo. Para obtener ms informacin, consulte Configuracin de
la versin de DynamoDB local (descargable) (p. 44).
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Configure el AWS SDK para PHP:
Vaya a http://php.net e instale PHP.
Vaya a https://aws.amazon.com/sdk-for-php e instale el SDK para PHP.
API Version 2012-08-10
136
Amazon DynamoDB Developer Guide
Paso 1: Crear una tabla
Para obtener ms informacin, consulte Getting Started en la AWS SDK para PHP Getting Started
Guide.
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
$dynamodb = $sdk->createDynamoDb();
$params = [
'TableName' => 'Movies',
'KeySchema' => [
[
'AttributeName' => 'year',
'KeyType' => 'HASH' //Partition key
],
[
'AttributeName' => 'title',
'KeyType' => 'RANGE' //Sort key
]
],
'AttributeDefinitions' => [
[
'AttributeName' => 'year',
'AttributeType' => 'N'
],
[
'AttributeName' => 'title',
'AttributeType' => 'S'
],
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 10,
'WriteCapacityUnits' => 10
]
];
try {
$result = $dynamodb->createTable($params);
echo 'Created table. Status: ' .
$result['TableDescription']['TableStatus'] ."\n";
?>
Note
El punto de enlace debe configurarse de modo que indique que est creando la tabla en
DynamoDB en el equipo.
En la llamada createTable, especifique el nombre de la tabla, los atributos de clave
principal y los tipos de datos.
El parmetro ProvisionedThroughput es obligatorio; sin embargo, en la versin
descargable de DynamoDB se hace caso omiso de l. El desempeo provisionado est
fuera del alcance de este ejercicio.
2. Para ejecutar el programa, escriba el siguiente comando:
php MoviesCreateTable.php
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 139)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 139)
En este escenario se utiliza un ejemplo de archivo de datos que contiene informacin sobre varios miles de
pelculas de IMDb (Internet Movie Database). Los datos de las pelculas se encuentran en formato JSON,
tal y como se muestra en el siguiente ejemplo. Para cada pelcula, se indican el ao, year, el ttulo, title
y un mapa JSON denominado info.
[
{
"year" : ... ,
"title" : ... ,
"info" : { ... }
},
{
"year" : ...,
"title" : ...,
"info" : { ... }
},
...
year y title se utilizan como valores de atributos de clave principal de la tabla Movies.
El resto de los valores info se almacenan en un nico atributo denominado info. Este programa ilustra
cmo almacenar JSON en un atributo de DynamoDB.
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = $movie['year'];
$title = $movie['title'];
$info = $movie['info'];
$json = json_encode([
'year' => $year,
'title' => $title,
'info' => $info
]);
$params = [
'TableName' => $tableName,
'Item' => $marshaler->marshalJson($json)
];
try {
$result = $dynamodb->putItem($params);
echo "Added movie: " . $movie['year'] . " " . $movie['title'] . "\n";
} catch (DynamoDbException $e) {
echo "Unable to add movie:\n";
echo $e->getMessage() . "\n";
break;
}
?>
Note
php MoviesLoadData.php
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 141)
Paso 3.2: Leer un elemento (p. 142)
Paso 3.3: Actualizar un elemento (p. 143)
API Version 2012-08-10
140
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = 2015;
$title = 'The Big New Movie';
$item = $marshaler->marshalJson('
{
"year": ' . $year . ',
"title": "' . $title . '",
"info": {
"plot": "Nothing happens at all.",
"rating": 0
}
}
');
$params = [
'TableName' => 'Movies',
'Item' => $item
];
try {
$result = $dynamodb->putItem($params);
echo "Added item: $year - $title\n";
?>
Note
La clave principal es obligatoria. Este cdigo agrega un elemento que tiene la clave principal
(year, title) y atributos info. El atributo info almacena un mapa que proporciona ms
informacin sobre la pelcula.
2. Para ejecutar el programa, escriba el siguiente comando:
php MoviesItemOps01.php
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo getItem para leer el elemento en la tabla Movies. Debe especificar los valores
de clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = 2015;
$title = 'The Big New Movie';
$key = $marshaler->marshalJson('
{
"year": ' . $year . ',
"title": "' . $title . '"
}
');
$params = [
'TableName' => $tableName,
'Key' => $key
];
try {
$result = $dynamodb->getItem($params);
print_r($result["Item"]);
?>
php MoviesItemOps02.php
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
}
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = 2015;
$title = 'The Big New Movie';
$key = $marshaler->marshalJson('
{
"year": ' . $year . ',
"title": "' . $title . '"
}
');
$eav = $marshaler->marshalJson('
{
":r": 5.5 ,
":p": "Everything happens all at once.",
":a": [ "Larry", "Moe", "Curly" ]
}
');
$params = [
'TableName' => $tableName,
'Key' => $key,
'UpdateExpression' =>
'set info.rating = :r, info.plot=:p, info.actors=:a',
'ExpressionAttributeValues'=> $eav,
'ReturnValues' => 'UPDATED_NEW'
];
try {
$result = $dynamodb->updateItem($params);
echo "Updated item.\n";
print_r($result['Attributes']);
?>
Note
Este programa utiliza UpdateExpression para describir todas las actualizaciones que
desee realizar con el elemento especificado.
El parmetro ReturnValues indica a DynamoDB que devuelva solamente los atributos
actualizados (UPDATED_NEW).
2. Para ejecutar el programa, escriba el siguiente comando:
php MoviesItemOps03.php
El programa siguiente muestra cmo aumentar el valor de rating para una pelcula. Cada vez que se
ejecuta, el programa incrementa el valor de este atributo en una unidad.
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = 2015;
$title = 'The Big New Movie';
$key = $marshaler->marshalJson('
{
"year": ' . $year . ',
"title": "' . $title . '"
}
');
$eav = $marshaler->marshalJson('
{
":val": 1
}
');
$params = [
'TableName' => $tableName,
'Key' => $key,
'UpdateExpression' => 'set info.rating = info.rating + :val',
'ExpressionAttributeValues'=> $eav,
'ReturnValues' => 'UPDATED_NEW'
];
try {
$result = $dynamodb->updateItem($params);
echo "Updated item. ReturnValues are:\n";
print_r($result['Attributes']);
?>
php MoviesItemOps04.php
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = 2015;
$title = 'The Big New Movie';
$key = $marshaler->marshalJson('
{
"year": ' . $year . ',
"title": "' . $title . '"
}
');
$eav = $marshaler->marshalJson('
{
":num": 3
}
');
$params = [
'TableName' => $tableName,
'Key' => $key,
'UpdateExpression' => 'remove info.actors[0]',
'ConditionExpression' => 'size(info.actors) > :num',
'ExpressionAttributeValues'=> $eav,
'ReturnValues' => 'UPDATED_NEW'
];
try {
$result = $dynamodb->updateItem($params);
echo "Updated item. ReturnValues are:\n";
print_r($result['Attributes']);
?>
php MoviesItemOps05.php
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
3. Modifique el programa para que ConditionExpression tenga el aspecto siguiente:
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$year = 2015;
$title = 'The Big New Movie';
$key = $marshaler->marshalJson('
{
"year": ' . $year . ',
"title": "' . $title . '"
}
');
$eav = $marshaler->marshalJson('
{
":val": 5
}
');
$params = [
'TableName' => $tableName,
'Key' => $key,
'ConditionExpression' => 'info.rating <= :val',
'ExpressionAttributeValues'=> $eav
];
try {
$result = $dynamodb->deleteItem($params);
echo "Deleted item.\n";
?>
php MoviesItemOps06.php
$params = [
'TableName' => $tableName,
'Key' => $key
];
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor de year.
Tambin puede indicar el valor de title si desea recuperar un subconjunto de pelculas basadas en una
condicin determinada (la clave de ordenacin). Por ejemplo, para encontrar las pelculas estrenadas en
2014 cuyo ttulo comienza por la "A".
Adems de query, hay un mtodo scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consulta de todas las pelculas estrenadas durante un ao (p. 149)
Paso 4.2: Consulta de todas las pelculas estrenadas durante un ao con unos ttulos
determinados (p. 150)
Paso 4.3: Examinar (p. 151)
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();
$tableName = 'Movies';
$eav = $marshaler->marshalJson('
{
":yyyy": 1985
}
');
$params = [
'TableName' => $tableName,
'KeyConditionExpression' => '#yr = :yyyy',
'ExpressionAttributeNames'=> [ '#yr' => 'year' ],
'ExpressionAttributeValues'=> $eav
];
try {
$result = $dynamodb->query($params);
?>
Note
php MoviesItemQuery01.php
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal. En
DynamoDB, puede crear si lo desea uno o varios ndices secundarios en una tabla y consultarlos
de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las aplicaciones
mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms informacin,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$tableName = 'Movies';
$eav = $marshaler->marshalJson('
{
":yyyy":1992,
":letter1": "A",
":letter2": "L"
}
');
$params = [
'TableName' => $tableName,
'ProjectionExpression' => '#yr, title, info.genres, info.actors[0]',
'KeyConditionExpression' =>
'#yr = :yyyy and title between :letter1 and :letter2',
'ExpressionAttributeNames'=> [ '#yr' => 'year' ],
'ExpressionAttributeValues'=> $eav
];
echo "Querying for movies from 1992 - titles A-L, with genres and lead actor\n";
try {
$result = $dynamodb->query($params);
?>
php MoviesQuery02.php
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;
$dynamodb = $sdk->createDynamoDb();
$params = [
'TableName' => 'Movies',
'ProjectionExpression' => '#yr, title, info.rating',
'FilterExpression' => '#yr between :start_yr and :end_yr',
'ExpressionAttributeNames'=> [ '#yr' => 'year' ],
'ExpressionAttributeValues'=> $eav
];
try {
while (true) {
$result = $dynamodb->scan($params);
if (isset($result['LastEvaluatedKey'])) {
$params['ExclusiveStartKey'] = $result['LastEvaluatedKey'];
} else {
break;
}
}
?>
php MoviesScan.php
Note
Tambin puede usar la operacin Scan con cualesquiera ndices secundarios que ha creado en la
tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el acceso
a los datos (p. 463).
<?php
require 'vendor/autoload.php';
date_default_timezone_set('UTC');
use Aws\DynamoDb\Exception\DynamoDbException;
$dynamodb = $sdk->createDynamoDb();
$params = [
'TableName' => 'Movies'
];
try {
$result = $dynamodb->deleteTable($params);
echo "Deleted table.\n";
?>
php MoviesDeleteTable.php
Resumen
En este tutorial, hemos creado la tabla Movies en DynamoDB en el equipo y realizado las operaciones
bsicas. La versin para descargar de DynamoDB resulta til para tareas de desarrollo y pruebas
de aplicaciones. Sin embargo, cuando la aplicacin est preparada para ejecutarla en un entorno de
produccin, es importante modificar el cdigo de modo que utilice el servicio web de Amazon DynamoDB.
Despus de quitar esta lnea, el cdigo puede obtener acceso al servicio de DynamoDB en la regin
especificada por el valor de configuracin region. Por ejemplo, en la siguiente lnea se especifica que se
desea utilizar la regin EE.UU. Oeste (Oregn):
En lugar de utilizar la versin descargable de DynamoDB en el equipo, ahora el programa usar el punto
de enlace del servicio de DynamoDB de la regin EE.UU. Oeste (Oregn).
DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa, consulte
Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms informacin
sobre cmo configurar las regiones y los puntos de enlace en el cdigo, consulte la boto: A Python
interface to Amazon Web Services.
Python y DynamoDB
En este tutorial, utilizaremos AWS SDK para Python (Boto3) para escribir programas sencillos que lleven a
cabo las operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies y cargar ejemplos de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
Ejecutar consultas sencillas.
En este tutorial se utiliza la versin descargable de DynamoDB. En Resumen (p. 169), explicamos cmo
ejecutar el mismo cdigo en el servicio web de DynamoDB.
Mientras realiza este tutorial, puede consultar la documentacin de AWS SDK for Python (Boto) en http://
boto.readthedocs.org/en/latest/. Las siguientes secciones son especficas de DynamoDB:
DynamoDB tutorial
DynamoDB low-level client
Requisitos previos
Descargue y ejecute DynamoDB en el equipo. Para obtener ms informacin, consulte Configuracin de
la versin de DynamoDB local (descargable) (p. 44).
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Instale Python2.6 o posterior. Para obtener ms informacin, consulte https://www.python.org/
downloads. Para obtener instrucciones, consulte Quickstart en la documentacin de Boto3.
table = dynamodb.create_table(
TableName='Movies',
KeySchema=[
{
'AttributeName': 'year',
'KeyType': 'HASH' #Partition key
},
{
'AttributeName': 'title',
'KeyType': 'RANGE' #Sort key
}
],
AttributeDefinitions=[
{
'AttributeName': 'year',
'AttributeType': 'N'
},
{
'AttributeName': 'title',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
Note
El punto de enlace debe configurarse de modo que indique que est creando la tabla en la
versin descargable de DynamoDB en el equipo.
En la llamada create_table, especifique el nombre de la tabla, los atributos de clave
principal y los tipos de datos.
El parmetro ProvisionedThroughput es obligatorio. Sin embargo, en la versin
descargable de DynamoDB se omite. El desempeo provisionado est fuera del alcance de
este ejercicio.
En estos ejemplos se utiliza la funcin print de estilo de Python3. La lnea from
__future__ import print_function permite que Python3 imprima en Python2.6 y
versiones posteriores.
2. Para ejecutar el programa, escriba el siguiente comando:
python MoviesCreateTable.py
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 157)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 157)
En este escenario se utiliza un ejemplo de archivo de datos que contiene informacin sobre varios miles de
pelculas de IMDb (Internet Movie Database). Los datos de las pelculas se encuentran en formato JSON,
tal y como se muestra en el siguiente ejemplo. Para cada pelcula, se indican el ao, year, el ttulo, title
y un mapa JSON denominado info.
[
{
"year" : ... ,
"title" : ... ,
"info" : { ... }
},
{
"year" : ...,
"title" : ...,
"info" : { ... }
},
...
year y title se utilizan como valores de atributos de clave principal de la tabla Movies.
El resto de los valores info se almacenan en un nico atributo denominado info. Este programa ilustra
cmo almacenar JSON en un atributo de DynamoDB.
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
table = dynamodb.Table('Movies')
table.put_item(
Item={
'year': year,
'title': title,
'info': info,
}
)
python MoviesLoadData.py
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 158)
Paso 3.2: Leer un elemento (p. 159)
Paso 3.3: Actualizar un elemento (p. 160)
Paso 3.4: Incrementar un contador atmico (p. 161)
Paso 3.5: Actualizar un elemento (condicionalmente) (p. 162)
Paso 3.6: Eliminar un elemento (p. 164)
table = dynamodb.Table('Movies')
response = table.put_item(
Item={
'year': year,
'title': title,
'info': {
'plot':"Nothing happens at all.",
'rating': decimal.Decimal(0)
}
}
)
print("PutItem succeeded:")
print(json.dumps(response, indent=4, cls=DecimalEncoder))
Note
La clave principal es obligatoria. Este cdigo agrega un elemento que tiene la clave
principal (year, title) y atributos info. El atributo info almacena un ejemplo de cdigo
JSON que proporciona ms informacin sobre la pelcula.
La clase DecimalEncoder se utiliza para imprimir nmeros almacenados mediante la
clase Decimal. El Boto SDK utiliza la clase Decimal para contener los valores de los
nmeros de DynamoDB.
2. Para ejecutar el programa, escriba el siguiente comando:
python MoviesItemOps01.py
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo get_item para leer el elemento en la tabla Movies. Debe especificar los valores
de clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
return int(o)
return super(DecimalEncoder, self).default(o)
table = dynamodb.Table('Movies')
try:
response = table.get_item(
Key={
'year': year,
'title': title
}
)
except ClientError as e:
print(e.response['Error']['Message'])
else:
item = response['Item']
print("GetItem succeeded:")
print(json.dumps(item, indent=4, cls=DecimalEncoder))
python MoviesItemOps02.py
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
}
table = dynamodb.Table('Movies')
response = table.update_item(
Key={
'year': year,
'title': title
},
UpdateExpression="set info.rating = :r, info.plot=:p, info.actors=:a",
ExpressionAttributeValues={
':r': decimal.Decimal(5.5),
':p': "Everything happens all at once.",
':a': ["Larry", "Moe", "Curly"]
},
ReturnValues="UPDATED_NEW"
)
print("UpdateItem succeeded:")
print(json.dumps(response, indent=4, cls=DecimalEncoder))
Note
Este programa utiliza UpdateExpression para describir todas las actualizaciones que
desee realizar con el elemento especificado.
El parmetro ReturnValues indica a DynamoDB que devuelva solamente los atributos
actualizados (UPDATED_NEW).
2. Para ejecutar el programa, escriba el siguiente comando:
python MoviesItemOps03.py
El programa siguiente muestra cmo aumentar el valor de rating para una pelcula. Cada vez que se
ejecuta, el programa incrementa el valor de este atributo en una unidad.
table = dynamodb.Table('Movies')
response = table.update_item(
Key={
'year': year,
'title': title
},
UpdateExpression="set info.rating = info.rating + :val",
ExpressionAttributeValues={
':val': decimal.Decimal(1)
},
ReturnValues="UPDATED_NEW"
)
print("UpdateItem succeeded:")
print(json.dumps(response, indent=4, cls=DecimalEncoder))
python MoviesItemOps04.py
import decimal
table = dynamodb.Table('Movies')
try:
response = table.update_item(
Key={
'year': year,
'title': title
},
UpdateExpression="remove info.actors[0]",
ConditionExpression="size(info.actors) > :num",
ExpressionAttributeValues={
':num': 3
},
ReturnValues="UPDATED_NEW"
)
except ClientError as e:
if e.response['Error']['Code'] == "ConditionalCheckFailedException":
print(e.response['Error']['Message'])
else:
raise
else:
print("UpdateItem succeeded:")
print(json.dumps(response, indent=4, cls=DecimalEncoder))
python MoviesItemOps05.py
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
3. Modifique el programa para que ConditionExpression tenga el aspecto siguiente:
table = dynamodb.Table('Movies')
try:
response = table.delete_item(
Key={
'year': year,
'title': title
},
ConditionExpression="info.rating <= :val",
ExpressionAttributeValues= {
":val": decimal.Decimal(5)
}
)
except ClientError as e:
if e.response['Error']['Code'] == "ConditionalCheckFailedException":
print(e.response['Error']['Message'])
else:
raise
else:
print("DeleteItem succeeded:")
print(json.dumps(response, indent=4, cls=DecimalEncoder))
python MoviesItemOps06.py
response = table.delete_item(
Key={
'year': year,
'title': title
}
)
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor de year.
Tambin puede proporcionar el atributo title para recuperar un subconjunto de pelculas que cumplan
determinada condicin (segn la clave de ordenacin), como buscar las pelculas estrenadas en 2014 cuyo
ttulo comience por la letra "A".
Adems de query, hay un mtodo scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consulta de todas las pelculas estrenadas durante un ao (p. 165)
Paso 4.2: Consulta de todas las pelculas estrenadas durante un ao con unos ttulos
determinados (p. 166)
Paso 4.3: Examinar (p. 167)
table = dynamodb.Table('Movies')
response = table.query(
KeyConditionExpression=Key('year').eq(1985)
)
for i in response['Items']:
print(i['year'], ":", i['title'])
Note
python MoviesQuery01.py
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal. En
DynamoDB, puede crear si lo desea uno o varios ndices secundarios en una tabla y consultarlos
de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las aplicaciones
mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms informacin,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)
table = dynamodb.Table('Movies')
print("Movies from 1992 - titles A-L, with genres and lead actor")
response = table.query(
ProjectionExpression="#yr, title, info.genres, info.actors[0]",
ExpressionAttributeNames={ "#yr": "year" }, # Expression Attribute Names for
Projection Expression only.
KeyConditionExpression=Key('year').eq(1992) & Key('title').between('A', 'L')
)
for i in response[u'Items']:
print(json.dumps(i, cls=DecimalEncoder))
python MoviesQuery02.py
table = dynamodb.Table('Movies')
fe = Key('year').between(1950, 1959);
response = table.scan(
FilterExpression=fe,
ProjectionExpression=pe,
ExpressionAttributeNames=ean
)
for i in response['Items']:
print(json.dumps(i, cls=DecimalEncoder))
for i in response['Items']:
print(json.dumps(i, cls=DecimalEncoder))
Note
python MoviesScan.py
Note
Tambin puede usar la operacin Scan con cualesquiera ndices secundarios que haya creado
en la tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el
acceso a los datos (p. 463).
table = dynamodb.Table('Movies')
table.delete()
python MoviesDeleteTable.py
Resumen
En este tutorial, hemos creado la tabla Movies en la versin descargable de DynamoDB en el equipo y
hemos realizado algunas operaciones bsicas. La versin para descargar de DynamoDB resulta til para
tareas de desarrollo y pruebas de aplicaciones. Sin embargo, cuando la aplicacin est preparada para
ejecutarla en un entorno de produccin, debe modificar el cdigo de modo que utilice el servicio web de
Amazon DynamoDB.
dynamodb = boto3.resource('dynamodb',endpoint_url="http://localhost:8000")
dynamodb = boto3.resource('dynamodb',region_name='us-west-2')
En lugar de utilizar la versin descargable de DynamoDB en el equipo, ahora el programa usar el servicio
de DynamoDB de la regin EE.UU. Oeste (Oregn).
DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa, consulte
Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms informacin
sobre cmo configurar las regiones y los puntos de enlace en el cdigo, consulte AWS Region Selection en
la AWS SDK for Java Developer Guide.
Ruby y DynamoDB
En este tutorial, utilizaremos el AWS SDK parar Ruby para escribir programas sencillos que lleven a cabo
las operaciones de Amazon DynamoDB siguientes:
Crear una tabla denominada Movies y cargar ejemplos de datos en formato JSON.
Realizar operaciones de creacin, lectura, actualizacin y eliminacin en la tabla.
En este tutorial se utiliza la versin descargable de DynamoDB. Para obtener informacin sobre cmo
ejecutar el mismo cdigo en el servicio de DynamoDB, consulte el Resumen (p. 184).
Mientras realiza este tutorial, puede consultar la AWS SDK parar Ruby API Reference. En la seccin
DynamoDB se describen los parmetros y resultados de las operaciones de DynamoDB.
Requisitos previos
Descargue y ejecute DynamoDB en el equipo. Para obtener ms informacin, consulte Configuracin de
la versin de DynamoDB local (descargable) (p. 44).
Configure una clave de acceso de AWS para utilizar los SDK de AWS. Para obtener ms informacin,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Configure el AWS SDK parar Ruby:
Vaya a https://www.ruby-lang.org/en/documentation/installation/ e instale Ruby.
Vaya a https://aws.amazon.com/sdk-for-ruby e instale el AWS SDK parar Ruby.
Para obtener ms informacin, consulte Installation en la AWS SDK parar Ruby API Reference.
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
params = {
table_name: "Movies",
key_schema: [
{
attribute_name: "year",
key_type: "HASH" #Partition key
},
{
attribute_name: "title",
key_type: "RANGE" #Sort key
}
],
attribute_definitions: [
{
attribute_name: "year",
attribute_type: "N"
},
{
attribute_name: "title",
attribute_type: "S"
},
],
provisioned_throughput: {
read_capacity_units: 10,
write_capacity_units: 10
}
}
begin
result = dynamodb.create_table(params)
puts "Created table. Status: " +
result.table_description.table_status;
Note
El punto de enlace debe configurarse de modo que indique que est creando la tabla en la
versin descargable de DynamoDB en el equipo.
En la llamada create_table, especifique el nombre de la tabla, los atributos de clave
principal y los tipos de datos.
El parmetro provisioned_throughput es obligatorio. Sin embargo, en la versin
descargable de DynamoDB se omite. El desempeo provisionado est fuera del alcance de
este ejercicio.
2. Para ejecutar el programa, escriba el siguiente comando:
ruby MoviesCreateTable.rb
Para obtener ms informacin sobre cmo administrar tablas, consulte Uso de tablas en
DynamoDB (p. 301).
Temas
Paso 2.1: Descargar el ejemplo de archivo de datos (p. 172)
Paso 2.2: Cargar los ejemplos de datos en la tabla Movies (p. 172)
Usar un ejemplo de archivo de datos que contiene informacin sobre varios miles de pelculas de IMDb
(Internet Movie Database). Los datos de las pelculas se encuentran en formato JSON, tal y como se
muestra en el siguiente ejemplo. Para cada pelcula, se indican el ao, year, el ttulo, title y un mapa
JSON denominado info.
[
{
"year" : ... ,
"title" : ... ,
"info" : { ... }
},
{
"year" : ...,
"title" : ...,
"info" : { ... }
},
...
year y title se utilizan como valores de atributos de clave principal de la tabla Movies.
El resto de los valores info se almacenan en un nico atributo denominado info. Este programa ilustra
cmo almacenar JSON en un atributo de DynamoDB.
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [
"Alice Smith",
"Bob Jones"
],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : [
"Comedy",
"Drama"
],
"image_url" : "http://ia.media-imdb.com/images/N/
O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"rank" : 11,
"running_time_secs" : 5215,
"actors" : [
"David Matthewman",
"Ann Thomas",
"Jonathan G. Neff"
]
}
}
require "aws-sdk"
require "json"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
file = File.read('moviedata.json')
movies = JSON.parse(file)
movies.each{|movie|
params = {
table_name: tableName,
item: movie
}
begin
result = dynamodb.put_item(params)
puts "Added movie: #{movie["year"]} #{movie["title"]}"
ruby MoviesLoadData.rb
Para obtener ms informacin sobre cmo leer y escribir datos, consulte Uso de elementos en
DynamoDB (p. 340).
Temas
Paso 3.1: Crear un elemento nuevo (p. 173)
Paso 3.2: Leer un elemento (p. 174)
Paso 3.3: Actualizar un elemento (p. 175)
Paso 3.4: Incrementar un contador atmico (p. 177)
Paso 3.5: Actualizar un elemento (condicionalmente) (p. 178)
Paso 3.6: Eliminar un elemento (p. 179)
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
year = 2015
title = "The Big New Movie"
item = {
year: year,
title: title,
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
params = {
table_name: "Movies",
item: item
}
begin
result = dynamodb.put_item(params)
puts "Added item: #{year} - #{title}"
Note
La clave principal es obligatoria. Este cdigo agrega un elemento que tiene la clave principal
(year, title) y atributos info. El atributo info almacena un mapa que proporciona ms
informacin sobre la pelcula.
2. Para ejecutar el programa, escriba el siguiente comando:
ruby MoviesItemOps01.rb
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
Puede utilizar el mtodo get_item para leer el elemento en la tabla Movies. Debe especificar los valores
de clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
year = 2015
title = "The Big New Movie"
key = {
year: year,
title: title
}
params = {
table_name: "Movies",
key: {
year: year,
title: title
}
}
begin
result = dynamodb.get_item(params)
printf "%i - %s\n%s\n%d\n",
result.item["year"],
result.item["title"],
result.item["info"]["plot"],
result.item["info"]["rating"]
ruby MoviesItemOps02.rb
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}
A lo siguiente:
{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
}
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
year = 2015
title = "The Big New Movie"
params = {
table_name: "Movies",
key: {
year: year,
title: title
},
update_expression: "set info.rating = :r, info.plot=:p, info.actors=:a",
expression_attribute_values: {
":r" => 5.5,
":p" => "Everything happens all at once.", # value
<Hash,Array,String,Numeric,Boolean,IO,Set,nil>
":a" => ["Larry", "Moe", "Curly"]
},
return_values: "UPDATED_NEW"
}
begin
result = dynamodb.update_item(params)
puts "Added item: #{year} - #{title}"
Note
Este programa utiliza update_expression para describir todas las actualizaciones que
desee realizar con el elemento especificado.
El parmetro return_values indica a DynamoDB que devuelva solamente los atributos
actualizados (UPDATED_NEW).
2. Para ejecutar el programa, escriba el siguiente comando:
ruby MoviesItemOps03.rb
El programa siguiente muestra cmo aumentar el valor de rating para una pelcula. Cada vez que se
ejecuta, el programa incrementa el valor de este atributo en una unidad.
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
year = 2015
title = "The Big New Movie"
params = {
table_name: "Movies",
key: {
year: year,
title: title
},
update_expression: "set info.rating = info.rating + :val",
expression_attribute_values: {
":val" => 1
},
return_values: "UPDATED_NEW"
}
begin
result = dynamodb.update_item(params)
puts "Updated item. ReturnValues are:"
result.attributes["info"].each do |key, value|
if key == "rating"
puts "#{key}: #{value.to_f}"
else
puts "#{key}: #{value}"
end
end
rescue Aws::DynamoDB::Errors::ServiceError => error
puts "Unable to update item:"
puts "#{error.message}"
end
ruby MoviesItemOps04.rb
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
year = 2015
title = "The Big New Movie"
params = {
table_name: "Movies",
key: {
year: year,
title: title
},
update_expression: "remove info.actors[0]",
condition_expression: "size(info.actors) > :num",
expression_attribute_values: {
":num" => 3
},
return_values: "UPDATED_NEW"
}
begin
result = dynamodb.update_item(params)
puts "Updated item. ReturnValues are:"
result.attributes["info"].each do |key, value|
if key == "rating"
puts "#{key}: #{value.to_f}"
else
puts "#{key}: #{value}"
end
end
ruby MoviesItemOps05.rb
Esto se debe a que la pelcula tiene tres actores, pero la condicin busca un valor mayor que tres
actores.
3. Modifique el programa para que ConditionExpression tenga el aspecto siguiente:
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = 'Movies'
year = 2015
title = "The Big New Movie"
params = {
table_name: "Movies",
key: {
year: year,
title: title
},
condition_expression: "info.rating <= :val",
expression_attribute_values: {
":val" => 5
}
}
begin
result = dynamodb.delete_item(params)
puts "Deleted item."
ruby MoviesItemOps06.rb
params = {
table_name: "Movies",
key: {
year: year,
title: title
}
}
Para buscar todas las pelculas estrenadas durante un ao, solo debe especificar el valor de year.
Tambin puede proporcionar el atributo title para recuperar un subconjunto de pelculas que cumplan
determinada condicin (segn la clave de ordenacin), como buscar las pelculas estrenadas en 2014 cuyo
ttulo comience por la letra "A".
Adems de query, hay un mtodo scan que permite recuperar todos los datos de la tabla.
Para obtener ms informacin sobre cmo consultar y examinar datos, consulte Uso de
consultas (p. 425) y Uso de operaciones de examen (p. 443), respectivamente.
Temas
Paso 4.1: Consulta de todas las pelculas estrenadas durante un ao (p. 180)
Paso 4.2: Consulta de todas las pelculas estrenadas durante un ao con unos ttulos
determinados (p. 182)
Paso 4.3: Examinar (p. 183)
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = "Movies"
params = {
table_name: tableName,
key_condition_expression: "#yr = :yyyy",
expression_attribute_names: {
"#yr" => "year"
},
expression_attribute_values: {
":yyyy" => 1985
}
}
begin
result = dynamodb.query(params)
puts "Query succeeded."
result.items.each{|movie|
puts "#{movie["year"].to_i} #{movie["title"]}"
}
Note
ruby MoviesItemQuery01.rb
Note
El programa anterior muestra cmo consultar una tabla segn sus atributos de clave principal. En
DynamoDB, puede crear si lo desea uno o varios ndices secundarios en una tabla y consultarlos
de la misma forma que se consulta una tabla. Los ndices secundarios ofrecen a las aplicaciones
mayor flexibilidad, porque permiten consultar atributos sin clave. Para obtener ms informacin,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = "Movies"
params = {
table_name: tableName,
projection_expression: "#yr, title, info.genres, info.actors[0]",
key_condition_expression:
"#yr = :yyyy and title between :letter1 and :letter2",
expression_attribute_names: {
"#yr" => "year"
},
expression_attribute_values: {
":yyyy" => 1992,
":letter1" => "A",
":letter2" => "L"
}
}
puts "Querying for movies from 1992 - titles A-L, with genres and lead actor";
begin
result = dynamodb.query(params)
puts "Query succeeded."
result.items.each{|movie|
print "#{movie["year"].to_i}: #{movie["title"]} ... "
movie['info']['genres'].each{|gen|
print gen + " "
}
ruby MoviesQuery02.rb
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
tableName = "Movies"
params = {
table_name: tableName,
projection_expression: "#yr, title, info.rating",
filter_expression: "#yr between :start_yr and :end_yr",
expression_attribute_names: {"#yr"=> "year"},
expression_attribute_values: {
":start_yr" => 1950,
":end_yr" => 1959
}
}
begin
loop do
result = dynamodb.scan(params)
result.items.each{|movie|
puts "#{movie["year"].to_i}: " +
"#{movie["title"]} ... " +
"#{movie["info"]["rating"].to_f}"
}
break if result.last_evaluated_key.nil?
filter_expression especifica una condicin que devuelve solamente los elementos que
cumplen la condicin. Todos los dems elementos se descartan.
2. Para ejecutar el programa, escriba el siguiente comando:
ruby MoviesScan.rb
Note
Tambin puede usar el mtodo scan con cualesquiera ndices secundarios que haya creado en la
tabla. Para obtener ms informacin, consulte Uso de ndices secundarios para mejorar el acceso
a los datos (p. 463).
require "aws-sdk"
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
dynamodb = Aws::DynamoDB::Client.new
params = {
table_name: "Movies"
}
begin
result = dynamodb.delete_table(params)
puts "Deleted table."
ruby MoviesDeleteTable.rb
Resumen
En este tutorial, hemos creado la tabla Movies en la versin descargable de DynamoDB en el equipo y
hemos realizado algunas operaciones bsicas. La versin para descargar de DynamoDB resulta til para
tareas de desarrollo y pruebas de aplicaciones. Sin embargo, cuando la aplicacin est preparada para
ejecutarla en un entorno de produccin, debe modificar el cdigo de modo que utilice el servicio web de
Amazon DynamoDB.
Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})
Aws.config.update({
region: "us-west-2"
]);
Despus de quitar esta lnea, el cdigo puede obtener acceso al servicio de DynamoDB en la regin
especificada por el valor de configuracin region.
En lugar de utilizar la versin de DynamoDB en el equipo, el programa usar el punto de enlace del
servicio de DynamoDB de la regin EE.UU. Oeste (Oregn).
DynamoDB est disponible en varias regiones de todo el mundo. Para obtener la lista completa, consulte
Regiones y puntos de conexin de AWS en la AWS General Reference. Para obtener ms informacin,
consulte la AWS SDK parar Ruby Getting Started Guide.
En este captulo se tratan los temas relacionados con el desarrollador. Si lo que desea es
ejecutar ejemplos de cdigo, consulte Cmo ejecutar los ejemplos de cdigo de esta Gua para
desarrolladores (p. 290).
Temas
Informacin general sobre la compatibilidad de los SDK de AWS con DynamoDB (p. 186)
Interfaces de programacin (p. 188)
API de bajo nivel de DynamoDB (p. 192)
Control de errores (p. 196)
Interfaces de programacin de nivel superior para DynamoDB (p. 201)
Cmo ejecutar los ejemplos de cdigo de esta Gua para desarrolladores (p. 290)
1. Puede escribir una aplicacin utilizando un SDK de AWS para su lenguaje de programacin.
2. Cada SDK de AWS proporciona una o varias interfaces de programacin para trabajar con DynamoDB.
Las interfaces especficas disponibles dependern de qu lenguaje de programacin y SDK de AWS se
utilice.
3. El SDK de AWS construye de solicitudes HTTP(S) para usarlas con el API de bajo nivel de DynamoDB.
4. El SDK de AWS enva la solicitud al punto de enlace de DynamoDB.
5. DynamoDB ejecuta la solicitud. Si la solicitud se realiza correctamente, DynamoDB devuelve un cdigo
de respuesta HTTP 200 (OK). Si la solicitud no se puede realizar, DynamoDB devuelve un cdigo de
error HTTP y un mensaje de error.
6. El SDK de AWS procesa la respuesta y se la transmite a la aplicacin.
Cada uno de los SDK de AWS presta servicios importantes a la aplicacin, tales como los siguientes:
Note
Para obtener ms informacin sobre los SDK de AWS, incluidas las instrucciones de instalacin y
la documentacin, consulte Herramientas para Amazon Web Services.
Interfaces de programacin
Cada SDK de AWS proporciona una o varias interfaces de programacin para trabajar con DynamoDB.
Estas interfaces abarcan desde sencillos encapsuladores de bajo nivel de DynamoDB hasta capas de
persistencia orientadas a objetos. Las interfaces disponibles varan segn el SDK de AWS y el lenguaje de
programacin que se utilice.
En la siguiente seccin se destacan algunas de las interfaces disponibles utilizando el AWS SDK para Java
como ejemplo. (No todas las interfaces estn disponibles en todos los SDK de AWS.)
Temas
Interfaces de bajo nivel (p. 188)
Interfaces de documentos (p. 189)
Interfaz de persistencia de objetos (p. 190)
En algunos casos, es preciso identificar los tipos de datos de los atributos utilizando Descriptores de tipos
de datos (p. 194); por ejemplo, S si es una cadena o N si es un nmero.
Note
Hay interfaz de bajo nivel disponible en el SDK de AWS especfico de cada idioma.
En el siguiente programa de Java se utiliza la interfaz de bajo nivel del AWS SDK for Java. El programa
emite una solicitud GetItem para obtener una cancin de la tabla Music e imprime el ao en que se lanz
la cancin.
package com.amazonaws.codesamples;
import java.util.HashMap;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
try {
GetItemResult result = client.getItem(request);
if (result && result.getItem() != null) {
AttributeValue year = result.getItem().get("Year");
System.out.println("The song was released in " + year.getN());
} else {
System.out.println("No matching song was found");
}
} catch (Exception e) {
System.err.println("Unable to retrieve data: ");
System.err.println(e.getMessage());
}
}
}
Interfaces de documentos
Muchos SDK de AWS proporcionan una interfaz de documentos, lo que permite realizar operaciones del
plano de datos (crear, leer, actualizar, eliminar) en tablas e ndices. Con una interfaz de documentos,
no es preciso especificar Descriptores de tipos de datos (p. 194); los tipos de datos quedan implcitos
en la propia semntica de los datos. Estos SDK de AWS tambin proporcionan mtodos para convertir
fcilmente documentos JSON a los tipos de datos nativos de DynamoDB y viceversa.
Note
Las interfaces de documentos estn disponibles en los SDK de AWS para Java, .NET, Node.js y
JavaScript en el navegador.
En el siguiente programa de Java se utiliza la interfaz de documentos del AWS SDK for Java. El programa
crea un objeto Table que representa la tabla Music y, a continuacin, solicita que el objeto utilice
GetItem para recuperar una cancin. Despus, el programa imprime el ao en que se lanz la cancin.
package com.amazonaws.codesamples.gsg;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.GetItemOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
}
}
Las interfaces de persistencia de objetos estn disponibles en los SDK de AWS para Java y .NET.
Para obtener ms informacin, consulte Interfaces de programacin de nivel superior para
DynamoDB (p. 201).
package com.amazonaws.codesamples;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName="Music")
public class MusicItem {
private String artist;
private String songTitle;
private String albumTitle;
private int year;
@DynamoDBHashKey(attributeName="Artist")
public String getArtist() { return artist;}
public void setArtist(String artist) {this.artist = artist;}
@DynamoDBRangeKey(attributeName="SongTitle")
public String getSongTitle() { return songTitle;}
public void setSongTitle(String songTitle) {this.songTitle = songTitle;}
@DynamoDBAttribute(attributeName = "AlbumTitle")
public String getAlbumTitle() { return albumTitle;}
public void setAlbumTitle(String albumTitle) {this.albumTitle = albumTitle;}
@DynamoDBAttribute(attributeName = "Year")
public int getYear() { return year; }
public void setYear(int year) { this.year = year; }
}
A continuacin, puede crear una instancia de un objeto MusicItem y recuperar una cancin utilizando el
mtodo load() de DynamoDBMapper. Despus, el programa imprime el ao en que se lanz la cancin.
package com.amazonaws.codesamples;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
try {
MusicItem result = mapper.load(keySchema);
if (result != null) {
System.out.println(
"The song was released in "+ result.getYear());
} else {
System.out.println("No matching song was found");
}
} catch (Exception e) {
System.err.println("Unable to retrieve data: ");
System.err.println(e.getMessage());
}
El API de bajo nivel de DynamoDB es la interfaz de nivel de protocolo de Amazon DynamoDB. En este
nivel, cada solicitud HTTP(S) debe tener el formato correcto y llevar una firma digital vlida.
Los SDK de AWS construyen las solicitudes al API de bajo nivel de DynamoDB automticamente y
procesan las respuestas de DynamoDB. Esto le permite centrarse en la lgica de la aplicacin, en lugar
de en los detalles de bajo nivel. Sin embargo, le resultar til conocer algunos conceptos bsicos del
funcionamiento del API de bajo nivel de DynamoDB.
Para obtener ms informacin sobre el API de bajo nivel de DynamoDB, consulte la Amazon DynamoDB
API Reference.
Note
Flujos de DynamoDB tiene su propio API de bajo nivel, que es independiente de la de DynamoDB
y totalmente compatible con los SDK de AWS.
Para obtener ms informacin, consulte Captura de la actividad de las tablas con Flujos de
DynamoDB (p. 540). Para el API de bajo nivel de Flujos de DynamoDB, consulte la Referencia
de la API de Amazon DynamoDB Streams.
El API de bajo nivel de DynamoDB utiliza la notacin de objetos de JavaScript (JSON, JavaScript Object
Notation) como formato de protocolo de conexin. JSON presenta los datos de forma jerrquica, de tal
forma que transmite simultneamente sus valores y su estructura. Los pares de nombre-valor se definen
con el formato name:value. La jerarqua de datos se define mediante llaves anidadas de pares de
nombre-valor.
DynamoDB usa JSON como protocolo de transporte nicamente, no como formato de almacenamiento.
Los SDK de AWS usan JSON para enviar datos a DynamoDB y DynamoDB responde con JSON, pero
DynamoDB no almacena los datos de forma persistente en formato JSON.
Note
Para obtener ms informacin sobre JSON, consulte Introducing JSON en el sitio web JSON.org.
Supongamos que dispone de una tabla denominada Pets, con un esquema de claves que consta de
AnimalType (clave de particin) y Name (clave de ordenacin). Ambos atributos son de tipo String.
Para recuperar un elemento de Pets, el SDK de AWS construye una solicitud, tal y como se muestra a
continuacin:
POST / HTTP/1.1
Host: dynamodb.<region>.<domain>;
Accept-Encoding: identity
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.0
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>,
Signature=<Signature>
X-Amz-Date: <Date>
X-Amz-Target: DynamoDB_20120810.GetItem
{
"TableName": "Pets",
"Key": {
"AnimalType": {"S": "Dog"},
"Name": {"S": "Fido"}
}
}
Formato de respuesta
Una vez que recibe la solicitud, DynamoDB la procesa y devuelve una respuesta. Para la solicitud
mostrada ms arriba, la carga de la respuesta HTTP(S) contiene los resultados de la operacin, como en
este ejemplo:
HTTP/1.1 200 OK
x-amzn-RequestId: <RequestId>
x-amz-crc32: <Checksum>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Date: <Date>
{
"Item": {
"Age": {"N": "8"},
"Colors": {
"L": [
{"S": "White"},
{"S": "Brown"},
{"S": "Black"}
]
},
"Name": {"S": "Fido"},
"Vaccinations": {
"M": {
"Rabies": {
"L": [
{"S": "2009-03-17"},
{"S": "2011-09-21"},
{"S": "2014-07-08"}
]
},
"Distemper": {"S": "2015-10-13"}
}
},
"Breed": {"S": "Beagle"},
"AnimalType": {"S": "Dog"}
}
}
En este momento, el SDK de AWS devuelve los datos de respuesta a la aplicacin para continuar
procesndolos.
Note
Si DynamoDB no puede procesar una solicitud, devuelve un cdigo de error HTTP y un mensaje.
El SDK de AWS los propaga a su aplicacin, en forma de excepciones. Para obtener ms
informacin, consulte Control de errores (p. 196).
En las secciones Formato de las solicitudes (p. 193) y Formato de respuesta (p. 194) encontrar
ejemplos de cmo se usan los descriptores de tipos de datos. En la solicitud GetItem se especifica S para
los atributos del esquema de claves de Pets (AnimalType y Name), que son de tipo String. La respuesta
de GetItem contiene un elemento Pets con atributos de tipo String (S), Number (N), Map (M) y List (L).
S: String
N: Number
B: Binary
BOOL: Boolean
NULL: Null
M: Map
L: List
SS: String Set
NS: Number Set
BS: Binary Set
Note
Para obtener descripciones detalladas de los tipos de datos de DynamoDB, consulte Tipos de
datos (p. 13).
Datos numricos
Los distintos lenguajes de programacin ofrecen diferentes niveles de compatibilidad con JSON.
En algunos casos, es posible que prefiera usar una biblioteca de terceros para validar y analizar los
documentos JSON.
Algunas bibliotecas de terceros se basan en el tipo Number de JSON y proporcionan sus propios tipos,
tales como int, long o double. Sin embargo, el tipo de datos Number nativo de DynamoDB no se
mapea exactamente a estos otros tipos de datos, por lo que estas diferencias entre los tipos pueden
provocar conflictos. Adems, muchas bibliotecas JSON no controlan los valores numricos con una
precisin fija y deducen automticamente que el tipo de datos de las secuencias que contienen una coma
decimal es double.
Para resolver estos problemas, DynamoDB proporciona un nico tipo numrico sin prdida de datos.
Para evitar conversiones implcitas no deseadas a un valor de tipo double, DynamoDB utiliza cadenas
para efectuar la transferencia de datos de valores numricos. Este enfoque proporciona flexibilidad
para actualizar los valores de los atributos y, al mismo tiempo, mantener una semntica de ordenacin
adecuada; por ejemplo, colocar los valores "01", "2" y "03" en la secuencia correcta.
Si la precisin del nmero es importante para la aplicacin, debe convertir los valores numricos en
cadenas antes de pasrselos a DynamoDB.
El esquema de codificacin Base64 que se utiliza en DynamoDB se describe en RFC 4648 en el sitio web
de IETF (Internet Engineering Task Force).
Control de errores
En esta seccin se describen los errores de tiempo de ejecucin y se explica cmo controlarlos. Tambin
se describen los mensajes y cdigos de error especficos de DynamoDB.
Temas
Componentes de un error (p. 196)
Mensajes y cdigos de error (p. 196)
Control de errores en la aplicacin (p. 199)
Reintentos de error y retardo exponencial (p. 200)
Operaciones por lotes y control de errores (p. 201)
Componentes de un error
Cuando el programa enva una solicitud, DynamoDB intenta procesarla. Si la solicitud se lleva a cabo
correctamente, DynamoDB devuelve un cdigo de estado HTTP de operacin correcta (200 OK), as como
el resultado de la operacin solicitada.
Si la solicitud no se realiza correctamente, DynamoDB devuelve un error. Cada error tiene tres
componentes:
Los SDK de AWS se encargan de transmitir los errores a la aplicacin, para que pueda adoptar las
medidas apropiadas. Por ejemplo, en un programa en Java, puede escribir una lgica try-catch para
controlar una excepcin ResourceNotFoundException.
Si no utiliza un SDK de AWS, tendr que analizar el contenido de la respuesta de bajo nivel de DynamoDB.
A continuacin se muestra un ejemplo de este tipo de respuesta:
{"__type":"com.amazonaws.dynamodb.v20120810#ResourceNotFoundException",
"message":"Requested resource not found: Table: tablename not found"}
AccessDeniedException
El cliente no firm correctamente la solicitud. Si utiliza un SDK de AWS, las solicitudes se firman
automticamente; en caso contrario, visite Proceso de firma de Signature Version 4 en la AWS
General Reference.
Reintentar? No
ConditionalCheckFailedException
Ha especificado una condicin que se ha evaluado en false. Por ejemplo, es posible que haya
intentado realizar una actualizacin condicional de un elemento, pero que el valor real del atributo no
coincidiese con el valor previsto en la condicin.
Reintentar? No
IncompleteSignatureException
La firma de la solicitud no inclua todos los componentes necesarios. Si utiliza un SDK de AWS, las
solicitudes se firman automticamente; en caso contrario, visite Proceso de firma de Signature Version
4 en la AWS General Reference.
Reintentar? No
ItemCollectionSizeLimitExceededException
Para una tabla con un local secondary index, un grupo de elementos con el mismo valor de clave de
particin ha superado el lmite de tamao mximo de 10 GB. Para obtener ms informacin sobre las
colecciones de elementos, consulte Colecciones de elementos (p. 513).
Reintentar? S
LimitExceededException
Hay demasiadas operaciones del plano de control simultneas. El nmero acumulado de tablas e
ndices que se encuentren en los estados CREATING, DELETING o UPDATING no puede ser mayor
que 10.
Reintentar? S
MissingAuthenticationTokenException
Mensaje: Request must contain a valid (registered) AWS Access Key ID.
Reintentar? No
ProvisionedThroughputExceededException
Mensaje: You exceeded your maximum allowed provisioned throughput for a table or for one or more
global secondary indexes. To view performance metrics for provisioned throughput vs. consumed
throughput, open the Amazon CloudWatch console.
Ejemplo: La velocidad de solicitudes es demasiado alta. Los SDK de AWS para DynamoDB reintentan
automticamente las solicitudes que reciben esta excepcin. La solicitud se llevar a cabo con
xito en algn momento, salvo que la cola de reintentos sea demasiado larga para que pueda
alcanzarse el final. Reduzca la frecuencia de las solicitudes mediante Reintentos de error y retardo
exponencial (p. 200).
Reintentar? S
ResourceInUseException
Ejemplo: Ha intentado volver a crear una tabla existente o eliminar una tabla que se encuentra en el
estado CREATING.
Reintentar? No
ResourceNotFoundException
Ejemplo: La tabla que se ha solicitado no existe o se encuentra demasiado al principio del estado
CREATING.
Reintentar? No
ThrottlingException
Esta excepcin puede devolverse si se lleva a cabo con demasiada rapidez una de las operaciones
siguientes: CreateTable, UpdateTable o DeleteTable.
Reintentar? S
UnrecognizedClientException
Reintentar? S
ValidationException
Este error se produce por varias razones; por ejemplo, si se ha omitido un parmetro obligatorio, uno
de los valores est fuera del rango admitido o los tipos de datos no concuerdan. El mensaje de error
contiene informacin acerca de la parte concreta de la solicitud que ha provocado el error.
Reintentar? No
Reintentar? S
Note
Pueden producirse errores internos del servidor cuando se utilizan elementos. Cabe esperar
que esto suceda durante la vida til de una tabla. Todas las solicitudes que producen un error
se pueden reintentar inmediatamente.
Reintentar? S
Los AWS SDK llevan a cabo sus propios reintentos y comprobaciones de errores. Si se produce algn
error al utilizar uno de los SDK de AWS, su cdigo y descripcin pueden ayudarle a solucionar el problema.
Tambin debera aparecer el Request ID en la respuesta. El Request ID puede resultar til si tiene que
acudir a AWS Support para diagnosticar el problema.
En el siguiente fragmento de cdigo Java se intenta eliminar un elemento de una tabla de DynamoDB y
se realiza un control de errores rudimentario. En este caso, se limita a informar al usuario de que se ha
producido un error en la solicitud.
try {
Item item = table.getItem("year", 1978, "title", "Superman");
if (item != null) {
System.out.println("Result: " + item);
} else {
//No such item exists in the table
System.out.println("Item not found");
}
En este fragmento de cdigo, la construccin try-catch controla dos tipos de excepciones diferentes:
Cada SDK de AWS implementa automticamente una lgica de reintento. Puede modificar los parmetros
de reintento de acuerdo con sus necesidades. Por ejemplo, tomemos una aplicacin en Java que requiere
una estrategia de conmutacin por error rpida y no permite reintentos en caso de error. Con el AWS SDK
for Java, podra usar la clase ClientConfiguration y proporcionar un valor de maxErrorRetry de 0
para desactivar los reintentos. Para obtener ms informacin, consulte la documentacin del SDK de AWS
del lenguaje de programacin especfico.
Si no utiliza un AWS SDK, debe reintentar las solicitudes originales que reciban errores de servidor
(5xx). Sin embargo, los errores de cliente (4xx, salvo las excepciones ThrottlingException o
ProvisionedThroughputExceededException) indican que es preciso revisar la solicitud en s para
corregir el problema antes de volver a intentarlo.
Adems de los reintentos sencillos, cada AWS SDK implementa un algoritmo de retardo exponencial para
mejorar el control de flujo. El retardo exponencial se basa en el concepto de utilizar tiempos de espera
progresivamente ms largos entre reintentos para las respuestas a errores consecutivos. Por ejemplo,
las aplicaciones cliente podran esperar 50milisegundos antes de llevar a cabo el primer reintento,
100milisegundos antes del segundo, hasta 200milisegundos antes del tercero y as sucesivamente. Sin
embargo, si la solicitud no se ha llevado a cabo correctamente al cabo de un minuto, el problema podra
radicar en que el tamao de la solicitud supera el desempeo provisionado, y no en la tasa de solicitudes.
Establezca el nmero mximo de reintentos de modo que se detenga al cabo de un minuto. Si la solicitud
no se realiza correctamente, investigue las opciones de desempeo provisionado. Para obtener ms
informacin, consulte Prcticas recomendadas para las tablas (p. 697).
Note
Los SDK de AWS implementan una lgica de reintento automtico y retardo exponencial.
La mayora los algoritmos de retardo exponencial utilizan la fluctuacin (el retraso aleatorio) para evitar
conflictos sucesivos. Habida cuenta de que no est intentando evitar este tipo de conflictos en estos casos,
no es preciso utilizar este nmero aleatorio. Sin embargo, si utiliza clientes simultneos, la fluctuacin
puede ayudar a que las solicitudes tengan xito con mayor rapidez. Para obtener ms informacin,
consulte la entrada de blog Exponential Backoff and Jitter.
Una operacin por lotes puede tolerar que algunas solicitudes individuales del lote no se lleven a cabo.
Por ejemplo, tomemos una solicitud BatchGetItem para leer cinco elementos. Aunque algunas de
las solicitudes GetItem subyacentes no se realicen, esto no provocar un error de toda la operacin
BatchGetItem. Por otra parte, si se produce un error en todas las operaciones de lectura, entonces la
operacin BatchGetItem completa no se llevar a cabo.
Las operaciones por lotes devuelven informacin sobre las solicitudes individuales que no se realizan,
para que pueda diagnosticar el problema y reintentar la operacin. Para BatchGetItem, las tablas y
claves principales en cuestin se devuelven en el parmetro UnprocessedKeys de la solicitud. Para
BatchWriteItem, se devuelve informacin similar en UnprocessedItems.
La causa ms probable de que no se realice una lectura o una escritura es la limitacin controlada. Para
BatchGetItem, una o varias tablas de la solicitud por lotes no tiene suficiente capacidad de lectura
provisionada para admitir la operacin. Para BatchWriteItem, una o varias de las tablas no tiene
suficiente capacidad de escritura provisionada.
Si DynamoDB devuelve elementos sin procesar, debe reintentar la operacin por lotes para estos
elementos. Sin embargo, recomendamos encarecidamente utilizar un algoritmo de retardo exponencial.
Si reintenta la operacin de forma inmediata, podra volver a producirse un error en las solicitudes
subyacentes de lectura o escritura a causa de la limitacin controlada de las tablas individuales. Si retrasa
la operacin por lotes mediante el retardo exponencial, ser mucho ms probable que las solicitudes
individuales del lote se lleven a cabo correctamente.
Para simplificar el desarrollo, los SDK de AWS para Java y .NET incluyen interfaces adicionales con
niveles de abstraccin superiores. Las interfaces de nivel superior para DynamoDB permiten definir las
relaciones entre los objetos del programa del desarrollador y las tablas de base de datos en las que se
almacenan esos datos de objetos. Una vez que se ha definido este mapeo, basta con llamar a mtodos de
objetos simples, como save, load o delete, y las operaciones de bajo nivel de DynamoDB subyacentes
se invocan automticamente si su intervencin. Esto le permite escribir cdigo orientado a objetos, en lugar
de cdigo orientado a bases de datos.
Las interfaces de programacin de nivel superior para DynamoDB estn disponibles en los SDK de AWS
para Java y .NET.
Java
.NET
Java: DynamoDBMapper
Temas
Tipos de datos admitidos (p. 204)
Anotaciones de Java para DynamoDB (p. 205)
Clase DynamoDBMapper (p. 210)
Ajustes de configuracin opcionales para DynamoDBMapper (p. 216)
Ejemplo: Operaciones CRUD (p. 218)
Ejemplo: Operaciones de escritura por lotes (p. 220)
Ejemplo: Consulta y examen (p. 226)
Bloqueo optimista con el nmero de versin (p. 235)
Mapeo de datos arbitrarios (p. 237)
El AWS SDK for Java proporciona la clase DynamoDBMapper que permite mapear las clases del lado
del cliente a las tablas de DynamoDB. Para usar DynamoDBMapper, se define la relacin entre los
elementos de una tabla de DynamoDB y sus instancias de objetos correspondientes en el cdigo. La clase
DynamoDBMapper permite obtener acceso a las tablas, realizar varias operaciones de creacin, lectura,
actualizacin y eliminacin (CRUD, Create, Read, Update and Delete) y ejecutar consultas.
Note
La clase DynamoDBMapper no permite crear, actualizar o eliminar tablas. Para realizar estas
tareas, utilice la interfaz de bajo nivel del SDK para Java en su lugar. Para obtener ms
informacin, consulte Uso de tablas: Java (p. 329).
El SDK para Java proporciona un conjunto de tipos de anotacin para que pueda mapear las clases de
tablas. Por ejemplo, tomemos una tabla ProductCatalog cuya clave de particin es Id.
ProductCatalog(Id, ...)
Puede mapear una clase de la aplicacin cliente a la tabla ProductCatalog tal y como se muestra
en el siguiente cdigo Java. En este fragmento de cdigo se define un objeto Java estndar (POJO)
denominado CatalogItem que utiliza anotaciones para mapear campos de objetos a nombres de
atributos de DynamoDB:
Example
package com.amazonaws.codesamples;
import java.util.Set;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIgnore;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
@DynamoDBHashKey(attributeName="Id")
public Integer getId() { return id;}
public void setId(Integer id) {this.id = id;}
@DynamoDBAttribute(attributeName="Title")
public String getTitle() {return title; }
public void setTitle(String title) { this.title = title; }
@DynamoDBAttribute(attributeName="ISBN")
public String getISBN() { return ISBN; }
public void setISBN(String ISBN) { this.ISBN = ISBN; }
@DynamoDBAttribute(attributeName = "Authors")
public Set<String> getBookAuthors() { return bookAuthors; }
public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; }
@DynamoDBIgnore
public String getSomeProp() { return someProp;}
public void setSomeProp(String someProp) {this.someProp = someProp;}
}
De forma predeterminada, las propiedades de la clase se mapean a los atributos de la tabla que tienen el
mismo nombre. Las propiedades Title e ISBN se mapean a los atributos de la tabla que tienen el mismo
nombre.
La definicin de clase puede tener propiedades que no se mapeen a ningn atributo de la tabla. Estas
propiedades se identifican agregndoles la anotacin @DynamoDBIgnore. En el ejemplo anterior, la
propiedad SomeProp se ha marcado con la anotacin @DynamoDBIgnore. Al cargar una instancia de
CatalogItem en la tabla, la instancia de DynamoDBMapper no incluye la propiedad SomeProp. Tampoco
el mapeador devuelve este atributo cuando se recupera un elemento de la tabla.
Despus de haber definido la clase de mapeo, puede usar mtodos DynamoDBMapper para escribir una
instancia de esa clase en un elemento correspondiente de la tabla Catalog. En el siguiente fragmento de
cdigo se muestra esta tcnica:
mapper.save(item);
En el siguiente fragmento de cdigo se muestra cmo recuperar el elemento y obtener acceso a algunos
de sus atributos:
partitionKey.setId(102);
DynamoDBQueryExpression<CatalogItem> queryExpression = new
DynamoDBQueryExpression<CatalogItem>()
.withHashKeyValues(partitionKey);
DynamoDBMapper ofrece un modo natural e intuitivo de usar los datos de DynamoDB en Java. Tambin
ofrece varias caractersticas integradas, tales como el bloqueo optimista, la generacin automtica de
valores de claves de particin y ordenacin y el control de versiones de objetos.
String
Boolean, boolean
Byte, byte
Date (en una cadena ISO8601 con precisin de milisegundos, convertida a UTC)
Calendar (en una cadena ISO8601 con precisin de milisegundos, convertida a UTC)
Long, long
Integer, int
Double, double
Float, float
BigDecimal
BigInteger
DynamoDB admite los tipos de coleccin Set de Java. Si la propiedad de coleccin mapeada no es de tipo
Set, se genera una excepcin.
En la tabla siguiente se resume el mapeo de los tipos de Java anteriores a los tipos de DynamoDB.
Tipos de coleccin Set SS (tipo String Set), NS (tipo Number Set) o BS (tipo
Binary Set)
La interfaz DynamoDBTypeConverter permite mapear sus propios tipos de datos arbitrarios a un tipo de
datos que sea compatible de forma nativa con DynamoDB. Para obtener ms informacin, consulte Mapeo
de datos arbitrarios (p. 237).
Temas
DynamoDBAttribute (p. 206)
DynamoDBAutoGeneratedKey (p. 206)
DynamoDBDocument (p. 206)
DynamoDBHashKey (p. 207)
DynamoDBIgnore (p. 208)
DynamoDBIndexHashKey (p. 208)
DynamoDBIndexRangeKey (p. 208)
DynamoDBRangeKey (p. 208)
DynamoDBTable (p. 209)
DynamoDBTypeConverted (p. 209)
DynamoDBTyped (p. 209)
DynamoDBVersionAttribute (p. 209)
DynamoDBAttribute
Mapea una propiedad a un atributo de tabla. De forma predeterminada, cada propiedad de clase se
mapea a un atributo de elemento con el mismo nombre. Sin embargo, si los nombres no son iguales,
puede utilizar esta anotacin para mapear una propiedad al atributo. En el siguiente fragmento de Java,
DynamoDBAttribute mapea la propiedad BookAuthors al nombre de atributo Authors de la tabla.
@DynamoDBAttribute(attributeName = "Authors")
public List<String> getBookAuthors() { return BookAuthors; }
public void setBookAuthors(List<String> BookAuthors) { this.BookAuthors = BookAuthors; }
DynamoDBAutoGeneratedKey
Marca una propiedad de clave de particin o de clave de ordenacin como generada automticamente.
DynamoDBMapper genera un UUID aleatorio al guardar estos atributos. Solo se pueden marcar
propiedades de tipo String como claves generadas automticamente.
@DynamoDBTable(tableName="AutoGeneratedKeysExample")
public class AutoGeneratedKeys {
private String id;
private String payload;
@DynamoDBHashKey(attributeName = "Id")
@DynamoDBAutoGeneratedKey
public String getId() { return id; }
public void setId(String id) { this.id = id; }
@DynamoDBAttribute(attributeName="payload")
public String getPayload() { return this.payload; }
public void setPayload(String payload) { this.payload = payload; }
DynamoDBDocument
Indica que una clase se puede serializar como un documento de DynamoDB.
Por ejemplo, supongamos que desea mapear un documento JSON a un atributo de DynamoDB de tipo
Map (M). En el siguiente fragmento de cdigo se define un elemento que contiene un atributo anidado
(Pictures) de tipo Map.
@DynamoDBHashKey(attributeName="Id")
public Integer getId() { return id;}
public void setId(Integer id) {this.id = id;}
@DynamoDBAttribute(attributeName="Pictures")
public Pictures getPictures() { return pictures;}
public void setPictures(Pictures pictures) {this.pictures = pictures;}
@DynamoDBDocument
public static class Pictures {
private String frontView;
private String rearView;
private String sideView;
@DynamoDBAttribute(attributeName = "FrontView")
public String getFrontView() { return frontView; }
public void setFrontView(String frontView) { this.frontView = frontView; }
@DynamoDBAttribute(attributeName = "RearView")
public String getRearView() { return rearView; }
public void setRearView(String rearView) { this.rearView = rearView; }
@DynamoDBAttribute(attributeName = "SideView")
public String getSideView() { return sideView; }
public void setSideView(String sideView) { this.sideView = sideView; }
}
}
A continuacin, podra guardar un nuevo elemento ProductCatalog con imgenes (Pictures), tal y como se
muestra en el siguiente fragmento:
item.setId(123);
mapper.save(item);
{
"Id" : 123
"Pictures" : {
"SideView" : "http://example.com/products/123_left_side.jpg",
"RearView" : "http://example.com/products/123_rear.jpg",
"FrontView" : "http://example.com/products/123_front.jpg"
}
}
DynamoDBHashKey
Mapea una propiedad de clase a la clave de particin de la tabla. La propiedad debe ser un escalar de tipo
String, Number o Binary y no puede ser un tipo de coleccin.
Supongamos que tenemos una tabla, ProductCatalog, cuya clave principal es Id. En el siguiente fragmento
de cdigo Java se define una clase CatalogItem y se mapea su propiedad Id a la clave principal de la
tabla ProductCatalog utilizando la etiqueta @DynamoDBHashKey.
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
private Integer Id;
@DynamoDBHashKey(attributeName="Id")
public Integer getId() {
return Id;
}
public void setId(Integer Id) {
this.Id = Id;
}
// Additional properties go here.
}
DynamoDBIgnore
Indica a la instancia DynamoDBMapper que la propiedad asociada debe pasarse por alto. Al guardar datos
en la tabla, DynamoDBMapper no guarda esta propiedad en la tabla.
DynamoDBIndexHashKey
Mapea una propiedad de clase a la clave de particin de un ndices secundario global. La propiedad debe
ser un escalar de tipo String, Number o Binary y no puede ser un tipo de coleccin.
Use esta anotacin para utilizar una operacin Query en un ndices secundario global. Debe especificar
el nombre de ndice (globalSecondaryIndexName). Si el nombre de la propiedad de clase es distinto
de la clave de particin del ndice, tambin deber especificar el nombre de ese atributo de ndice
(attributeName).
DynamoDBIndexRangeKey
Mapea una propiedad de clase a la clave de ordenacin de un ndices secundario global o un local
secondary index. La propiedad debe ser un escalar de tipo String, Number o Binary y no puede ser un tipo
de coleccin.
Use esta anotacin si tiene que utilizar una operacin Query en un local secondary index o un ndices
secundario global y desea refinar los resultados mediante la clave de ordenacin del ndice. Debe
especificar el nombre de ndice (globalSecondaryIndexName o localSecondaryIndexName).
Si el nombre de la propiedad de clase es distinto de la clave de ordenacin del ndice, tambin deber
especificar el nombre de ese atributo de ndice (attributeName).
DynamoDBRangeKey
Mapea una propiedad de clase a la clave de ordenacin de la tabla. La propiedad debe ser un escalar de
tipo String, Number o Binary y no puede ser un tipo de coleccin.
Si la clave principal es compuesta (clave de particin y clave de ordenacin), puede utilizar esta etiqueta
para mapear el campo de clase a la clave de ordenacin. Por ejemplo, supongamos que tenemos una
tabla Reply en la que se almacenan las respuestas de las conversaciones del foro. Cada conversacin
puede tener muchas respuestas. Por consiguiente, la clave principal de esta tabla consta de ThreadId
y ReplyDateTime. ThreadId es la clave de particin y ReplyDateTime es la clave de ordenacin. En el
siguiente fragmento de cdigo Java se define una clase Reply y se mapea a la tabla Reply. Se utilizan
las etiquetas @DynamoDBHashKey y @DynamoDBRangeKey para identificar las propiedades de clase
mapeadas a la clave principal.
@DynamoDBTable(tableName="Reply")
@DynamoDBHashKey(attributeName="Id")
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@DynamoDBRangeKey(attributeName="ReplyDateTime")
public String getReplyDateTime() { return replyDateTime; }
public void setReplyDateTime(String replyDateTime) { this.replyDateTime =
replyDateTime; }
DynamoDBTable
Identifica la tabla de destino de DynamoDB. Por ejemplo, en el siguiente fragmento de cdigo Java se
define una clase Developer y se mapea a la tabla People de DynamoDB.
@DynamoDBTable(tableName="People")
public class Developer { ...}
La anotacin @DynamoDBTable se puede heredar. Cualquier nueva clase que herede de la clase
Developer tambin se mapea a la tabla People. Por ejemplo, supongamos que hemos creado una clase
Lead que hereda de la clase Developer. Dado que ha mapeado la clase Developer a la tabla People,
los objetos de la clase Lead tambin se almacenan en la misma tabla.
La anotacin @DynamoDBTable tambin se puede anular. Cualquier nueva clase que herede de la clase
Developer se mapea de forma predeterminada a la misma tabla People. Sin embargo, puede anular
este mapeo predeterminado. Por ejemplo, si crea una clase que hereda de la clase Developer, puede
mapearla explcitamente a otra tabla agregando la anotacin @DynamoDBTable como se muestra en el
siguiente fragmento de cdigo Java.
@DynamoDBTable(tableName="Managers")
public class Manager extends Developer { ...}
DynamoDBTypeConverted
Anotacin para marcar que una propiedad usa un convertidor de tipos personalizado. Se puede
anotar con una anotacin definida por el usuario para pasar propiedades adicionales al convertidor
DynamoDBTypeConverter.
La interfaz DynamoDBTypeConverter permite mapear sus propios tipos de datos arbitrarios a un tipo de
datos que sea compatible de forma nativa con DynamoDB. Para obtener ms informacin, consulte Mapeo
de datos arbitrarios (p. 237).
DynamoDBTyped
Anotacin para anular el vnculo de tipo de atributo estndar. Los tipos estndar no requieren la anotacin
si se les aplica el vnculo de atributo predeterminado para ese tipo.
DynamoDBVersionAttribute
Identifica una propiedad de clase para almacenar un nmero de versin de bloqueo optimista.
DynamoDBMapper asigna un nmero de versin a esta propiedad cuando guarda un elemento nuevo e
incrementa su valor cada vez que se actualiza el elemento. Solo se admiten escalares de tipo Number.
Para obtener ms informacin sobre los tipos de datos, consulte Tipos de datos (p. 13). Para obtener ms
informacin sobre el control de versiones, consulte Bloqueo optimista con el nmero de versin (p. 235).
Clase DynamoDBMapper
La clase DynamoDBMapper es el punto de entrada a DynamoDB. Proporciona acceso a un punto
de enlace de DynamoDB y permite obtener acceso a los datos de diversas tablas, realizar distintas
operaciones CRUD con los elementos y ejecutar consultas y exmenes en las tablas. Esta clase
proporciona los siguientes mtodos para trabajar con DynamoDB.
Temas
save (p. 210)
load (p. 211)
delete (p. 211)
query (p. 211)
queryPage (p. 213)
scan (p. 213)
scanPage (p. 214)
parallelScan (p. 214)
batchSave (p. 214)
batchLoad (p. 214)
batchDelete (p. 215)
batchWrite (p. 215)
count (p. 215)
generateCreateTableRequest (p. 215)
createS3Link (p. 215)
getS3ClientCache (p. 216)
save
Guarda el objeto especificado en la tabla. El objeto que se desea guardar es el nico parmetro obligatorio
para este mtodo. Puede usar el objeto DynamoDBMapperConfig para proporcionar parmetros de
configuracin opcionales.
Si no hay un elemento que tenga la misma clave principal, este mtodo crea un nuevo elemento en la
tabla. Si hay un elemento que tiene la misma clave principal, lo actualiza. Si las claves de particin y
ordenacin son de tipo String y se ha anotado con @DynamoDBAutoGeneratedKey, entonces se les
asigna un identificador universal nico (UUID) aleatorio si se deja sin inicializar. Los campos de versin
anotados con @DynamoDBVersionAttribute se incrementarn en una unidad. Adems, si se actualiza
un campo de versin o se genera una clave, el objeto que se ha pasado se actualiza como consecuencia
de la operacin.
Si el control de versiones est habilitado, las versiones del elemento del lado del cliente y del lado del
servidor deben coincidir. Sin embargo, no es preciso que coincidan las versiones si se utiliza la opcin
load
Recupera un elemento de una tabla. Es preciso proporcionar la clave principal del elemento que se desea
recuperar. Puede usar el objeto DynamoDBMapperConfig para proporcionar parmetros de configuracin
opcionales. Por ejemplo, si lo desea puede solicitar lecturas de consistencia alta para asegurarse de que
este mtodo recupere solamente los valores ms recientes de los elementos, como se muestra en la
siguiente instruccin de Java.
De forma predeterminada, DynamoDB devuelve el elemento cuyos valores presentan consistencia final.
Para obtener ms informacin sobre el modelo de consistencia final de DynamoDB, consulte Consistencia
de lectura (p. 16).
delete
Elimina un elemento de la tabla. Debe pasar una instancia de objeto de la clase mapeada.
Si el control de versiones est habilitado, las versiones del elemento del lado del cliente y del lado del
servidor deben coincidir. Sin embargo, no es preciso que coincidan las versiones si se utiliza la opcin
SaveBehavior.CLOBBER. Para obtener ms informacin sobre el control de versiones, consulte Bloqueo
optimista con el nmero de versin (p. 235).
query
Consulta una tabla o un ndice secundario. Solo se puede consultar una tabla o un ndice si cuenta con una
clave principal compuesta (una clave de particin y una clave de ordenacin). Este mtodo requiere que
se proporcione un valor de clave de particin y un filtro de consulta que se aplica a la clave de ordenacin.
Una expresin de filtro incluye una condicin y un valor.
Supongamos que tenemos una tabla Reply en la que se almacenan respuestas de conversaciones de
un foro. Para cada tema de conversacin puede haber 0 o ms respuestas. La clave principal de la tabla
Reply consta de los campos Id y ReplyDateTime, donde Id es la clave de particin y ReplyDateTime es la
clave de ordenacin de la clave .
Ahora, supongamos que hemos creado un mapeo entre una clase Reply y la tabla Reply correspondiente
de DynamoDB. En el siguiente fragmento de cdigo Java se usa DynamoDBMapper para buscar todas las
respuestas de las ltimas dos semanas para un tema de conversacin concreto.
Example
De forma predeterminada, el mtodo query devuelve una coleccin de "carga diferida". Inicialmente
devuelve una sola pgina de resultados y, a continuacin, realiza una llamada de servicio para obtener la
pgina siguiente si es necesario. Para obtener todos los elementos coincidentes, solo tiene que recorrer en
iteracin la coleccin latestReplies.
Para consultar un ndice, antes es preciso modelarlo como clase de mapeador. Supongamos que la tabla
Reply tiene un ndices secundario global denominado PostedBy-Message-Index. La clave de particin de
este ndice es PostedBy y la de ordenacin, Message. La definicin de clase de un elemento del ndice
tendra este aspecto:
@DynamoDBTable(tableName="Reply")
public class PostedByMessage {
private String postedBy;
private String message;
@DynamoDBIndexHashKey(globalSecondaryIndexName = "PostedBy-Message-Index",
attributeName = "PostedBy")
public String getPostedBy() { return postedBy; }
public void setPostedBy(String postedBy) { this.postedBy = postedBy; }
@DynamoDBIndexRangeKey(globalSecondaryIndexName = "PostedBy-Message-Index",
attributeName = "Message")
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
La anotacin @DynamoDBTable indica que este ndice est asociado a la tabla Reply. La anotacin
@DynamoDBIndexHashKey se refiere a la clave de particin (PostedBy) del ndice y la anotacin
@DynamoDBIndexRangeKey, a su clave de ordenacin (Message).
Ahora, puede usar DynamoDBMapper para consultar el ndice y recuperar un subconjunto de los mensajes
publicados por un usuario determinado. Debe especificar withIndexName para que DynamoDB sepa qu
ndice hay que consultar. En el siguiente fragmento de cdigo, se consulta un ndices secundario global.
Es imprescindible especificar withConsistentRead(false), porque los ndices secundarios globales
admiten las lecturas consistentes finales, pero no las de consistencia alta.
queryPage
Consulta una tabla o un ndice secundario y devuelve una sola pgina de resultados coincidentes. Al igual
que con el mtodo query, es preciso especificar un valor de clave de particin y un filtro de consulta que
se aplica al atributo de clave de ordenacin. Sin embargo, queryPage solamente devuelve la primera
"pgina" de datos; es decir, la cantidad de datos que se ajusta a 1 MB.
scan
Examina una tabla o un ndice secundario completos. Si lo desea, puede especificar una expresin
FilterExpression para filtrar el conjunto de resultados.
Supongamos que tenemos una tabla Reply en la que se almacenan respuestas de conversaciones de
un foro. Para cada tema de conversacin puede haber 0 o ms respuestas. La clave principal de la tabla
Reply consta de los campos Id y ReplyDateTime, donde Id es la clave de particin y ReplyDateTime es la
clave de ordenacin de la clave .
Si ha mapeado una clase de Java a la tabla Reply, puede usar DynamoDBMapper para examinar la tabla.
Por ejemplo, en el siguiente fragmento de cdigo Java se examina toda la tabla Reply y nicamente se
devuelven las respuestas de un ao determinado.
Example
De forma predeterminada, el mtodo scan devuelve una coleccin de "carga diferida". Inicialmente
devuelve una sola pgina de resultados y, a continuacin, realiza una llamada de servicio para obtener la
pgina siguiente si es necesario. Para obtener todos los elementos coincidentes, solo tiene que recorrer en
iteracin la coleccin replies.
Para examinar un ndice, antes es preciso modelarlo como clase de mapeador. Supongamos que la tabla
Reply tiene un ndices secundario global denominado PostedBy-Message-Index. La clave de particin de
este ndice es PostedBy y la de ordenacin, Message. En la seccin query (p. 211) se muestra una
clase de mapeador para este ndice, en la que se usan las anotaciones @DynamoDBIndexHashKey y
@DynamoDBIndexRangeKey para especificar las claves de particin y ordenacin del ndice.
scanPage
Examina una tabla o un ndice secundario y devuelve una sola pgina de resultados coincidentes. Al igual
que sucede con el mtodo scan, si lo desea, puede especificar una expresin FilterExpression para
filtrar el conjunto de resultados. Sin embargo, scanPage solamente devuelve la primera "pgina" de datos;
es decir, la cantidad de datos que se ajusta a 1 MB.
parallelScan
Realiza un examen en paralelo de una tabla o un ndice secundario completos. Se especifica un
nmero de segmentos lgicos de la tabla, junto con una expresin de examen para filtrar los resultados.
parallelScan divide la tarea de examen entre varios procesos de trabajo, uno para cada segmento
lgico. Los procesos de trabajo examinan los datos en paralelo y devuelven los resultados.
int numberOfThreads = 4;
Para obtener un ejemplo de cdigo Java que ilustra el uso de parallelScan, consulte Ejemplo: Consulta
y examen (p. 226).
batchSave
Guarda objetos en una o varias tablas mediante una o varias llamadas al mtodo
AmazonDynamoDB.batchWriteItem. Este mtodo no proporciona garantas de transaccin.
En el siguiente fragmento de cdigo Java se guardan dos elementos (libros) en la tabla ProductCatalog.
mapper.batchSave(Arrays.asList(book1, book2));
batchLoad
Recupera varios elementos de una o varias tablas mediante sus claves principales.
En el siguiente fragmento de cdigo Java se recuperan dos elementos de dos tablas distintas.
itemsToGet.add(forumItem);
batchDelete
Elimina objetos de una o varias tablas mediante una o varias llamadas al mtodo
AmazonDynamoDB.batchWriteItem. Este mtodo no proporciona garantas de transaccin.
En el siguiente fragmento de cdigo Java se eliminan dos elementos (libros) de la tabla ProductCatalog.
batchWrite
Guarda o elimina objetos en una o varias tablas mediante una o varias llamadas al mtodo
AmazonDynamoDB.batchWriteItem. Este mtodo no proporciona garantas de transaccin ni admite el
control de versiones (colocaciones o eliminaciones condicionales).
En el siguiente fragmento de cdigo Java se escribe un nuevo elemento en la tabla Foro, se escribe un
nuevo elemento en la tabla Thread y se elimina un elemento de la tabla ProductCatalog.
mapper.batchWrite(objectsToWrite, objectsToDelete);
count
Evala la expresin de examen especificada y devuelve el recuento de elementos coincidentes. No se
devuelven datos de elementos.
generateCreateTableRequest
Analiza una clase de objeto Java estndar (POJO) que representa una tabla de DynamoDB y devuelve una
solicitud de creacin de tabla (CreateTableRequest) para esa tabla.
createS3Link
Crea un enlace a un objeto en Amazon S3. Debe especificar un nombre de bucket y un nombre de clave
para identificar el objeto en el bucket de forma exclusiva.
Para usar createS3Link, la clase de mapeador debe definir mtodos getter y setter. Esto se ilustra en
el siguiente fragmento de cdigo con la adicin de un nuevo atributo y de mtodos getter/setter a la clase
CatalogItem:
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
...
....
@DynamoDBAttribute(attributeName = "ProductImage")
public S3Link getProductImage() {
return productImage;
}
...
}
En el siguiente cdigo Java se define un nuevo elemento para escribirlo en la tabla Product. El elemento
incluye un enlace a la imagen de un producto; los datos de la imagen se cargan en Amazon S3.
item.id = 150;
item.title = "Book 150 Title";
item.getProductImage().uploadFrom(new File("/file/path/book_150_cover.jpg"));
mapper.save(item);
La clase S3Link proporciona muchos mtodos ms para manipular objetos en Amazon S3. Para obtener
ms informacin, consulte los javadocs en Class S3Link.
getS3ClientCache
Devuelve el objeto S3ClientCache subyacente para obtener acceso a Amazon S3. Un objeto
S3ClientCache es un mapa inteligente para objetos AmazonS3Client. Si tiene varios clientes,
entonces S3ClientCache puede ayudarle a organizarlos por regiones y a crear nuevos clientes de Amazon
S3 a peticin.
En el siguiente fragmento de cdigo se crea una clase DynamoDBMapper con ajustes personalizados:
Para obtener ms informacin, consulte DynamoDBMapperConfig en la AWS SDK for Java API Reference.
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName = "ProductCatalog")
public static class CatalogItem {
private Integer id;
private String title;
private String ISBN;
private Set<String> bookAuthors;
// Partition key
@DynamoDBHashKey(attributeName = "Id")
public Integer getId() {
return id;
}
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
this.title = title;
}
@DynamoDBAttribute(attributeName = "ISBN")
public String getISBN() {
return ISBN;
}
@DynamoDBAttribute(attributeName = "Authors")
public Set<String> getBookAuthors() {
return bookAuthors;
}
@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", bookAuthors=" + bookAuthors + ", id=" + id +
", title=" + title + "]";
}
}
if (deletedItem == null) {
System.out.println("Done - Sample item is deleted.");
}
}
}
Para obtener ms informacin sobre las tablas que se utilizan en este ejemplo, consulte Creacin de tablas
y carga de ejemplos de datos (p. 291). Para obtener instrucciones paso a paso sobre cmo realizar las
pruebas del ejemplo siguiente, consulte Ejemplos de cdigo Java (p. 296).
Example
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
testBatchSave(mapper);
testBatchDelete(mapper);
testBatchWrite(mapper);
System.out.println("Example complete!");
}
catch (Throwable t) {
System.err.println("Error running the DynamoDBMapperBatchWriteExample: " + t);
t.printStackTrace();
}
}
@DynamoDBTable(tableName = "ProductCatalog")
public static class Book {
private int id;
private String title;
private String ISBN;
private int price;
private int pageCount;
private String productCategory;
private boolean inPublication;
// Partition key
@DynamoDBHashKey(attributeName = "Id")
public int getId() {
return id;
}
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
@DynamoDBAttribute(attributeName = "ISBN")
public String getISBN() {
return ISBN;
}
@DynamoDBAttribute(attributeName = "Price")
public int getPrice() {
return price;
}
@DynamoDBAttribute(attributeName = "PageCount")
public int getPageCount() {
return pageCount;
}
@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}
@DynamoDBAttribute(attributeName = "InPublication")
public boolean getInPublication() {
return inPublication;
}
@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", price=" + price + ", product category=" +
productCategory + ", id=" + id
+ ", title=" + title + "]";
}
@DynamoDBTable(tableName = "Reply")
public static class Reply {
private String id;
private String replyDateTime;
private String message;
private String postedBy;
// Partition key
@DynamoDBHashKey(attributeName = "Id")
public String getId() {
return id;
}
// Sort key
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
public String getReplyDateTime() {
return replyDateTime;
}
@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}
@DynamoDBAttribute(attributeName = "PostedBy")
@DynamoDBTable(tableName = "Thread")
public static class Thread {
private String forumName;
private String subject;
private String message;
private String lastPostedDateTime;
private String lastPostedBy;
private Set<String> tags;
private int answered;
private int views;
private int replies;
// Partition key
@DynamoDBHashKey(attributeName = "ForumName")
public String getForumName() {
return forumName;
}
// Sort key
@DynamoDBRangeKey(attributeName = "Subject")
public String getSubject() {
return subject;
}
@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}
@DynamoDBAttribute(attributeName = "LastPostedDateTime")
public String getLastPostedDateTime() {
return lastPostedDateTime;
}
@DynamoDBAttribute(attributeName = "LastPostedBy")
public String getLastPostedBy() {
return lastPostedBy;
}
@DynamoDBAttribute(attributeName = "Tags")
public Set<String> getTags() {
return tags;
}
@DynamoDBAttribute(attributeName = "Answered")
public int getAnswered() {
return answered;
}
@DynamoDBAttribute(attributeName = "Views")
public int getViews() {
return views;
}
@DynamoDBAttribute(attributeName = "Replies")
public int getReplies() {
return replies;
}
@DynamoDBTable(tableName = "Forum")
public static class Forum {
private String name;
private String category;
private int threads;
// Partition key
@DynamoDBHashKey(attributeName = "Name")
public String getName() {
return name;
}
@DynamoDBAttribute(attributeName = "Category")
public String getCategory() {
return category;
}
@DynamoDBAttribute(attributeName = "Threads")
A continuacin, en el ejemplo se usa una instancia de DynamoDBMapper para ejecutar las siguientes
operaciones de consulta y examen.
La clave principal de la tabla ProductCatalog es Id. No tiene una clave de ordenacin que forme parte
de la clave principal. Por lo tanto, no puede consultar la tabla. Puede usar el valor de Id para obtener un
elemento.
Ejecutar las siguientes consultas en la tabla Reply.
Por motivos de desempeo, debe usar una consulta y no la operacin de examen. Sin embargo, a veces
puede que necesite examinar una tabla. Supongamos que se ha cometido un error al especificar los
datos y que el precio de uno de los libros se ha establecido en un valor menor que 0. En este ejemplo se
examina la tabla ProductCategory para buscar los elementos de libros (el valor de ProductCategory es
"book") cuyo precio es menor que 0.
Realizar un examen en paralelo de la tabla ProductCatalog para encontrar las bicicletas de un tipo
especfico.
Note
En este ejemplo de cdigo, se presupone que los datos ya se han cargado en DynamoDB para
su cuenta siguiendo las instrucciones de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291).
Para obtener instrucciones paso a paso acerca de cmo ejecutar el ejemplo, consulte Ejemplos
de cdigo Java (p. 296).
Example
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
// Scan a table and find book items priced less than specified
// value.
FindBooksPricedLessThanSpecifiedValue(mapper, "20");
// Scan a table with multiple threads and find bicycle items with a
// specified bicycle type
int numberOfThreads = 16;
FindBicyclesOfSpecificTypeWithMultipleThreads(mapper, numberOfThreads, "Road");
System.out.println("Example complete!");
}
catch (Throwable t) {
System.err.println("Error running the DynamoDBMapperQueryScanExample: " + t);
t.printStackTrace();
}
}
System.out.println(
"FindRepliesPostedWithinTimePeriod: Find replies for thread Message = 'DynamoDB
Thread 2' posted within a period.");
long startDateMilli = (new Date()).getTime() - (14L * 24L * 60L * 60L * 1000L); //
Two
//
weeks
//
ago.
long endDateMilli = (new Date()).getTime() - (7L * 24L * 60L * 60L * 1000L); // One
//
week
//
ago.
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-
dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String startDate = dateFormatter.format(startDateMilli);
String endDate = dateFormatter.format(endDateMilli);
System.out.println("FindBicyclesOfSpecificTypeWithMultipleThreads: Scan
ProductCatalog With Multiple Threads.");
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS("Bicycle"));
eav.put(":val2", new AttributeValue().withS(bicycleType));
@DynamoDBTable(tableName = "ProductCatalog")
public static class Book {
private int id;
private String title;
private String ISBN;
private int price;
private int pageCount;
private String productCategory;
private boolean inPublication;
@DynamoDBHashKey(attributeName = "Id")
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
@DynamoDBAttribute(attributeName = "ISBN")
public String getISBN() {
return ISBN;
}
@DynamoDBAttribute(attributeName = "Price")
public int getPrice() {
return price;
}
@DynamoDBAttribute(attributeName = "PageCount")
public int getPageCount() {
return pageCount;
}
@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}
@DynamoDBAttribute(attributeName = "InPublication")
public boolean getInPublication() {
return inPublication;
}
@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", price=" + price + ", product category=" +
productCategory + ", id=" + id
@DynamoDBTable(tableName = "ProductCatalog")
public static class Bicycle {
private int id;
private String title;
private String description;
private String bicycleType;
private String brand;
private int price;
private List<String> color;
private String productCategory;
@DynamoDBHashKey(attributeName = "Id")
public int getId() {
return id;
}
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
@DynamoDBAttribute(attributeName = "Description")
public String getDescription() {
return description;
}
@DynamoDBAttribute(attributeName = "BicycleType")
public String getBicycleType() {
return bicycleType;
}
@DynamoDBAttribute(attributeName = "Brand")
public String getBrand() {
return brand;
}
@DynamoDBAttribute(attributeName = "Price")
public int getPrice() {
return price;
}
@DynamoDBAttribute(attributeName = "Color")
public List<String> getColor() {
return color;
}
@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}
@Override
public String toString() {
return "Bicycle [Type=" + bicycleType + ", color=" + color + ", price=" + price
+ ", product category="
+ productCategory + ", id=" + id + ", title=" + title + "]";
}
@DynamoDBTable(tableName = "Reply")
public static class Reply {
private String id;
private String replyDateTime;
private String message;
private String postedBy;
// Partition key
@DynamoDBHashKey(attributeName = "Id")
public String getId() {
return id;
}
// Range key
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
public String getReplyDateTime() {
return replyDateTime;
}
@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}
@DynamoDBAttribute(attributeName = "PostedBy")
public String getPostedBy() {
return postedBy;
}
@DynamoDBTable(tableName = "Thread")
public static class Thread {
private String forumName;
private String subject;
private String message;
private String lastPostedDateTime;
private String lastPostedBy;
private Set<String> tags;
private int answered;
private int views;
private int replies;
// Partition key
@DynamoDBHashKey(attributeName = "ForumName")
public String getForumName() {
return forumName;
}
// Range key
@DynamoDBRangeKey(attributeName = "Subject")
public String getSubject() {
return subject;
}
@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}
@DynamoDBAttribute(attributeName = "LastPostedDateTime")
public String getLastPostedDateTime() {
return lastPostedDateTime;
}
@DynamoDBAttribute(attributeName = "LastPostedBy")
public String getLastPostedBy() {
return lastPostedBy;
}
@DynamoDBAttribute(attributeName = "Tags")
public Set<String> getTags() {
return tags;
}
@DynamoDBAttribute(attributeName = "Answered")
public int getAnswered() {
return answered;
}
@DynamoDBAttribute(attributeName = "Views")
public int getViews() {
return views;
}
@DynamoDBAttribute(attributeName = "Replies")
public int getReplies() {
return replies;
}
@DynamoDBTable(tableName = "Forum")
public static class Forum {
private String name;
private String category;
private int threads;
@DynamoDBHashKey(attributeName = "Name")
public String getName() {
return name;
}
@DynamoDBAttribute(attributeName = "Category")
public String getCategory() {
return category;
}
@DynamoDBAttribute(attributeName = "Threads")
public int getThreads() {
return threads;
}
Con el bloqueo optimista, cada elemento tiene un atributo que acta como nmero de versin. Si recupera
un elemento de una tabla, la aplicacin registra el nmero de versin de ese elemento. Puede actualizar el
elemento, pero solo si el nmero de versin del lado del servidor no ha cambiado. Si la versin no coincide,
significa que alguien ha modificado el elemento antes que usted; en este caso, el intento de actualizacin
no se realiza, porque su versin del elemento est anticuada. Si esto ocurre, solo hay que volver a intentar
recuperar el elemento y actualizarlo. El bloqueo optimista impide sobrescribir accidentalmente los cambios
realizados por otros; tambin impide que otros sobrescriban accidentalmente los cambios que ha realizado
usted.
Para admitir el bloqueo optimista, el AWS SDK for Java proporciona la anotacin
@DynamoDBVersionAttribute. En la clase de mapeo de la tabla, debe designar una propiedad en la
que se almacenar el nmero de versin y marcarla con esta anotacin. Al guardar un objeto, el elemento
correspondiente de la tabla de DynamoDB tendr un atributo en el que se almacenar el nmero de
versin. DynamoDBMapper asigna un nmero de versin la primera vez que se guarda el objeto y aumenta
automticamente este nmero de versin cada vez que se actualiza el elemento. Las solicitudes de
actualizacin o eliminacin solamente se llevarn a cabo si la versin del objeto en el lado del cliente
coincide con el nmero de versin del elemento correspondiente en la tabla de DynamoDB.
Por ejemplo, en el siguiente fragmento de cdigo Java se define una clase CatalogItem que tiene varias
propiedades. La propiedad Version est etiquetada con la anotacin @DynamoDBVersionAttribute.
Example
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
@DynamoDBHashKey(attributeName="Id")
@DynamoDBAttribute(attributeName="Title")
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
@DynamoDBAttribute(attributeName="ISBN")
public String getISBN() { return ISBN; }
public void setISBN(String ISBN) { this.ISBN = ISBN;}
@DynamoDBAttribute(attributeName = "Authors")
public Set<String> getBookAuthors() { return bookAuthors; }
public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; }
@DynamoDBIgnore
public String getSomeProp() { return someProp;}
public void setSomeProp(String someProp) {this.someProp = someProp;}
@DynamoDBVersionAttribute
public Long getVersion() { return version; }
public void setVersion(Long version) { this.version = version;}
}
Puede aplicar la anotacin @DynamoDBVersionAttribute a los tipos que admiten valores null; estos
estn disponibles en las clases encapsuladoras primitivas que proporcionan un tipo que admite valores
null, tales como Long e Integer.
El bloqueo optimista afecta a los siguientes mtodos de DynamoDBMapper como se indica a continuacin:
save: para un elemento nuevo, DynamoDBMapper asigna un nmero de versin inicial de 1. Si recupera
un elemento, actualiza una o varias de sus propiedades e intenta guardar los cambios, la operacin
de almacenamiento solamente se lleva a cabo si el nmero de versin del lado del cliente coincide
con el nmero de versin del lado del servidor. DynamoDBMapper incrementa el nmero de versin
automticamente.
delete: el mtodo delete toma un objeto como parmetro y DynamoDBMapper lleva a cabo una
comprobacin de versin antes de eliminar el elemento. La comprobacin de versin se puede
deshabilitar si se especifica DynamoDBMapperConfig.SaveBehavior.CLOBBER en la solicitud.
La implementacin interna del bloqueo optimista en DynamoDBMapper utiliza la compatibilidad con las
acciones de actualizacin condicional y eliminacin condicional que DynamoDB proporciona.
Tambin puede establecer el comportamiento de bloqueo para una operacin especfica. Por ejemplo,
en el siguiente fragmento de cdigo Java se usa DynamoDBMapper para guardar un elemento de
catlogo. Se agrega el parmetro opcional DynamoDBMapperConfig al mtodo save para especificar
DynamoDBMapperConfig.SaveBehavior.
Example
Por ejemplo, tomemos la siguiente clase CatalogItem que define una propiedad, Dimension, del tipo
DimensionType. Esta propiedad almacena las dimensiones del elemento, tales como anchura, anchura
o espesor. Supongamos que decide almacenar estas dimensiones del elemento en una cadena (por
ejemplo, 8.5x11x.05) en DynamoDB. En el ejemplo siguiente se proporciona el cdigo convertidor que
convierte el objeto DimensionType en una cadena y una cadena al tipo DimensionType.
Note
En este ejemplo de cdigo, se presupone que los datos ya se han cargado en DynamoDB para
su cuenta siguiendo las instrucciones de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291).
Para obtener instrucciones paso a paso acerca de cmo ejecutar el ejemplo, consulte Ejemplos
de cdigo Java (p. 296).
Example
package com.amazonaws.codesamples.datamodeling;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverted;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
bookRetrieved.getDimensions().setHeight("9.0");
bookRetrieved.getDimensions().setLength("12.0");
bookRetrieved.getDimensions().setThickness("2.0");
mapper.save(bookRetrieved);
@DynamoDBTable(tableName = "ProductCatalog")
public static class Book {
private int id;
private String title;
private String ISBN;
private Set<String> bookAuthors;
private DimensionType dimensionType;
// Partition key
@DynamoDBHashKey(attributeName = "Id")
public int getId() {
return id;
}
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
@DynamoDBAttribute(attributeName = "ISBN")
public String getISBN() {
return ISBN;
}
@DynamoDBAttribute(attributeName = "Authors")
public Set<String> getBookAuthors() {
return bookAuthors;
}
@DynamoDBTypeConverted(converter = DimensionTypeConverter.class)
@DynamoDBAttribute(attributeName = "Dimensions")
public DimensionType getDimensions() {
return dimensionType;
}
@DynamoDBAttribute(attributeName = "Dimensions")
public void setDimensions(DimensionType dimensionType) {
this.dimensionType = dimensionType;
}
@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", bookAuthors=" + bookAuthors + ",
dimensionType= "
+ dimensionType.getHeight() + " X " + dimensionType.getLength() + " X " +
dimensionType.getThickness()
+ ", Id=" + id + ", Title=" + title + "]";
}
}
@Override
public String convert(DimensionType object) {
DimensionType itemDimensions = (DimensionType) object;
String dimension = null;
try {
if (itemDimensions != null) {
dimension = String.format("%s x %s x %s", itemDimensions.getLength(),
itemDimensions.getHeight(),
itemDimensions.getThickness());
}
}
catch (Exception e) {
e.printStackTrace();
}
return dimension;
}
@Override
public DimensionType unconvert(String s) {
return itemDimension;
}
}
}
El AWS SDK para .NET proporciona clases de modelo de documento que encapsulan algunas de las
operaciones de bajo nivel de DynamoDB y as le ayudan a simplificar la codificacin. En el modelo de
documento, las clases principales son Table y Document. La clase Table proporciona mtodos de
operaciones de datos, como PutItem, GetItem y DeleteItem. Adems, proporciona los mtodos
Query y Scan. La clase Document representa un solo elemento de una tabla.
Las clases del modelo de documento citadas estn disponibles en el espacio de nombres
Amazon.DynamoDBv2.DocumentModel.
Para llevar a cabo operaciones de datos con el modelo de documento, previamente debe llamar al mtodo
Table.LoadTable, que crea una instancia de la clase Table que representa una tabla especfica. En
el siguiente fragmento de cdigo C# se crea un objeto Table que representa la tabla ProductCatalog de
DynamoDB.
Example
Note
En general, el mtodo LoadTable se usa una vez al principio de la aplicacin porque realiza una
llamada a DescribeTable que agrega el recorrido de ida y vuelta a DynamoDB.
A continuacin, puede utilizar el objeto de tabla para realizar diversas operaciones de datos. Cada una de
estas operaciones de datos presenta dos tipos de sobrecarga; uno que acepta los parmetros mnimos
imprescindibles y otro que, adems, acepta informacin de configuracin opcional especfica de la
operacin. Por ejemplo, para recuperar un elemento, debe proporcionar el valor de clave principal de la
tabla, en cuyo caso puede utilizar la siguiente sobrecarga de GetItem:
Example
// Get the item from a table that has a primary key that is composed of only a partition
key.
Table.GetItem(Primitive partitionKey);
// Get the item from a table whose primary key is composed of both a partition key and sort
key.
Table.GetItem(Primitive partitionKey, Primitive sortKey);
Tambin puede pasar parmetros opcionales a estos mtodos. Por ejemplo, la operacin GetItem
anterior devuelve el elemento completo, incluidos todos sus atributos. Si lo desea, puede especificar una
lista de atributos que se van a recuperar. En este caso, se utiliza la siguiente sobrecarga de GetItem, que
acepta el parmetro del objeto de configuracin especfico de la operacin:
Example
Puede utilizar el objeto de configuracin para especificar varios parmetros opcionales como, por ejemplo,
solicitar una lista de atributos concretos o especificar el tamao de pgina (nmero de elementos por
pgina). Cada mtodo de operacin de datos tiene su propia clase de configuracin. Por ejemplo, la
clase GetItemOperationConfig permite proporcionar opciones para la operacin GetItem y la clase
PutItemOperationConfig permite proporcionar parmetros opcionales para la operacin PutItem.
En las siguientes secciones se explican las distintas operaciones de datos que la clase Table admite.
1. Ejecute el mtodo Table.LoadTable que proporciona el nombre de la tabla en la que desea colocar
un elemento.
2. Cree un objeto Document que tenga una lista de nombres de atributos y sus valores.
3. Ejecute Table.PutItem proporcionando la instancia de Document como parmetro.
En el siguiente fragmento de cdigo C# se ponen en prctica las tareas anteriores. En el ejemplo se carga
un elemento en la tabla ProductCatalog.
Example
table.PutItem(book);
En el ejemplo anterior, la instancia de Document crea un elemento con atributos de tipo Number,
String, String Set, Boolean y Null. Null se utiliza para indicar que el valor de QuantityOnHand de este
producto se desconoce. Para los tipos Boolean y Null, use los mtodos de constructor DynamoDBBool y
DynamoDBNull.
En DynamoDB, los tipos de datos List y Map pueden contener entradas compuestas de otros tipos de
datos. A continuacin se muestra cmo mapear estos tipos de datos al API del modelo de documento.
Puede modificar el ejemplo anterior para agregar un atributo de tipo List al elemento. Para ello, se usa un
constructor DynamoDBList, como se muestra en el fragmento de cdigo siguiente:
Example
table.PutItem(book);
Para agregar un atributo Map al libro, se define otro objeto Document. En el siguiente fragmento de cdigo
se ilustra cmo hacerlo.
Example
book.Add("Pictures", pictures);
table.PutItem(book);
Estos ejemplos se basan en el elemento mostrado en Especificacin de atributos de elementos (p. 352).
El modelo de documento permite crear atributos anidados complejos, como el atributo ProductReviews
mostrado en el caso prctico.
El parmetro ConditionalExpression para hacer que esta sea una solicitud de colocacin
condicional. En el ejemplo se crea una expresin que especifica que el atributo ISBN debe tener un valor
especfico que ha de estar presente en el elemento que se va a sustituir.
Example
table.PutItem(book, config);
Example
La operacin GetItem devuelve todos los atributos del elemento y, de forma predeterminada, utiliza la
lectura consistente final (consulte Consistencia de lectura (p. 16)).
El parmetro ConsistentRead para solicitar los valores ms recientes de todos los atributos
especificados. Para obtener ms informacin sobre la consistencia de datos, consulte Consistencia de
lectura (p. 16).
Example
Al recuperar un elemento usando el API de modelo de documento, puede obtener acceso a los elementos
individuales en el objeto Document devuelto:
Example
int id = doc["Id"].AsInt();
string title = doc["Title"].AsString();
List<string> authors = doc["Authors"].AsListOfString();
bool inStock = doc["InStock"].AsBoolean();
DynamoDBNull quantityOnHand = doc["QuantityOnHand"].AsDynamoDBNull();
Para los atributos de tipo List o Map, a continuacin se muestra cmo mapearlos al API de modelo de
documento:
En el siguiente fragmento de cdigo se muestra cmo recuperar un elemento de tipo List (RelatedItems) y
otro de tipo Map (Pictures) del objeto Document:
Example
Example
El parmetro ConditionalExpression para garantizar que el atributo ISBN del elemento de libro que
se va a eliminar tenga un valor especfico.
El parmetro ReturnValues para solicitar que el mtodo Delete devuelva el elemento que ha
eliminado.
Example
Puede usar la operacin UpdateItem para actualizar los valores de atributos presentes y agregar
atributos nuevos a la coleccin existente o eliminarlos de ella. Para proporcionar estas actualizaciones, se
crea una instancia de Document que describe las actualizaciones que se desea llevar a cabo.
Note
Esta operacin UpdateItem de nivel intermedio no admite la accin Add (consulte UpdateItem)
compatible con la operacin de DynamoDB subyacente.
Note
A continuacin se indican los pasos que hay que seguir para actualizar un elemento mediante el modelo
de documento del AWS SDK para .NET.
Debe proporcionar la clave principal, bien en la instancia de Document, o bien explcitamente como
parmetro.
Example
table.Update(book);
Example
Cuando se utiliza el API del modelo de documento, se puede especificar cualquier cantidad de
operaciones en un lote. No obstante, tenga en cuenta que DynamoDB limita el nmero de operaciones
de un lote y el tamao total del lote para una operacin por lotes. Para obtener ms informacin acerca
de los lmites especficos, consulte BatchWriteItem. Si el API del modelo de documento detecta que la
solicitud de escritura por lotes ha superado el nmero permitido de solicitudes de escritura o la carga de
HTTP de un lote ha superado el lmite permitido por BatchWriteItem, divide el lote en varios lotes de
menor tamao. Adems, si una respuesta a una escritura por lotes devuelve elementos sin procesar,
el API del modelo de documento enva automticamente otra solicitud de escritura por lotes con esos
elementos que no se han procesado.
batchWrite.AddDocumentToPut(book1);
// specify delete item using overload that takes PK.
batchWrite.AddKeyToDelete(12345);
batchWrite.Execute();
Para ver un ejemplo prctico, consulte Ejemplo: Operaciones por lotes con el API del modelo de
documento del AWS SDK para .NET (p. 253).
Puede utilizar la operacin de escritura por lotes para realizar operaciones de colocacin y eliminacin
en varias tablas. A continuacin se indican los pasos que debe seguir para colocar o eliminar varios
elementos en varias tablas con el API del modelo de documento del AWS SDK para .NET.
1. Se crea una instancia de DocumentBatchWrite por cada tabla en la que se desea colocar o eliminar
varios elementos como se describe en el procedimiento anterior.
2. Cree una instancia de MultiTableDocumentBatchWrite y agregue en ella los objetos
DocumentBatchWrite individuales.
3. Ejecute el mtodo MultiTableDocumentBatchWrite.Execute.
superBatch.Execute();
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using System.Linq;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class MidlevelItemCRUD
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
private static string tableName = "ProductCatalog";
// The sample uses the following id PK value to add book item.
private static int sampleBookId = 555;
{
Table productCatalog = Table.LoadTable(client, tableName);
CreateBookItem(productCatalog);
RetrieveBook(productCatalog);
// Couple of sample updates.
UpdateMultipleAttributes(productCatalog);
UpdateBookPriceConditionally(productCatalog);
// Delete.
DeleteBook(productCatalog);
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
}
productCatalog.PutItem(book);
}
// Optional parameters.
UpdateItemOperationConfig config = new UpdateItemOperationConfig
{
// Get updated item in response.
ReturnValues = ReturnValues.AllNewAttributes
};
Document updatedBook = productCatalog.UpdateItem(book, config);
Console.WriteLine("UpdateMultipleAttributes: Printing item after updates ...");
PrintDocument(updatedBook);
}
// Optional parameters.
UpdateItemOperationConfig config = new UpdateItemOperationConfig
{
ConditionalExpression = expr,
ReturnValues = ReturnValues.AllNewAttributes
};
Document updatedBook = productCatalog.UpdateItem(book, config);
Console.WriteLine("UpdateBookPriceConditionally: Printing item whose price was
conditionally updated");
PrintDocument(updatedBook);
}
}
}
}
Ejemplo: Escritura por lotes con el modelo de documento del AWS SDK
para .NET
En el siguiente ejemplo de cdigo C# se ilustran las operaciones de escritura por lotes en una tabla y en
varias. En el ejemplo se realizan las siguientes tareas:
Para ilustrar la escritura por lotes en una nica tabla, se agregan dos elementos a la tabla
ProductCatalog.
Para ilustrar la escritura por lotes en varias tablas, se agrega un elemento a las tablas Forum y Thread y
se elimina otro de esta ltima.
Si ha seguido los pasos de Creacin de tablas y carga de ejemplos de datos (p. 291), habr creado
ya las tablas ProductCatalog, Forum y Thread. Tambin puede crear estos ejemplos de tablas mediante
programacin. Para obtener ms informacin, consulte Creacin de ejemplos de tablas y carga de datos
mediante el AWS SDK para .NET (p. 790). Para obtener instrucciones paso a paso sobre cmo realizar
las pruebas del ejemplo siguiente, consulte Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class MidLevelBatchWriteItem
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
static void Main(string[] args)
{
try
{
SingleTableBatchWrite();
MultiTableBatchWrite();
}
catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
batchWrite.AddDocumentToPut(book1);
// Specify delete item using overload that takes PK.
batchWrite.AddKeyToDelete(12345);
Console.WriteLine("Performing batch write in SingleTableBatchWrite()");
batchWrite.Execute();
}
El mtodo Query proporciona dos sobrecargas. Los parmetros mnimos que requiere el mtodo Query
son un valor de clave de particin y un filtro de clave de ordenacin. Puede utilizar la siguiente sobrecarga
para proporcionar estos parmetros mnimos necesarios.
Example
Por ejemplo, en el siguiente fragmento de cdigo C# se realiza una consulta para obtener todas las
respuestas del foro publicadas en los ltimos 15days.
Example
Con ello se crea un objeto Search. Ahora, puede llamar al mtodo Search.GetNextSet de manera
iterativa para recuperar una pgina de resultados a la vez, como se muestra en el siguiente fragmento de
cdigo C#. El cdigo imprime los valores de los atributos de elemento que la consulta devuelve.
Example
in value.AsPrimitiveList().Entries
select primitive.Value).ToArray());
Console.WriteLine("{0} - {1}", attribute, stringValue);
}
}
Tambin puede especificar parmetros opcionales para Query, tales como una lista de atributos
que recuperar, la lectura de consistencia alta, el tamao de pgina y el nmero de elementos
devueltos por pgina. Para obtener una lista completa de parmetros, consulte Query. Para especificar
parmetros opcionales, debe usar la siguiente sobrecarga en la que se proporciona el objeto
QueryOperationConfig.
Example
Query(QueryOperationConfig config);
Supongamos que desea ejecutar la consulta del ejemplo anterior (recuperar las respuestas del foro
publicadas en los ltimos 15das). Sin embargo, supongamos que desea proporcionar parmetros
de consulta opcionales para recuperar solo determinados atributos y, adems, solicitar la lectura
de consistencia alta. En el siguiente fragmento de cdigo C# se construye la solicitud con el objeto
QueryOperationConfig.
Example
En el siguiente ejemplo de cdigo C# se usa el mtodo Table.Query para ejecutar los siguientes
ejemplos de consultas:
En esta consulta se utiliza el operador de consulta Between para buscar las respuestas publicados
entre dos fechas.
Obtener un producto de la tabla ProductCatalog.
Dado que la tabla ProductCatalog tiene una clave principal que consta nicamente de una clave de
particin, solo se pueden obtener elementos; no se puede consultar la tabla. En el ejemplo se recupera
un elemento de producto especficos mediante su Id.
Example
using System;
using System.Collections.Generic;
using System.Linq;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class MidLevelQueryAndScan
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
// Get Example.
Table productCatalogTable = Table.LoadTable(client, "ProductCatalog");
int productId = 101;
GetProduct(productCatalogTable, productId);
// Use Query overloads that takes the minimum required query parameters.
Search search = table.Query(filter);
do
{
documentList = search.GetNextSet();
Console.WriteLine("\nFindRepliesPostedWithinTimePeriod: printing replies
posted within dates: {0} and {1} ............", startDate, endDate);
foreach (var document in documentList)
{
PrintDocument(document);
}
} while (!search.IsDone);
}
Example
Scan(ScanFilter filter);
Por ejemplo, supongamos que tenemos una tabla de conversaciones del foro para registrar informacin
como el asunto de la conversacin (clave principal), el mensaje correspondiente, el Id del foro al que
pertenece la conversacin, las etiquetas y otros datos. Supongamos que el asunto es la clave principal.
Example
Esta es una versin simplificada de los foros y conversaciones presentes en los foros de AWS (consulte
Discussion Forums). En el siguiente fragmento de cdigo C# se consultan todas las conversaciones de un
foro determinado (ForumId = 101) que tiene la etiqueta "sortkey". Dado que la ForumId no es una clave
principal, en el ejemplo se examina la tabla. ScanFilter incluye dos condiciones. La consulta devuelve
todas las conversaciones que cumplen ambas condiciones.
Example
Tambin puede especificar parmetros opcionales en Scan, tales como una lista de atributos concretos
que recuperar o si se llevar a cabo una lectura de consistencia alta. Para especificar parmetros
opcionales, debe crear un objeto ScanOperationConfig que incluya tanto los parmetros requeridos
como los opcionales y usar la sobrecarga siguiente.
Example
Scan(ScanOperationConfig config);
En el siguiente fragmento de cdigo C# se ejecuta la misma consulta anterior (buscar las conversaciones
del foro cuyo ForumId sea 101 y cuyo atributo Tag contenga la palabra clave "sortkey"). Sin embargo,
esta vez vamos a suponer que deseamos agregar un parmetro opcional para recuperar solo una lista de
atributos especficos. En este caso, es preciso crear un objeto ScanOperationConfig proporcionando
todos los parmetros, requeridos y opcionales, como se muestra en el ejemplo de cdigo siguiente.
Example
La operacin Scan lleva a cabo un examen de toda la tabla, por lo que existe la posibilidad de que resulte
costosa. Es preferible usar consultas en su lugar. Sin embargo, hay ocasiones en que podra ser necesario
ejecutar un examen en una tabla. Por ejemplo, si se ha producido un error al especificar los datos de
precios de los productos, habr que examinar la tabla como se muestra en el siguiente ejemplo de cdigo
C#. En el ejemplo se examina la tabla ProductCatalog para hallar los productos cuyo valor de precio es
inferior a 0. En el ejemplo se ilustra el uso de dos sobrecargas de Table.Scan.
Puede pasar el parmetro ScanFilter cuando solamente se deban pasar los parmetros requeridos.
Table.Scan, que acepta el objeto ScanOperationConfig como parmetro.
Example
using System;
using System.Collections.Generic;
using System.Linq;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
namespace com.amazonaws.codesamples
{
class MidLevelScanOnly
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
El AWS SDK para .NET proporciona un modelo de persistencia de objetos que permite mapear las clases
del lado del cliente a las tablas de DynamoDB. A continuacin, cada instancia de objeto se mapea a
un elemento en las tablas correspondientes. Para guardar los objetos del lado del cliente en las tablas,
el modelo de persistencia de objetos proporciona la clase DynamoDBContext, un punto de entrada a
DynamoDB. Esta clase le ofrece una conexin a DynamoDB y le permite obtener acceso a tablas, realizar
diversas operaciones CRUD y ejecutar consultas.
El modelo de persistencia de objetos proporciona un conjunto de atributos para mapear las clases del lado
del cliente a tablas, y las propiedades/campos a atributos de tabla.
Note
Para mostrar cmo funciona el modelo de persistencia de objetos, vamos a seguir un ejemplo paso a paso.
Comenzaremos por la tabla ProductCatalog. Su clave principal es Id.
ProductCatalog(Id, ...)
Supongamos que tiene una clase Book con las propiedades Title, ISBN y Authors. Puede mapear la clase
Book a la tabla ProductCatalog agregando los atributos definidos por el modelo de persistencia de objetos,
como se muestra en el siguiente fragmento de cdigo C#.
Example
[DynamoDBTable("ProductCatalog")]
public class Book
{
[DynamoDBHashKey]
public int Id { get; set; }
[DynamoDBProperty("Authors")]
public List<string> BookAuthors { get; set; }
[DynamoDBIgnore]
public string CoverPage { get; set; }
}
El modelo de persistencia de objetos admite el mapeo tanto explcito como predeterminado entre las
propiedades de clase y los atributos de tabla.
Mapeo explcito: para mapear una propiedad a una clave principal, debe usar los atributos
DynamoDBHashKey y DynamoDBRangeKey del modelo de persistencia de objetos. Adems, en el
caso de los atributos sin clave principal, si un nombre de propiedad de la clase y el atributo de tabla
correspondiente al que desea mapearlo no son iguales, debe definir el mapeo agregando explcitamente
el atributo DynamoDBProperty.
En el ejemplo anterior, las propiedades Title e ISBN se mapean a los atributos del mismo nombre de
la tabla ProductCatalog.
No tiene que mapear cada propiedad de clase. Puede identificar estas propiedades agregando el atributo
DynamoDBIgnore. Al guardar una instancia de Book en la tabla, DynamoDBContext no incluye la
propiedad CoverPage. Tampoco se devolver esta propiedad cuando se recupere la instancia del libro.
Puede mapear propiedades de tipos primitivos de .NET, como int o string. Tambin puede mapear
cualquier tipo de datos arbitrarios, siempre y cuando proporcione un convertidor adecuado para mapear
los datos arbitrarios a uno de los tipos de DynamoDB. Para obtener ms informacin sobre cmo mapear
tipos arbitrarios, consulte Mapeo de datos arbitrarios con DynamoDB mediante el modelo de persistencia
de objetos del AWS SDK para .NET (p. 274).
El modelo de persistencia de objetos admite el bloqueo optimista. Durante una operacin de actualizacin,
esto garantiza que se disponga de la ltima copia del elemento que se va a actualizar. Para obtener
ms informacin, consulte Bloqueo optimista con nmero de versin de DynamoDB con el modelo de
persistencia de objetos del AWS SDK para .NET (p. 272).
Atributos de DynamoDB
En esta seccin se describen los atributos que ofrece el modelo de persistencia de objetos para que pueda
mapear las clases y propiedades a tablas y atributos de DynamoDB.
Note
En los atributos siguientes, solo son obligatorios DynamoDBTable y DynamoDBHashKey.
DynamoDBGlobalSecondaryIndexHashKey
Mapea una propiedad de clase a la clave de particin de un ndices secundario global. Use este atributo
para utilizar una operacin Query en un ndices secundario global.
DynamoDBGlobalSecondaryIndexRangeKey
Mapea una propiedad de clase a la clave de ordenacin de un ndices secundario global. Use este atributo
si tiene que utilizar una operacin Query en un ndices secundario global y desea refinar los resultados
mediante la clave de ordenacin del ndice.
DynamoDBHashKey
Mapea una propiedad de clase a la clave de particin de la clave principal de la tabla. Los atributos de
clave principal no pueden ser un tipo de coleccin.
En los siguientes ejemplos de cdigo C# se mapea la clase Book a la tabla ProductCatalog y la propiedad
Id a la clave de particin de la clave principal de la tabla.
[DynamoDBTable("ProductCatalog")]
public class Book {
[DynamoDBHashKey]
public int Id { get; set; }
DynamoDBIgnore
Indica que la propiedad asociada debe pasarse por alto. Si no desea guardar ninguna de las propiedades
de clase, puede agregar este atributo para indicar a DynamoDBContext que no incluya esta propiedad
cuando guarde objetos en la tabla.
DynamoDBLocalSecondaryIndexRangeKey
Mapea una propiedad de clase a la clave de ordenacin de un local secondary index. Use este atributo si
tiene que utilizar una operacin Query en un local secondary index y desea refinar los resultados mediante
la clave de ordenacin del ndice.
DynamoDBProperty
Mapea una propiedad de clase a un atributo de tabla. Si la propiedad de clase se mapea al atributo de
tabla con el mismo nombre, no es preciso especificarlo. Sin embargo, si los nombres no son iguales,
puede utilizar esta etiqueta para realizar el mapeo. En la siguiente instruccin de C#, DynamoDBProperty
mapea la propiedad BookAuthors al atributo Authors de la tabla.
[DynamoDBProperty("Authors")]
public List<string> BookAuthors { get; set; }
DynamoDBContext utiliza esta informacin de mapeo para crear el atributo Authors al guardar datos de
objetos en la tabla correspondiente.
DynamoDBRenamable
Especifica un nombre alternativo para una propiedad de clase. Esto resulta til si va a escribir un
convertidor personalizado para mapear datos arbitrarios a una tabla de DynamoDB cuando el nombre de
una propiedad de clase sea distinto del nombre del atributo de tabla.
DynamoDBRangeKey
Mapea una propiedad de clase a la clave de ordenacin de la clave principal de la tabla. Si la tabla tiene
una clave principal compuesta (clave de particin y clave de ordenacin), entonces debe especificar
ambos atributos, DynamoDBHashKey y DynamoDBRangeKey, en el mapeo de clase.
Por ejemplo, en el ejemplo de tabla Reply, la clave principal consta de la clave de particin Id y de la clave
de ordenacin Replenishment. En el siguiente ejemplo de cdigo C# se mapea la clase Reply a la tabla
Reply. La definicin de clase tambin indica que dos de sus propiedades se mapean a la clave principal.
Para obtener ms informacin acerca de ejemplos de tablas, consulte Creacin de tablas y carga de
ejemplos de datos (p. 291).
[DynamoDBTable("Reply")]
public class Reply {
[DynamoDBHashKey]
public int ThreadId { get; set; }
[DynamoDBRangeKey]
public string Replenishment { get; set; }
// Additional properties go here.
}
DynamoDBTable
Identifica la tabla de destino de DynamoDB a la que se mapea la clase. Por ejemplo, en el siguiente
ejemplo de cdigo C# se mapea la clase Developer a la tabla People de DynamoDB.
[DynamoDBTable("People")]
public class Developer { ...}
El atributo DynamoDBTable se puede heredar. En el ejemplo anterior, si agrega una nueva clase, Lead,
que hereda de la clase Developer, tambin se mapea a la tabla People. Ambos objetos, Developer y
Lead, se almacenan en la tabla People.
El atributo DynamoDBTable tambin se puede anular. En el siguiente ejemplo de cdigo C#, la clase
Manager hereda de la clase Developer, pero la adicin explcita del atributo DynamoDBTable mapea
la clase a otra tabla (Managers).
[DynamoDBTable("Managers")]
public class Manager extends Developer { ...}
[DynamoDBTable("People", LowerCamelCaseProperties=true)]
public class Developer {
string DeveloperName;
...}
DynamoDBVersion
Identifica una propiedad de clase para almacenar el nmero de versin del elemento. Para obtener
ms informacin sobre el control de versiones, consulte Bloqueo optimista con nmero de versin de
DynamoDB con el modelo de persistencia de objetos del AWS SDK para .NET (p. 272).
Clase DynamoDBContext
La clase DynamoDBContext es el punto de entrada de la base de datos de DynamoDB. Proporciona
conexin con DynamoDB y permite obtener acceso a los datos de diversas tablas, realizar distintas
operaciones CRUD y ejecutar consultas. La clase DynamoDBContext proporciona los mtodos siguientes:
CreateMultiTableBatchGet
Crea un objeto MultiTableBatchGet, que consta de varios objetos BatchGet individuales. Cada uno
de estos objetos BatchGet se puede usar para recuperar elementos de una sola tabla de DynamoDB.
Para recuperar elementos de una o varias tablas, utilice el mtodo ExecuteBatchGet y pase el objeto
MultiTableBatchGet como parmetro.
CreateMultiTableBatchWrite
Crea un objeto MultiTableBatchWrite, que consta de varios objetos BatchWrite individuales. Cada
uno de estos objetos BatchWrite se puede usar para escribir o eliminar elementos de una sola tabla de
DynamoDB.
Para escribir en una o varias tablas, utilice el mtodo ExecuteBatchWrite y pase el objeto
MultiTableBatchWrite como parmetro.
CreateBatchGet
Crea un objeto BatchGet que puede usar para recuperar varios elementos de una tabla. Para obtener
ms informacin, consulte Obtencin por lotes: obtencin de varios elementos (p. 279).
CreateBatchWrite
Crea un objeto BatchWrite que puede usar para colocar o eliminar varios elementos en una tabla.
Para obtener ms informacin, consulte Escritura por lotes: colocacin y eliminacin de varios elementos
(p. 276).
Delete
Elimina un elemento de la tabla. El mtodo requiere la clave principal del elemento que se desea eliminar.
Como parmetro de este mtodo, puede proporcionar el valor de la clave principal o un objeto del lado del
cliente que contenga un valor de clave .
Si especifica un objeto del lado del cliente como parmetro y ha habilitado el bloqueo optimista, la
eliminacin se llevar a cabo correctamente solo si las versiones del lado del cliente y del lado del
servidor del objeto coinciden.
Si especifica nicamente el valor de clave principal como parmetro, la eliminacin se llevar a cabo
correctamente tanto si ha habilitado bloqueo optimista como si no.
Note
Para ejecutar esta operacin en segundo plano, use el mtodo DeleteAsync en su lugar.
Dispose
Elimina todos los recursos administrados y no administrados.
ExecuteBatchGet
Lee datos en una o varias tablas y procesa todos los objetos BatchGet de un objeto
MultiTableBatchGet.
Note
ExecuteBatchWrite
Escribe o elimina datos en una o varias tablas y procesa todos los objetos BatchWrite de un objeto
MultiTableBatchWrite.
Note
FromDocument
Dada una instancia de un objeto Document, el mtodo FromDocument devuelve una instancia de una
clase del lado del cliente.
Esto resulta til si desea utilizar las clases del modelo de documento junto con el modelo de persistencia
de objetos para realizar operaciones con datos. Para obtener ms informacin sobre las clases del
modelo de documentos que se proporcionan en el AWS SDK para .NET, consulte .NET: modelo de
documento (p. 240).
Supongamos que tiene un objeto Document denominado doc que contiene una representacin de un
elemento Forum. Para saber cmo construir este objeto, consulte la descripcin del mtodo ToDocument
ms adelante. Puede utilizar FromDocument para recuperar el elemento Forum del objeto Document
como se muestra en el siguiente fragmento de cdigo C#.
Example
forum101 = context.FromDocument<Forum>(101);
Note
FromQuery
Ejecuta una operacin Query con los parmetros de la consulta definidos en un objeto
QueryOperationConfig.
Note
Para ejecutar esta operacin en segundo plano, use el mtodo FromQueryAsync en su lugar.
FromScan
Ejecuta una operacin Scan con los parmetros del examen definidos en un objeto
ScanOperationConfig.
Note
Para ejecutar esta operacin en segundo plano, use el mtodo FromScanAsync en su lugar.
GetTargetTable
Recupera la tabla de destino del tipo especificado. Esto resulta til si va a escribir un convertidor
personalizado para mapear datos arbitrarios a una tabla de DynamoDB y tiene que determinar qu tabla
est asociada con un tipo de datos personalizado.
Load
Recupera un elemento de una tabla. El mtodo requiere solo la clave principal del elemento que se desea
recuperar.
De forma predeterminada, DynamoDB devuelve el elemento con valores que presentan consistencia
final. Para obtener ms informacin sobre el modelo de consistencia final, consulte Consistencia de
lectura (p. 16).
Note
Para ejecutar esta operacin en segundo plano, use el mtodo LoadAsync en su lugar.
Query
Consulta una tabla basndose en los parmetros de consulta que haya proporcionado.
Solo se puede consultar una tabla si cuenta con una clave principal compuesta (una clave de particin y
una clave de ordenacin). Al realizar la consulta, debe especificar una clave de particin y una condicin
que se aplica a la clave de ordenacin.
Supongamos que tenemos una clase Reply del lado del cliente mapeada a la tabla Reply de DynamoDB.
En el siguiente fragmento de cdigo C# se consulta la tabla Reply para buscar las respuestas de las
conversaciones de un foro publicadas en los ltimos 15das. La tabla Reply tiene una clave principal cuya
clave de particin es Id y cuya clave de ordenacin es ReplyDateTime. Para obtener ms informacin
sobre la tabla Reply, consulte Creacin de tablas y carga de ejemplos de datos (p. 291).
Example
El mtodo Query devuelve una coleccin IEnumerable de "carga diferida". Inicialmente devuelve una sola
pgina de resultados y, a continuacin, realiza una llamada de servicio para obtener la pgina siguiente
si es necesario. Para obtener todos los elementos coincidentes, solo tiene que recorrer IEnumerable en
iteracin.
Si la tabla tiene una clave principal simple (clave de particin), no puede usar el mtodo Query. En su
lugar, puede usar el mtodo Load y proporcionar la clave de particin para recuperar el elemento.
Note
Para ejecutar esta operacin en segundo plano, use el mtodo QueryAsync en su lugar.
Save
Guarda el objeto especificado en la tabla. Si la clave principal especificada en el objeto de entrada no
existe en la tabla, el mtodo agrega un nuevo elemento a la tabla. Si la clave principal s est presente, el
mtodo actualiza el elemento.
Para ejecutar esta operacin en segundo plano, use el mtodo SaveAsync en su lugar.
Scan
Realiza un examen de toda la tabla.
Puede filtrar el resultado del examen especificando una condicin de examen. La condicin se puede
evaluar segn cualesquiera atributos de la tabla. Supongamos que tenemos una clase Book del lado del
cliente mapeada a la tabla ProductCatalog de DynamoDB. En el siguiente fragmento de cdigo C# se
examina la tabla y se devuelven solamente aquellos elementos de libro cuyo precio es menor que 0.
Example
);
El mtodo Scan devuelve una coleccin IEnumerable de "carga diferida". Inicialmente devuelve una sola
pgina de resultados y, a continuacin, realiza una llamada de servicio para obtener la pgina siguiente
si es necesario. Para obtener todos los elementos coincidentes, solo tiene que recorrer IEnumerable en
iteracin.
Para ejecutar esta operacin en segundo plano, use el mtodo ScanAsync en su lugar.
ToDocument
Devuelve una instancia de la clase Document del modelo de documento de la instancia de clase.
Esto resulta til si desea utilizar las clases del modelo de documento junto con el modelo de persistencia
de objetos para realizar operaciones con datos. Para obtener ms informacin sobre las clases del
modelo de documentos que se proporcionan en el AWS SDK para .NET, consulte .NET: modelo de
documento (p. 240).
Supongamos que tenemos una clase del lado del cliente mapeada al ejemplo de tabla Forum. Puede usar
una clase DynamoDBContext para obtener un elemento, como un objeto Document, de la tabla Forum,
como se muestra en el siguiente fragmento de cdigo C#.
Example
ConsistentRead: cuando se recuperan datos utilizando las operaciones Load, Query o Scan, es posible
agregar este parmetro si se desea para solicitar los valores ms recientes de los datos.
IgnoreNullValues: este parmetro informa a DynamoDBContext de que debe pasar por alto los valores
null de los atributos durante una operacin Save. Si este parmetro es false (o, si no se ha establecido),
entonces un valor null se interpretar como una instruccin de eliminar el atributo de que se trate.
SkipVersionCheck: este parmetro informa a DynamoDBContext de que no debe comparar las
versiones al guardar o eliminar un elemento. Para obtener ms informacin sobre el control de
versiones, consulte Bloqueo optimista con nmero de versin de DynamoDB con el modelo de
persistencia de objetos del AWS SDK para .NET (p. 272).
TableNamePrefix: antepone una cadena determinada a los nombres de todas las tablas. Si este
parmetro es null (o si no se ha establecido), no se utilizar ningn prefijo.
En los siguientes fragmentos de cdigo C# se crea una nueva clase DynamoDBContext especificando dos
de los parmetros opcionales anteriores.
Example
DynamoDBContext context =
new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true,
SkipVersionCheck = true});
DynamoDBContext incluye estos parmetros opcionales con cada solicitud que se enva utilizando este
contexto.
Example
En este caso, DynamoDBContext incluye estos parmetros solo cuando se enva la solicitud Get.
bool
byte
char
DateTime
decimal
double
float
Int16
Int32
Int64
SByte
string
UInt16
UInt32
UInt64
El modelo de persistencia de objetos tambin admite los tipos de coleccin de .NET. DynamoDBContext
puede convertir tipos de coleccin concretos y objetos CLR estndar (POCO, por sus siglas en ingls)
simples.
En la tabla siguiente se resume el mapeo de los tipos de .NET anteriores a los tipos de DynamoDB.
El modelo de persistencia de objetos tambin admite los tipos de datos arbitrarios. Sin embargo, debe
proporcionar el cdigo de convertidor para mapear los tipos complejos a los tipos de DynamoDB.
Su solicitud de actualizacin o eliminacin solamente se llevar a cabo si la versin del objeto en el lado
del cliente coincide con el nmero de versin del elemento correspondiente en el lado del servidor. Si su
aplicacin contiene una copia anticuada, debe obtener la versin ms reciente del servidor para poder
actualizar o eliminar el elemento en cuestin.
En el siguiente fragmento de cdigo C# se define una clase Book con atributos de persistencia de objetos
que la mapean a la tabla ProductCatalog. La propiedad VersionNumber de la clase asociada con el
atributo DynamoDBVersion almacena el valor del nmero de versin.
Example
[DynamoDBTable("ProductCatalog")]
public class Book
{
[DynamoDBHashKey] //Partition key
public int Id { get; set; }
[DynamoDBProperty]
public string Title { get; set; }
[DynamoDBProperty]
public string ISBN { get; set; }
[DynamoDBProperty("Authors")]
public List<string> BookAuthors { get; set; }
[DynamoDBVersion]
public int? VersionNumber { get; set; }
Note
Puede aplicar el atributo DynamoDBVersion solamente a un tipo numrico primitivo que pueda
contener valores null (por ejemplo, int?).
Example
Si proporciona un objeto como parmetro, la eliminacin solamente se llevar a cabo si la versin del
objeto coincide con el nmero de versin del elemento correspondiente en el lado del servidor. Sin
embargo, si proporciona un valor de clave principal como parmetro, DynamoDBContext no detectar
los nmeros de versin y eliminar el elemento sin comprobar la versin.
Tenga en cuenta que la implementacin interna del bloqueo optimista en el cdigo del modelo de
persistencia de objetos utiliza las acciones de actualizacin condicional y eliminacin condicional del API
de DynamoDB.
En lugar de establecer la propiedad para todo el contexto, puede deshabilitar el bloqueo optimista para
una operacin especfica, tal y como se muestra en el siguiente fragmento de cdigo C#. En el ejemplo de
cdigo se utiliza el contexto para eliminar un elemento de libro. El mtodo Delete establece la propiedad
SkipVersionCheck opcional en true, con lo que deshabilita la comprobacin de versiones.
Example
Puede crear cualquier tipo en el lado del cliente. Sin embargo, los datos almacenados en las tablas sern
de uno de los tipos de DynamoDB. Adems, durante las consultas y los exmenes, las comparaciones se
harn respecto a los datos almacenados en DynamoDB.
En el siguiente ejemplo de cdigo C# se define una clase Book con las propiedades Id, Title, ISBN
y Dimension. La propiedad Dimension es del tipo DimensionType, que describe las propiedades
Height, Width y Thickness. En el ejemplo de cdigo se proporcionan los mtodos de convertidor
ToEntry y FromEntry para convertir los datos entre el tipo DimensionType y el tipo String de
DynamoDB. Por ejemplo, al guardar una instancia de Book, el convertidor crea una cadena de
dimensiones del libro (por ejemplo, "8.5x11x.05") y, al recuperar el libro, convierte la cadena en una
instancia de DimensionType.
En el ejemplo se mapea el tipo Book a la tabla ProductCatalog. Para ilustrar el caso, guarda un ejemplo de
instancia de Book, la recupera, actualiza sus dimensiones y vuelve a guardar Book una vez actualizado.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class HighLevelMappingArbitraryData
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
// 1. Create a book.
DimensionType myBookDimensions = new DimensionType()
{
Length = 8M,
Height = 11M,
Thickness = 0.5M
};
context.Save(myBook);
{
get; set;
}
public decimal Height
{
get; set;
}
public decimal Thickness
{
get; set;
}
}
Note
Cuando se utiliza el modelo de persistencia de objetos, se puede especificar cualquier cantidad
de operaciones en un lote. No obstante, tenga en cuenta que DynamoDB limita el nmero de
operaciones de un lote y el tamao total del lote para una operacin por lotes. Para obtener
ms informacin acerca de los lmites especficos, consulte BatchWriteItem. Si el API detecta
que la solicitud de escritura por lotes ha superado el nmero permitido de solicitudes de
escritura o la carga de HTTP mxima permitida, divide el lote en varios lotes de menor tamao.
Adems, si una respuesta a una escritura por lotes devuelve elementos sin procesar, el API
enva automticamente otra solicitud de escritura por lotes con esos elementos que no se han
procesado.
Supongamos que hemos definido en C# una clase Book mapeada a la tabla ProductCatalog de
DynamoDB. En el siguiente fragmento de cdigo C# se utiliza el objeto BatchWrite para cargar dos
elementos y eliminar uno en la tabla ProductCatalog.
Example
bookBatch.Execute();
Cree una instancia de la clase BatchWrite para cada tipo y especifique los elementos que desee
colocar o eliminar, como se describe en la seccin anterior.
Utilice uno de los mtodos siguientes para crear una instancia de MultiTableBatchWrite:
Ejecute el mtodo Combine con uno de los objetos BatchWrite que cre en el paso anterior.
Proporcione una lista de objetos BatchWrite para crear una instancia del tipo
MultiTableBatchWrite.
Ejecute el mtodo CreateMultiTableBatchWrite de DynamoDBContext y pase la lista de
objetos BatchWrite.
Llame al mtodo Execute de MultiTableBatchWrite, que lleva a cabo las operaciones
especificadas de colocacin y eliminacin en varias tablas.
Supongamos que ha definido en C# las clases Forum y Thread mapeadas a las tablas Forum y Thread de
DynamoDB. Adems, supongamos que se ha habilitado el control de versiones en la clase Thread. Dado
que el control de versiones no se admite en las operaciones por lotes, es preciso deshabilitarlo de forma
explcita, tal y como se muestra en el siguiente fragmento de cdigo C#. En el fragmento de cdigo se
utiliza el objeto MultiTableBatchWrite para llevar a cabo una eliminacin de varias tablas.
Example
threadBatch.AddPutItem(newThread);
Para ver un ejemplo prctico, consulte Ejemplo: Operacin de escritura por lotes con el modelo de
persistencia de objetos del AWS SDK para .NET (p. 282).
Note
El API de procesamiento por lotes de DynamoDB limita el nmero de escrituras del lote, as como
el tamao del lote. Para obtener ms informacin, consulte BatchWriteItem. Cuando se utiliza el
API del modelo de persistencia de objetos de .NET, se puede especificar cualquier cantidad de
operaciones. Sin embargo, si el nmero de operaciones de un lote o el tamao superan el lmite,
el API de .NET dividir la solicitud de escritura por lotes en lotes de menor tamao y enviar
varias solicitudes de escritura por lotes a DynamoDB.
Example
Para cada tipo, cree una instancia del tipo CreateBatchGet y proporcione los valores de clave
principal que desee recuperar de cada tabla.
Utilice uno de los mtodos siguientes para crear una instancia de la clase MultiTableBatchGet:
Ejecute el mtodo Combine con uno de los objetos BatchGet que cre en el paso anterior.
Proporcione una lista de objetos BatchGet para crear una instancia del tipo MultiBatchGet.
Ejecute el mtodo CreateMultiTableBatchGet de DynamoDBContext y pase la lista de objetos
BatchGet.
Llame al mtodo Execute de MultiTableBatchGet, que devuelve los resultados con tipos en los
objetos BatchGet individuales.
En el siguiente fragmento de cdigo C# se recuperan varios elementos de las tablas Order y OrderDetail
mediante el mtodo CreateBatchGet.
Example
Console.WriteLine(orderBatch.Results.Count);
Console.WriteLine(orderDetailBatch.Results.Count);
Para obtener ms informacin sobre la tabla ProductCatalog utilizada en este ejemplo, consulte Creacin
de tablas y carga de ejemplos de datos (p. 291). Para obtener instrucciones paso a paso sobre cmo
realizar las pruebas del ejemplo siguiente, consulte Ejemplos de cdigo de .NET (p. 298).
Note
El siguiente ejemplo no funciona con .NET Core, ya que no es compatible con los mtodos
sincrnicos. Para obtener ms informacin, consulte AWS Asynchronous APIs for .NET.
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class HighLevelItemCRUD
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
// Retrieve the updated book. This time add the optional ConsistentRead
parameter using DynamoDBContextConfig object.
Book updatedBook = context.Load<Book>(bookID, new DynamoDBContextConfig
{
ConsistentRead = true
});
[DynamoDBTable("ProductCatalog")]
public class Book
{
[DynamoDBHashKey] //Partition key
public int Id
{
get; set;
}
[DynamoDBProperty]
public string Title
{
get; set;
}
[DynamoDBProperty]
public string ISBN
{
get; set;
}
[DynamoDBProperty("Authors")] //String Set datatype
public List<string> BookAuthors
{
get; set;
}
}
}
A continuacin, se utiliza DynamoDBContext para ilustrar las siguientes operaciones de escritura por
lotes.
Para obtener ms informacin sobre las tablas que se utilizan en este ejemplo, consulte Creacin de tablas
y carga de ejemplos de datos (p. 291). Para obtener instrucciones paso a paso sobre cmo realizar las
pruebas del ejemplo siguiente, consulte Ejemplos de cdigo de .NET (p. 298).
Note
El siguiente ejemplo no funciona con .NET Core, ya que no es compatible con los mtodos
sincrnicos. Para obtener ms informacin, consulte AWS Asynchronous APIs for .NET.
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class HighLevelBatchWriteItem
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
[DynamoDBTable("Reply")]
public class Reply
{
[DynamoDBHashKey] //Partition key
public string Id
{
get; set;
}
[DynamoDBTable("Thread")]
public class Thread
{
// PK mapping.
[DynamoDBHashKey] //Partition key
public string ForumName
{
get; set;
}
[DynamoDBRangeKey] //Sort key
public String Subject
{
get; set;
}
// Implicit mapping.
public string Message
{
get; set;
}
public string LastPostedBy
{
get; set;
}
public int Views
{
get; set;
}
public int Replies
{
get; set;
}
public bool Answered
{
get; set;
}
public DateTime LastPostedDateTime
{
get; set;
}
// Explicit mapping (property and table attribute names are different.
[DynamoDBProperty("Tags")]
public List<string> KeywordTags
{
get; set;
}
// Property to store version number for optimistic locking.
[DynamoDBVersion]
public int? Version
{
get; set;
}
}
[DynamoDBTable("Forum")]
public class Forum
{
[DynamoDBHashKey] //Partition key
public string Name
{
get; set;
}
// All the following properties are explicitly mapped,
// only to show how to provide mapping.
[DynamoDBProperty]
public int Threads
{
get; set;
}
[DynamoDBProperty]
public int Views
{
get; set;
}
[DynamoDBProperty]
public string LastPostBy
{
get; set;
}
[DynamoDBProperty]
public DateTime LastPostDateTime
{
get; set;
}
[DynamoDBProperty]
public int Messages
{
get; set;
}
}
[DynamoDBTable("ProductCatalog")]
public class Book
{
[DynamoDBHashKey] //Partition key
public int Id
{
get; set;
}
public string Title
{
get; set;
}
public string ISBN
{
get; set;
}
public int Price
{
get; set;
}
public string PageCount
{
get; set;
}
public string ProductCategory
{
get; set;
}
public bool InPublication
{
get; set;
}
}
}
La clave principal de la tabla ProductCatalog es Id. No tiene una clave de ordenacin que forme parte
de la clave principal. Por lo tanto, no puede consultar la tabla. Puede usar el valor de Id para obtener un
elemento.
Ejecutar las siguientes consultas en la tabla Reply. La clave principal de la tabla Reply consta de los
atributos Id y ReplyDateTime. ReplyDateTime es la clave de ordenacin. Por lo tanto, puede consultar
esta tabla.
Buscar las respuestas a una conversacin del foro publicadas en los ltimos 15das.
Buscar las respuestas a una conversacin del foro publicadas en un intervalo de tiempo determinado.
Examinar la tabla ProductCatalog para buscar los libros cuyo precio sea menor que cero.
Por motivos de desempeo, debe usar una consulta y no una operacin de examen. Sin embargo, a
veces puede que necesite examinar una tabla. Supongamos que se ha cometido un error al especificar
los datos y que el precio de uno de los libros se ha establecido en un valor menor que 0. En este ejemplo
se examina la tabla ProductCategory para buscar los elementos de libros (el valor de ProductCategory
es "book") cuyo precio es menor que 0.
Para obtener instrucciones acerca de cmo crear un ejemplo funcional, consulte Ejemplos de cdigo
de .NET (p. 298).
Note
El siguiente ejemplo no funciona con .NET Core, ya que no es compatible con los mtodos
sincrnicos. Para obtener ms informacin, consulte AWS Asynchronous APIs for .NET.
Example
using System;
using System.Collections.Generic;
using System.Configuration;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class HighLevelQueryAndScan
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
// Scan table.
FindProductsPricedLessThanZero(context);
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
}
[DynamoDBTable("Reply")]
public class Reply
{
[DynamoDBHashKey] //Partition key
public string Id
{
get; set;
}
[DynamoDBTable("Thread")]
public class Thread
{
// PK mapping.
[DynamoDBHashKey] //Partition key
public string ForumName
{
get; set;
}
[DynamoDBRangeKey] //Sort key
public DateTime Subject
{
get; set;
}
// Implicit mapping.
public string Message
{
get; set;
}
public string LastPostedBy
{
get; set;
}
public int Views
{
get; set;
}
public int Replies
{
get; set;
}
public bool Answered
{
get; set;
}
public DateTime LastPostedDateTime
{
get; set;
}
// Explicit mapping (property and table attribute names are different.
[DynamoDBProperty("Tags")]
public List<string> KeywordTags
{
get; set;
}
// Property to store version number for optimistic locking.
[DynamoDBVersion]
public int? Version
{
get; set;
}
}
[DynamoDBTable("Forum")]
public class Forum
{
[DynamoDBHashKey]
public string Name
{
get; set;
}
// All the following properties are explicitly mapped,
// only to show how to provide mapping.
[DynamoDBProperty]
public int Threads
{
get; set;
}
[DynamoDBProperty]
public int Views
{
get; set;
}
[DynamoDBProperty]
[DynamoDBTable("ProductCatalog")]
public class Book
{
[DynamoDBHashKey] //Partition key
public int Id
{
get; set;
}
public string Title
{
get; set;
}
public string ISBN
{
get; set;
}
public int Price
{
get; set;
}
public string PageCount
{
get; set;
}
public string ProductCategory
{
get; set;
}
public bool InPublication
{
get; set;
}
}
}
Los ejemplos de cdigo de esta Gua para desarrolladores ofrecen una cobertura ms exhaustiva de las
operaciones de DynamoDB en los siguientes lenguajes de programacin:
Antes de comenzar con este ejercicio, es preciso inscribirse en AWS, obtener las claves de acceso y
secreta, y configurar la interfaz de lnea de comandos de AWS en el equipo. Si todava no lo ha hecho,
consulte Configuracin de DynamoDB (servicio web) (p. 49).
Note
Si va a utilizar la versin descargable de DynamoDB, debe utilizar la AWS CLI para crear las
tablas y los ejemplos de datos. Asimismo, debe especificar el parmetro --endpoint-url en
cada comando de la AWS CLI. Para obtener ms informacin, consulte Configuracin del punto
de enlace local (p. 47).
Estas tablas y sus datos se utilizan como ejemplos en esta Gua para desarrolladores.
Note
Temas
Paso 1: Crear ejemplos de tablas (p. 291)
Paso 2: Cargar los datos en las tablas (p. 293)
Paso 3: Consultar los datos (p. 295)
Paso 4: (Opcional) Eliminar (p. 296)
Resumen (p. 296)
Puede crear una tabla ProductCatalog en la que cada elemento se identifique de forma exclusiva mediante
un nico atributo numrico: Id.
Puede modelar esta aplicacin creando tres tablas: Forum, Thread y Reply.
La tabla Reply posee un ndices secundario global denominado PostedBy-Message-Index. Este ndice
facilitar las consultas de dos atributos sin clave de la tabla Reply.
Si todava no ha configurado la AWS CLI, consulte Uso de la CLI (p. 52) para obtener
instrucciones.
API Version 2012-08-10
293
Amazon DynamoDB Developer Guide
Carga de ejemplos de datos
Vamos a descargar un archivo comprimido .zip que contiene archivos JSON con ejemplos de datos para
cada tabla. Para cada archivo, vamos a usar la AWS CLI para cargar los datos en DynamoDB. Cada vez
que una carga de datos se lleve a cabo correctamente, se generar el resultado siguiente:
{
"UnprocessedItems": {}
}
sampledata.zip
2. Extraiga los archivos de datos .json del archivo comprimido.
3. Copie los archivos .json en el directorio actual.
Repita este procedimiento para cada una de las dems tablas que ha creado:
Forum
Thread
Responder
a:
ProductCatalog
Forum
Thread
No obstante, si no desea conservarlas, debe eliminarlas para evitar que se le cobre por los recursos que
no necesita.
Repita este procedimiento para cada una de las dems tablas que ha creado:
Forum
Thread
Responder
Resumen
En este ejercicio, hemos utilizado la consola de DynamoDB para crear varias tablas en DynamoDB.
A continuacin, hemos usado la AWS CLI para cargar datos en las tablas y hemos realizado algunas
operaciones bsicas con los datos desde la consola de DynamoDB.
La consola de DynamoDB y la AWS CLI son tiles para comenzar a usar este servicio con rapidez. No
obstante, es probable que desee conocer mejor cmo funciona DynamoDB y cmo escribir programas de
aplicacin con DynamoDB. En el resto de esta Gua para desarrolladores se abordan estos temas.
Esta Gua para desarrolladores contiene fragmentos de cdigo Java y programas listos para ejecutarlos.
Encontrar estos ejemplos de cdigo en las secciones siguientes:
Puede comenzar rpidamente a trabajar con Eclipse y AWS Toolkit for Eclipse. Adems de un IDE
completo, obtendr el AWS SDK for Java con actualizaciones automticas y plantillas preconfiguradas
para crear aplicaciones de AWS.
Si es la primera vez que utiliza AWS Toolkit for Eclipse, elija Configure AWS Accounts para
configurar las credenciales de AWS.
6. Elija Finish para crear el proyecto.
7. En el men Eclipse, elija File, New y despus Class.
8. En Java Class, escriba un nombre para la clase en Name (use el mismo nombre que en el ejemplo de
cdigo que desea ejecutar) y, a continuacin, elija Finish para crear la clase.
9. Copie el ejemplo de cdigo de la pgina de documentacin que est leyendo en el editor de Eclipse.
10. Para ejecutar el cdigo, elija Run en el men Eclipse.
El SDK para Java proporciona clientes seguros para subprocesos con el fin de trabajar con DynamoDB.
Como prctica recomendada, sus aplicaciones deben crear un cliente y reutilizar el cliente entre
subprocesos.
Los ejemplos de cdigo de esta Gua para desarrolladores se han diseado para utilizarlos con la
ltima versin del AWS SDK for Java.
Si utiliza AWS Toolkit for Eclipse, puede configurar las actualizaciones automticas para el SDK
para Java. Para hacer esto en Eclipse, vaya a Preferences y elija AWS Toolkit --> AWS SDK for
Java --> Download new SDKs automatically.
[default]
aws_access_key_id = AWS access key ID goes here
aws_secret_access_key = Secret key goes here
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.regions.Regions;
...
// This client will default to US West (Oregon)
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.US_WEST_2)
.build();
Puede usar el mtodo withRegion para ejecutar el cdigo en Amazon DynamoDB en cualquier regin
donde se encuentre disponible. Para obtener una lista completa, consulte Regiones y puntos de conexin
de AWS en la Referencia general de Amazon Web Services.
Si desea ejecutar los ejemplos de cdigo en DynamoDB Local en su equipo, deber configurar el punto de
enlace como se indica a continuacin:
Esta Gua para desarrolladores contiene fragmentos de cdigo .NET y programas listos para ejecutarlos.
Encontrar estos ejemplos de cdigo en las secciones siguientes:
Puede comenzar rpidamente a trabajar con el AWS SDK para .NET y Toolkit for Visual Studio.
5. En AWS Access Credentials, elija Use existing profile, seleccione el perfil de credenciales de la lista y,
a continuacin, haga clic en OK.
Si es la primera vez que utiliza Toolkit for Visual Studio, elija Use a new profile para configurar las
credenciales de AWS.
6. En el proyecto de Visual Studio, elija la pestaa correspondiente al cdigo fuente del programa
(Program.cs). Copie el ejemplo de cdigo de la pgina de documentacin que est leyendo en el
editor de Visual Studio sustituyendo cualquier otro cdigo que aparezca en el editor.
7. Si aparece algn mensaje de error del tipo The type or namespace name...could not
be found, debe instalar el ensamblado del SDK de AWS para DynamoDB, como se indica a
continuacin:
a. En el Explorador de soluciones, abra el men contextual (haga clic con el botn derecho) del
proyecto y elija Administrar paquetes NuGet.
b. En Administrador de paquetes NuGet, elija Examinar.
c. En el cuadro de bsqueda, escriba AWSSDK.DynamoDBv2 y espere a que se lleve a cabo la
bsqueda.
d. Elija AWSSDK.DynamoDBv2 y despus elija Instalar.
e. Cuando se haya completado la instalacin, elija la pestaa Program.cs para volver al programa.
8. Para ejecutar el cdigo, elija el botn Iniciar en la barra de herramientas de Visual Studio.
El AWS SDK para .NET proporciona clientes seguros para subprocesos con el fin de trabajar con
DynamoDB. Como prctica recomendada, sus aplicaciones deben crear un cliente y reutilizar el cliente
entre subprocesos.
Los ejemplos de cdigo de esta Gua para desarrolladores se han diseado para utilizarlos con la
ltima versin del AWS SDK para .NET.
Toolkit for Visual Studio admite varios conjuntos de credenciales de cualquier nmero de cuentas. Cada
conjunto se conoce como perfil. Visual Studio agrega entradas al archivo App.config del proyecto, para
que la aplicacin encuentre las credenciales de AWS en tiempo de ejecucin.
Store, cifradas. Toolkit for Visual Studio proporciona una interfaz grfica de usuario para administrar las
credenciales, todo ello desde Visual Studio. Para obtener ms informacin, consulte la especificacin de
credenciales en la Gua del usuario de AWS Toolkit for Visual Studio.
Note
Para obtener la lista de regiones completa, consulte Regiones y puntos de conexin de AWS en la gua
Referencia general de Amazon Web Services.
Si desea ejecutar los ejemplos de cdigo en DynamoDB Local en su equipo, deber configurar el punto de
enlace:
Uso de DynamoDB
Temas
Uso de tablas en DynamoDB (p. 301)
Uso de elementos en DynamoDB (p. 340)
Uso de consultas (p. 425)
Uso de operaciones de examen (p. 443)
Uso de ndices secundarios para mejorar el acceso a los datos (p. 463)
Captura de la actividad de las tablas con Flujos de DynamoDB (p. 540)
Tambin puede llevar a cabo las mismas tareas utilizando la Consola de administracin de AWS.
Para obtener ms informacin, consulte Uso de la consola (p. 51))
En esta seccin tambin se ofrece ms informacin sobre la capacidad de desempeo, el uso de la funcin
Auto Scaling de DynamoDB o la configuracin manual del desempeo provisionado.
Temas
Operaciones bsicas con tablas (p. 302)
Ajustes de desempeo de lecturas y escrituras (p. 305)
Tamao de los elementos y consumo de unidades de capacidad (p. 307)
Administracin automtica de la capacidad de desempeo con la funcin Auto Scaling de
DynamoDB (p. 309)
Etiquetado para DynamoDB (p. 327)
Uso de tablas: Java (p. 329)
Uso de tablas: .NET (p. 334)
Nombre de la tabla. El nombre debe cumplir las reglas de nomenclatura de DynamoDB y debe ser
nico para la regin y cuenta de AWS actuales. Por ejemplo, puede crear una tabla People en la US
East (N. Virginia) y otra tabla People en la UE (Irlanda). Sin embargo, estas tablas seran dos entidades
totalmente independientes una de otra. Para obtener ms informacin, consulte Reglas de nomenclatura
y tipos de datos (p. 12).
Clave principal. La clave principal puede constar de un atributo (clave de particin) o dos (clave
de particin y clave de ordenacin). Debe proporcionar el nombre, el tipo de datos y el rol de cada
atributo: HASH (para una clave de particin) y RANGE (para una clave de ordenacin). Para obtener ms
informacin, consulte Clave principal (p. 6).
Ajustes de desempeo. Debe especificar los ajustes iniciales de desempeo de lectura y escritura de la
tabla. Puede modificar estos ajustes en otro momento o habilitar la funcin Auto Scaling de DynamoDB
para administrarlos automticamente. Para obtener ms informacin, consulte Ajustes de desempeo
de lecturas y escrituras (p. 305) y Administracin automtica de la capacidad de desempeo con la
funcin Auto Scaling de DynamoDB (p. 309).
Example
En el ejemplo siguiente de la AWS CLI se muestra cmo crear una tabla (Music). La clave principal de
esta tabla consta de Artist (clave de particin) y SongTitle (clave de ordenacin), ambas de tipo String. El
desempeo mximo de esta tabla es de 10unidades de capacidad de lectura y 5unidades de capacidad
de escritura.
{
"TableDescription": {
"AttributeDefinitions": [
{
"AttributeName": "Artist",
"AttributeType": "S"
},
{
"AttributeName": "SongTitle",
"AttributeType": "S"
}
],
"TableName": "Music",
"KeySchema": [
{
"AttributeName": "Artist",
"KeyType": "HASH"
},
{
"AttributeName": "SongTitle",
"KeyType": "RANGE"
}
],
"TableStatus": "CREATING",
"CreationDateTime": 1491338657.039,
"ProvisionedThroughput": {
"NumberOfDecreasesToday": 0,
"ReadCapacityUnits": 10,
"WriteCapacityUnits": 5
},
"TableSizeBytes": 0,
"ItemCount": 0,
"TableArn": "arn:aws:dynamodb:us-east-1:123456789012:table/Music"
}
}
El componente TableStatus indica el estado actual de la tabla (CREATING). Puede que la tabla tarde un
tiempo en crearse, segn los valores especificados para ReadCapacityUnits y WriteCapacityUnits.
Cuanto mayores sean estos valores, ms recursos tendr que asignar DynamoDB a la tabla.
Example
La tabla est lista para usarla cuando el valor de TableStatus cambia de CREATING a ACTIVE.
Note
Si emite una solicitud DescribeTable inmediatamente despus de una solicitud CreateTable,
DynamoDB podra devolver un error (ResourceNotFoundException). El motivo es
que DescribeTable usa una consulta con consistencia final, aunque los metadatos de
la tabla podran no estar disponibles todava. Espere unos segundos y repita la solicitud
DescribeTable.
A efectos de facturacin, los costos de almacenamiento de DynamoDB incluyen un importe por
elemento de 100 bytes en concepto de gastos generales. Para obtener ms informacin, visite
Precios de DynamoDB. Este importe adicional de 100 bytes por elemento no se utiliza al calcular
las unidades de capacidad ni en la operacin DescribeTable.
Example
En este ejemplo de la AWS CLI se muestra cmo modificar los ajustes de desempeo provisionado de una
tabla:
Note
Cuando se emite una solicitud DeleteTable, el estado de la tabla cambia de ACTIVE a DELETING.
Puede que la tabla tarde un tiempo en eliminarse, segn los recursos que utilice; por ejemplo, los datos
almacenados en la tabla y las secuencias o ndices que contenga.
Example
Example
El resultado muestra los lmites superiores de unidades de capacidad de lectura y escritura de la regin y
cuenta de AWS actuales.
Para obtener ms informacin acerca de estos lmites y sobre cmo solicitar que se aumenten, consulte
Descripcin de los lmites de desempeo aprovisionados predeterminados (p. 765).
Cuando se crea una tabla nueva en DynamoDB, es preciso especificar su capacidad de desempeo
provisionada; es decir, la cantidad de actividad de lectura y escritura que la tabla admitir. DynamoDB
utiliza esta informacin para reservar recursos del sistema suficientes para satisfacer sus necesidades de
desempeo.
Note
Si lo desea, puede permitir la funcin Auto Scaling de DynamoDB para administrar la capacidad
de desempeo de la tabla; sin embargo, en cualquier caso deber proporcionar los ajustes
iniciales de capacidad de lectura y escritura al crear la tabla. La funcin Auto Scaling de
DynamoDB utiliza estos ajustes iniciales como punto de partida y, a continuacin, los ajusta
dinmicamente en respuesta a los requisitos de la aplicacin.
Para obtener ms informacin, consulte Administracin automtica de la capacidad de
desempeo con la funcin Auto Scaling de DynamoDB (p. 309).
DynamoDB distribuye automticamente los datos entre las particiones, que se almacenan en varios
servidores de la nube de AWS. (Para obtener ms informacin, consulte Partitions y distribucin de
datos (p. 20).) Para lograr un desempeo ptimo, debe distribuir las solicitudes de lectura de la manera
ms uniforme que sea posible entre estas particiones. Por ejemplo, supongamos que ha provisionado una
tabla con 10000unidades de capacidad de lectura. Si emite 10000solicitudes de lectura para un nico
elemento de la tabla, toda la actividad de lectura se concentrar en una misma particin. Sin embargo,
si distribuye las solicitudes entre todos los elementos de la tabla, DynamoDB podr obtener acceso a las
particiones en paralelo.
A medida que cambian los requisitos de datos y acceso de la aplicacin, puede que tenga que ajustar
los ajustes de desempeo de la tabla. Si utiliza la funcin Auto Scaling de DynamoDB, los ajustes de
desempeo se modificarn automticamente en respuesta a las cargas de trabajo reales. Tambin puede
usar la operacin UpdateTable para ajustar manualmente la capacidad de desempeo de la tabla. Es
posible que prefiera hacerlo de ese modo para cargar datos masivamente de un data warehouse en la
nueva tabla de DynamoDB. Podra crear la tabla con un ajuste de desempeo de escritura mayor y, a
continuacin, reducir este ajuste una vez finalizada la carga masiva de datos.
Por ejemplo, supongamos que ha creado una tabla con 10unidades de capacidad de lectura
provisionadas. Esto le permite realizar 10lecturas de consistencia alta por segundo o 20lecturas
consistentes finales por segundo, para elementos de hasta 4 KB.
A efectos de las lecturas, los tamaos de los elementos se redondean al siguiente mltiplo de 4 KB. Por
ejemplo, leer un elemento de 3500bytes consumir el mismo desempeo que leer un elemento de 4 KB.
Por ejemplo, supongamos que ha creado una tabla con 10unidades de capacidad de escritura
provisionadas. Esto le permitir realizar 10escrituras por segundo, para elementos con un tamao de
hasta 1 KB por segundo.
A efectos de las escrituras, los tamaos de los elementos se redondean al siguiente mltiplo de 1 KB. Por
ejemplo, escribir un elemento de 500bytes consumir el mismo desempeo que leer un elemento de 1 KB.
Le recomendamos que utilice los SDK de AWS para desarrollar software. Dado que los SDK de
AWS incluyen compatibilidad integrada para reintentar las solicitudes que han sido objeto de
una limitacin controlada, no tendr que escribir personalmente esta lgica. Para obtener ms
informacin, consulte Reintentos de error y retardo exponencial (p. 200).
La consola de DynamoDB muestra mtricas de Amazon CloudWatch de las tablas, para que pueda
monitorizar las solicitudes de lectura y escritura que han sido objeto de una limitacin controlada. Si se le
aplica la limitacin controlada en demasiadas ocasiones, puede ser conveniente aumentar los ajustes de
desempeo provisionado de la tabla.
En algunos casos, DynamoDB utiliza la capacidad de rfaga para atender las lecturas o escrituras que
superan los ajustes de desempeo configurados para la tabla. Con la capacidad de rfaga, pueden
realizarse correctamente solicitudes de lectura o escritura inesperadas que, de otro modo, habran sido
objeto de una limitacin controlada. La capacidad de rfaga se facilita en la medida en que sea posible y
DynamoDB no garantiza que vaya a estar disponible en todo momento. Para obtener ms informacin,
consulte Utilice la capacidad de rfaga con moderacin (p. 703).
Tamao de los elementos. Algunos elementos son lo bastante pequeos para leerlos o escribirlos con
una sola unidad de capacidad. Los elementos mayores precisarn de varias unidades de capacidad. Si
calcula el tamao de los elementos que la tabla contendr, podr especificar ajustes ms precisos de
desempeo provisionado para la tabla.
Tasas previstas de solicitudes de lectura y escritura. Adems del tamao de elemento, debe calcular el
nmero de lecturas y escrituras que debe llevar a cabo por segundo.
Requisitos de consistencia de lectura. Las unidades de capacidad de lectura se basan en operaciones
de lectura de consistencia alta, que consumen el doble de recursos de la base de datos que las lecturas
consistentes finales. Es importante determinar si la aplicacin necesita las lecturas de consistencia alta
o si es posible adoptar un enfoque ms flexible que realice en su lugar lecturas consistentes finales. Las
operaciones de lectura de DynamoDB presentan consistencia final de forma predeterminada, pero, si es
preciso, puede solicitar que sean de consistencia alta.
Note
Antes de elegir los ajustes de capacidad de lectura y escritura de la tabla, debe comprender los datos y
cmo obtendr acceso a ellos la aplicacin. Esta informacin puede ayudarle a determinar las necesidades
globales de almacenamiento y desempeo de la tabla, as como la capacidad de desempeo que requerir
la aplicacin. Las tablas de DynamoDB no tienen esquemas, salvo la clave principal. Por este motivo,
todos los elementos de una tabla pueden tener atributos, tamaos y tipos de datos distintos.
El tamao total de un elemento es la suma de las longitudes de los nombres y los valores de sus atributos.
Puede utilizar las siguientes directrices para calcular el tamao de los atributos:
Los valores de tipo String son Unicode con codificacin binaria UTF-8. El tamao de un atributo de tipo
String es (longitud del nombre de atributo) + (nmero de bytes con codificacin UTF-8).
Los nmeros son de longitud variable, con un mximo de 38dgitos significativos. Los ceros iniciales
y finales se recortan. El tamao aproximado de un atributo de tipo Number es (longitud del nombre de
atributo) + (1byte por cada dos dgitos significativos) + (1byte).
Un valor binario se debe codificar previamente en formato base64 para poder enviarlo a DynamoDB. Sin
embargo, para calcular su tamao se utiliza la longitud en bytes sin procesar del valor. El tamao de un
atributo de tipo Binary es (longitud del nombre de atributo) + (nmero de bytes sin procesar).
El tamao de un atributo de tipo Null o Boolean es (longitud del nombre de atributo) + (1byte).
Un atributo de tipo List o Map requiere 3bytes adicionales, independientemente de su contenido. El
tamao de un atributo de tipo List o Map es (longitud del nombre de atributo) + suma (tamao de las
entradas anidadas) + (3bytes). El tamao de un atributo de tipo List o Map vaco es (longitud del nombre
de atributo) + (3bytes).
Note
Recomendamos elegir nombres de atributos cortos en lugar de largos. Esto le ayudar a optimizar
el consumo de unidades de capacidad y a reducir la cantidad de almacenamiento necesaria para
los datos.
GetItem: lee un solo elemento de una tabla. Para determinar el nmero de unidades de capacidad que
GetItem va a consumir, tome el tamao del elemento y redondela al mltiplo de 4 KB inmediatamente
superior. Si ha especificado una lectura de consistencia alta, este es el nmero de unidades de
capacidad necesarias. Si se trata de una lectura consistente final (el valor predeterminado), tome este
nmero y divdalo por dos.
Por ejemplo, si lee un elemento de 3,5KB, DynamoDB redondea su tamao a 4 KB. Si lee un elemento
de 10KB, DynamoDB redondea su tamao a 12KB.
BatchGetItem: lee hasta 100 elementos de una o varias tablas. DynamoDB procesa cada elemento
del lote como una solicitud GetItem individual; en consecuencia, DynamoDB redondea primero el
tamao de cada elemento al mltiplo de 4 KB inmediatamente superior y, a continuacin, calcula el
tamao total. El resultado no es necesariamente igual que el tamao total de todos los elementos. Por
ejemplo, si BatchGetItem lee un elemento de 1,5KB y un elemento de 6,5KB, DynamoDB calcular
sus tamaos en 12KB (4 KB + 8KB) y no en 8 KB (1,5KB + 6,5KB).
Query: lee varios elementos que tienen el mismo valor de clave de particin. Todos los elementos
devueltos se tratan como una sola operacin de lectura, de tal forma que DynamoDB calcula el tamao
total de todos los elementos y, a continuacin, redondea al mltiplo de 4 KB inmediatamente superior.
Por ejemplo, supongamos que la consulta devuelve 10elementos cuyo tamao combinado es de
40,8KB. DynamoDB redondea el tamao del elemento de la operacin a 44KB. Si una consulta
devuelve 1500elementos de 64bytes cada uno, el tamao acumulado es de 96KB.
Scan: lee todos los elementos de una tabla. DynamoDB considera el tamao de los elementos que se
evalan, no el tamao de los elementos que el examen devuelve.
Si lleva a cabo una operacin de lectura con un elemento que no existe, DynamoDB consumir igualmente
desempeo de lectura provisionado; una solicitud de lectura de consistencia alta consumir una unidad de
capacidad de lectura, mientras que una lectura consistente final consumir 0,5unidades de capacidad de
lectura.
Para cualquier operacin que devuelve elementos, puede solicitar un subconjunto de atributos para
recuperarlos; sin embargo, esto no afecta al clculo del tamao de los elementos. Por otra parte, Query y
Scan pueden devolver recuentos de elementos en lugar de valores de atributos. Para obtener el recuento
de los elementos se consume la misma cantidad de unidades de capacidad de lectura y se llevan a cabo
los mismos clculos de tamao de los elementos, porque DynamoDB tiene que leer cada elemento para
poder incrementar el recuento.
PutItem: escribe un solo elemento en una tabla. Si ya existe un elemento con la misma clave principal
en la tabla, la operacin lo sustituye. Para calcular el consumo de desempeo provisionado, el tamao
de elemento que se tiene en cuenta es el mayor de los dos.
UpdateItem: modifica un solo elemento en la tabla. DynamoDB considera el tamao del elemento tal
y como aparece antes y despus de la actualizacin. El desempeo provisionado consumido refleja
el mayor de estos tamaos de elemento. Aunque se actualice tan solo un subconjunto de atributos
del elemento, UpdateItem consumir la cantidad total de desempeo provisionado (el mayor de los
tamaos de elemento de "antes" y "despus").
DeleteItem: elimina un solo elemento de una tabla. El consumo de desempeo provisionado se basa
en el tamao del elemento eliminado.
BatchWriteItem: escribe hasta 25 elementos en una o varias tablas. DynamoDB procesa
cada elemento del lote como una solicitud PutItem o DeleteItem individual (no se admiten las
actualizaciones); en consecuencia, DynamoDB redondea primero el tamao de cada elemento al
mltiplo de 1 KB inmediatamente superior y, a continuacin, calcula el tamao total. El resultado no es
necesariamente igual que el tamao total de todos los elementos. Por ejemplo, si BatchWriteItem
escribe un elemento de 500bytes y un elemento de 3,5KB, DynamoDB calcular sus tamaos en 5KB
(1KB + 8KB) y no en 5KB (500bytes + 3,5KB).
A efectos de las operaciones PutItem, UpdateItem y DeleteItem, DynamoDB redondea los tamaos
de los elementos al mltiplo de 1 KB inmediatamente superior. Por ejemplo, si coloca o elimina un
elemento de 1,6KB, DynamoDB redondear su tamao a 2KB.
PutItem, UpdateItem y DeleteItem permiten las escrituras condicionales, en las que se especifica
una expresin que debe evaluarse en true para que la operacin se lleve a cabo correctamente. Aunque la
expresin se evale en false, DynamoDB consumir unidades capacidad de escritura de la tabla:
Para comenzar rpidamente a usar la funcin Auto Scaling de DynamoDB, consulte Uso de la
Consola de administracin de AWS con la funcin Auto Scaling de DynamoDB (p. 312).
Muchas cargas de trabajo de base de datos son cclicas o difciles de predecir con antelacin. Por ejemplo,
tomemos una aplicacin de redes sociales en la que la mayora de los usuarios estn activos en el horario
diurno. La base de datos debe satisfacer los requisitos de la actividad diurna, pero no se requieren los
mismos niveles de desempeo por la noche. Otro ejemplo podra ser una nueva aplicacin de juegos
para mviles cuya adopcin est siendo muy rpida. Si el juego adquiere demasiada popularidad, podra
superar los recursos disponibles en la base de datos, lo que dara lugar a un desempeo lento y a clientes
descontentos. Estos tipos de cargas de trabajo suelen requerir intervencin manual para escalar los
recursos de la base de datos en sentido ascendente o descendente en respuesta a las variaciones en los
niveles de uso.
La funcin Auto Scaling de DynamoDB usa el servicio AWS Auto Scaling de aplicaciones para ajustar
de manera dinmica y automtica la capacidad de desempeo provisionada en respuesta a los patrones
de trfico reales. Esto permite que una tabla o un ndices secundario global aumenten su capacidad de
lectura y escritura provisionada para hacer frente a los aumentos repentinos de trfico, sin que se aplique
la limitacin controlada. Cuando la carga de trabajo disminuye, Auto Scaling de aplicaciones reduce el
desempeo para evitar que tenga que pagar por una capacidad provisionada que no se utiliza.
Important
Si usa la Consola de administracin de AWS para crear una tabla o un ndices secundario global,
la funcin Auto Scaling de DynamoDB se habilita de forma predeterminada. Puede modificar los
ajustes de Auto Scaling en cualquier momento. Para obtener ms informacin, consulte Uso de la
Consola de administracin de AWS con la funcin Auto Scaling de DynamoDB (p. 312).
Con Auto Scaling de aplicaciones, se crea una poltica de escalado para una tabla o un ndices secundario
global. La poltica de escalado especifica si desea escalar la capacidad de lectura o de escritura (o ambas),
as como los ajustes de unidades de capacidad provisionada mnimas y mximas para la tabla o el ndice.
Adems de a las tablas, la funcin Auto Scaling DynamoDB se puede aplicar a los ndices
secundarios globales. Cada ndices secundario global tiene su propia capacidad de desempeo
provisionada que es independiente de la de su tabla base. Al crear una poltica de escalado para
un ndices secundario global, Auto Scaling de aplicaciones ajusta los ajustes de desempeo
provisionado del ndice para asegurarse de que el uso real se mantenga en valores iguales o
parecidos al porcentaje de utilizacin deseado.
Para comenzar rpidamente a usar la funcin Auto Scaling de DynamoDB, consulte Uso de la
Consola de administracin de AWS con la funcin Auto Scaling de DynamoDB (p. 312).
En el siguiente diagrama se ofrece informacin general sobre cmo Auto Scaling administra la capacidad
de desempeo de una tabla en DynamoDB:
En los pasos siguientes se resume el proceso de Auto Scaling mostrado en el diagrama anterior:
Para comprender cmo funciona la funcin Auto Scaling de DynamoDB, supongamos que tenemos una
tabla denominada ProductCatalog. Es infrecuente que se realicen cargas masivas de datos en la tabla,
de modo que presenta poca actividad de escritura. Sin embargo, s experimenta una intensa actividad de
lectura, que vara en cada momento. Gracias a las mtricas de Amazon CloudWatch de ProductCatalog
que se monitorizan, ha determinado que la tabla requiere 1200unidades de capacidad de lectura (para
evitar que DynamoDB aplique una limitacin controlada a las solicitudes de lectura durante los picos
de actividad). Tambin ha determinado que ProductCatalog requiere como mnimo 150unidades de
capacidad de lectura, cuando el trfico de lectura se encuentra en el punto ms bajo.
Dentro del rango de 150 a 1200unidades de capacidad de lectura, decide que un objetivo de utilizacin
del 70sera apropiado para la tabla ProductCatalog. El objetivo de utilizacin es la proporcin de unidades
La funcin Auto Scaling de DynamoDB modifica los ajustes de desempeo provisionado solo
cuando la carga de trabajo real se mantiene elevada (o reducida) durante un periodo sostenido de
varios minutos. El algoritmo de seguimiento de objetivo de Auto Scaling de aplicaciones intenta
mantener el objetivo de utilizacin en el valor elegido o en valores prximos a l a largo plazo.
Los picos de actividad repentinos y breves se atienden gracias a la capacidad de rfaga
incorporada de la tabla. Para obtener ms informacin, consulte Utilice la capacidad de rfaga con
moderacin (p. 703).
Para habilitar la funcin Auto Scaling de DynamoDB para la tabla ProductCatalog, debe crear una poltica
de escalado. Esta poltica especifica la tabla o el ndices secundario global que se desea administrar, qu
tipo de capacidad (de lectura o escritura) hay que administrar, los lmites superior e inferior de los ajustes
de desempeo provisionado y el objetivo de utilizacin.
Al crear una poltica de escalado, Auto Scaling de aplicaciones crea automticamente un par de alarmas
de Amazon CloudWatch. Cada par representa los lmites superior e inferior de los ajustes de desempeo
provisionado. Estas alarmas de CloudWatch alarmas se activan cuando la utilizacin real de la tabla se
desva del objetivo de utilizacin durante un periodo de tiempo prolongado.
Cuando se activa una de las alarmas de CloudWatch, Amazon SNS enva una notificacin (si se ha
habilitado). A continuacin, la alarma de CloudWatch invoca Auto Scaling de aplicaciones que, a su vez,
notifica a DynamoDB para que ajuste la capacidad provisionada de la tabla ProductCatalog al alza o a la
baja, segn corresponda.
Notas de uso
Antes de comenzar a usar la funcin Auto Scaling de DynamoDB, debe tener en cuenta lo siguiente:
La funcin Auto Scaling de DynamoDB puede aumentar la capacidad de lectura o escritura tan a
menudo como sea preciso, de acuerdo con la poltica de Auto Scaling. Puede reducir el valor de
ReadCapacityUnits o WriteCapacityUnits de una tabla hasta un mximo de cuatro veces al da.
Un da se define de acuerdo con la zona horaria GMT. Asimismo, si no ha habido ninguna reduccin
en las cuatro ltimas horas, se permite una reduccin adicional, lo que aumenta el nmero mximo de
reducciones al da a nueve veces (4 reducciones en las primeras cuatro horas y 1 reduccin para cada
grupo posterior de 4 horas al da). Todos los dems lmites de DynamoDB permanecen en vigor, como
se describe en Limits en DynamoDB.
La funcin Auto Scaling de DynamoDB no le impide modificar manualmente los ajustes de desempeo
provisionado. Estos ajustes manuales no afectan a las alarmas de CloudWatch vigentes relacionadas
con la funcin Auto Scaling de DynamoDB. Si realiza ajustes manuales, recomendamos actualizar la
poltica de Auto Scaling de aplicaciones para actualizar los umbrales de CloudWatch en consecuencia.
Si habilita la funcin Auto Scaling de DynamoDB en una tabla que tiene uno o varios ndices secundarios
globales, recomendamos encarecidamente aplicar tambin Auto Scaling de manera uniforme a
esos ndices. Para ello, elija Apply same settings to ndices secundario globales en la Consola de
administracin de AWS. Para obtener ms informacin, consulte Habilitacin de la funcin Auto Scaling
de DynamoDB en tablas existentes (p. 314).
Antes de comenzar: concesin de permisos a los usuarios para la funcin Auto Scaling de
DynamoDB (p. 313)
Creacin de una nueva tabla con la funcin Auto Scaling habilitada (p. 314)
Habilitacin de la funcin Auto Scaling de DynamoDB en tablas existentes (p. 314)
Visualizacin de las actividades de Auto Scaling en la consola (p. 315)
Modificacin o deshabilitacin de los ajustes de Auto Scaling de DynamoDB (p. 315)
Si usa la Consola de administracin de AWS para crear una tabla nueva, la funcin Auto Scaling de
DynamoDB se habilita para esa tabla de forma predeterminada. Tambin puede utilizar la consola para
habilitar Auto Scaling en las tablas existentes, modificar la configuracin de esta funcin o deshabilitarla.
Los permisos application-autoscaling:* son necesarios para eliminar una tabla habilitada
con escalado automtico. La poltica administrada por AWS DynamoDBFullAccess adjunta a
continuacin incluye estos permisos.
Para configurar un usuario de IAM que pueda obtener acceso a la consola de DynamoDB y a la funcin
Auto Scaling de DynamoDB, agregue las dos polticas siguientes:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:AttachRolePolicy",
"iam:CreatePolicy",
"iam:CreateRole"
],
"Resource": "*"
}
]
}
Para crear una nueva tabla con la funcin Auto Scaling habilitada
De lo contrario, asegrese de que la opcin Use default settings est seleccionada. (La cuenta de
AWS ya tiene el rol DynamoDBAutoscaleRole.)
5. Cuando la configuracin sea la que desea, elija Create. Se crear la tabla con los parmetros de Auto
Scaling predeterminados.
Para habilitar la funcin Auto Scaling de DynamoDB en una tabla existente, haga lo siguiente:
Seleccione Read capacity, Write capacity o ambos. (Para la capacidad de escritura, tenga en
cuenta que puede elegir Same settings as read). Para cada capacidad, configure lo siguiente:
(Para Write capacity, tenga en cuenta que puede elegir Same settings as read).
En la seccin IAM Role, asegrese de que la opcin Existing role with pre-defined policies est
seleccionada y de que Role Name est establecido en DynamoDBAutoscaleRole.
4. Cuando la configuracin sea la que desea, elija Save.
Para ver estas actividades de Auto Scaling en la consola de DynamoDB, seleccione la tabla que desee
utilizar. Elija Capacity y, a continuacin, expanda la seccin Scaling activities. Cuando se modifiquen los
ajustes de desempeo de la tabla, aparecern aqu los mensajes informativos.
Para deshabilitar la funcin Auto Scaling de DynamoDB, vaya a la pestaa Capacity de la tabla y desactive
Read capacity, Write capacity o ambas.
En lugar de utilizar la Consola de administracin de AWS, puede utilizar la AWS Command Line Interface
(AWS CLI) para administrar la funcin Auto Scaling de DynamoDB. En el tutorial de esta seccin se
muestra cmo instalar y configurar la AWS CLI para administrar la funcin Auto Scaling de DynamoDB. En
este tutorial, aprender a hacer lo siguiente:
Cree una tabla de DynamoDB denominada TestTable. Los ajustes de desempeo iniciales son
5unidades de capacidad de lectura y 5unidades de capacidad de escritura.
Cree una poltica de Auto Scaling de aplicaciones para TestTable. La poltica est dirigida a mantener
una proporcin objetivo del 50% entre la capacidad de escritura consumida y la capacidad de escritura
provisionada. El rango de esta mtrica est comprendido entre 5 y 10unidades de capacidad de
escritura. Auto Scaling de aplicaciones no puede ajustar el desempeo fuera de este rango.
Ejecute un programa en Python para dirigir trfico de escritura a TestTable. Cuando la proporcin
objetivo supere el 50% durante un periodo prolongado, Auto Scaling de aplicaciones se lo notificar a
DynamoDB para que ajuste el desempeo de TestTable al alza y, de este modo, mantener el 50% de
utilizacin de destinos.
Compruebe que DynamoDB haya ajustado correctamente la capacidad de escritura provisionada para
TestTable.
Antes de empezar
Es preciso llevar a cabo las siguientes tareas antes de comenzar el tutorial.
Si an no lo ha hecho, debe instalar y configurar la AWS CLI. Para ello, vaya a la AWS Command Line
Interface Gua del usuario y siga estas instrucciones:
Instalacin de Python
Una parte de este tutorial requiere que se ejecute un programa en Python (consulte Paso 5: Dirija trfico
de escritura a TestTable (p. 320)). Si an no tiene Python instalado, puede descargarlo a travs de este
enlace: https://www.python.org/downloads.
En este paso, se crea una poltica de IAM y se adjunta a un rol de IAM. A continuacin, puede asignar
el rol a Application Auto Scaling de tal forma que pueda llevar a cabo operaciones de DynamoDB en su
nombre.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "application-autoscaling.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:UpdateTable",
"cloudwatch:PutMetricAlarm",
"cloudwatch:DescribeAlarms",
"cloudwatch:DeleteAlarms"
],
"Resource": "*"
}
]
}
En el resultado, fjese en el nombre de recurso de Amazon (ARN) de la poltica que ha creado. Por
ejemplo: arn:aws:iam::111122223333:policy/MyIAMAutoscalingServicePolicy
5. Adjunte la poltica al rol de servicio:
--policy-arn arn
Ahora, escriba el siguiente comando para registrar el objetivo escalable. Sustituya roleARN por el
ARN de MyIAMAutoscalingServiceRole.
--resource-id "table/TestTable" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--min-capacity 5 \
--max-capacity 10 \
--role-arn roleARN
Note
Para entender cmo funciona TargetValue, imagine que tiene una tabla con un ajuste de
desempeo provisionado de 200unidades de capacidad de escritura. Decide crear una poltica de
escalado para esta tabla, con un valor de TargetValue del 70%.
Ahora, supongamos que comienza a dirigir el trfico de escritura a la tabla, de tal forma que el
desempeo de escritura real es de 150unidades de capacidad. La proporcin entre capacidad
consumida y provisionada es ahora de (150/200), es decir, del 75%. Esta proporcin supera
su objetivo, de modo que Auto Scaling de aplicaciones aumenta la capacidad de escritura
provisionada a 215 para que la proporcin sea de (150/215), es decir, del 69,77%; de esta forma
se mantiene lo ms prxima posible al valor de TargetValue, pero sin superarlo.
capacidad consumida y provisionada se mantiene en el 50% o en un valor prximo a este. Los valores de
ScaleOutCooldown y ScaleInCooldown se establecen en 60segundos.
{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 60,
"TargetValue": 50.0
}
3. En el resultado, observe que Application Auto Scaling ha creado dos alarmas de CloudWatch, una
para cada lmite (superior e inferior) del rango de escalado objetivo.
4. Utilice el comando de AWS CLI siguiente para ver ms detalles sobre la poltica de escalado:
5. En el resultado, compruebe que los ajustes de la poltica coincidan con las especificaciones de Paso
3: Registrar un objetivo escalable (p. 318) y Paso 4: Crear una poltica de escalado (p. 319).
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("TestTable")
i = 0
while (i < 10):
j = 0
while (j < 10):
print (i, j)
table.put_item(
Item={
'pk':i,
'sk':j,
'filler':{"S":filler}
}
)
j += 1
i += 1
python bulk-load-test-table.py
1. Escriba el comando siguiente para ver las acciones de Auto Scaling de aplicaciones:
Vuelva a ejecutar este comando cada cierto tiempo mientras el programa en Python siga en ejecucin.
Se tardarn varios minutos hasta que se invoque la poltica de escalado. En algn momento, debera
aparecer el resultado siguiente:
...
{
"ScalableDimension": "dynamodb:table:WriteCapacityUnits",
"Description": "Setting write capacity units to 10.",
"ResourceId": "table/TestTable",
"ActivityId": "0cc6fb03-2a7c-4b51-b67f-217224c6b656",
"StartTime": 1489088210.175,
"ServiceNamespace": "dynamodb",
"EndTime": 1489088246.85,
"Cause": "monitor alarm AutoScaling-table/TestTable-AlarmHigh-1bb3c8db-1b97-4353-
baf1-4def76f4e1b9 in state ALARM triggered policy MyScalingPolicy",
"StatusMessage": "Successfully set write capacity units to 10. Change successfully
fulfilled by dynamodb.",
"StatusCode": "Successful"
},
...
Esto indica que Auto Scaling de aplicaciones ha emitido una solicitud UpdateTable a DynamoDB.
2. Escriba el siguiente comando para comprobar que DynamoDB ha aumentado la capacidad de
escritura de la tabla:
EnableDynamoDBAutoscaling.java
DisableDynamoDBAutoscaling.java
El programa registra las unidades de capacidad de escritura como objetivo escalable de TestTable. El
rango de esta mtrica est comprendido entre 5 y 10unidades de capacidad de escritura.
Despus de crear el objetivo escalable, el programa crea una configuracin de seguimiento del objetivo.
La poltica est dirigida a mantener una proporcin objetivo del 50% entre la capacidad de escritura
consumida y la capacidad de escritura provisionada.
Despus, el programa crea la poltica de escalado basada en la configuracin de seguimiento del
objetivo.
El programa requiere que se suministre el ARN de un rol de servicio de Auto Scaling de aplicaciones
vlido. (Por ejemplo: "arn:aws:iam::122517410325:role/MyIAMAutoscalingServiceRole.) En
el siguiente programa, sustituya SERVICE_ROLE_ARN_GOES_HERE por el ARN real. Para obtener ms
informacin, consulte Paso 1: Crear un rol de servicio para Application Auto Scaling (p. 316).
package com.amazonaws.codesamples.autoscaling;
import com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingClient;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsResult;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesResult;
import com.amazonaws.services.applicationautoscaling.model.MetricType;
import com.amazonaws.services.applicationautoscaling.model.PolicyType;
import com.amazonaws.services.applicationautoscaling.model.PredefinedMetricSpecification;
import com.amazonaws.services.applicationautoscaling.model.PutScalingPolicyRequest;
import com.amazonaws.services.applicationautoscaling.model.RegisterScalableTargetRequest;
import com.amazonaws.services.applicationautoscaling.model.ScalableDimension;
import com.amazonaws.services.applicationautoscaling.model.ServiceNamespace;
import
com.amazonaws.services.applicationautoscaling.model.TargetTrackingScalingPolicyConfiguration;
ServiceNamespace ns = ServiceNamespace.Dynamodb;
ScalableDimension tableWCUs = ScalableDimension.DynamodbTableWriteCapacityUnits;
String resourceID = "table/TestTable";
try {
aaClient.registerScalableTarget(rstRequest);
} catch (Exception e) {
System.err.println("Unable to register scalable target: ");
System.err.println(e.getMessage());
}
System.out.println();
try {
aaClient.putScalingPolicy(pspRequest);
} catch (Exception e) {
System.err.println("Unable to put scaling policy: ");
System.err.println(e.getMessage());
}
try {
DescribeScalingPoliciesResult dspResult =
aaClient.describeScalingPolicies(dspRequest);
System.out.println("DescribeScalingPolicies result: ");
System.out.println(dspResult);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Unable to describe scaling policy: ");
System.err.println(e.getMessage());
}
package com.amazonaws.codesamples.autoscaling;
import com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingClient;
import com.amazonaws.services.applicationautoscaling.model.DeleteScalingPolicyRequest;
import com.amazonaws.services.applicationautoscaling.model.DeregisterScalableTargetRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsResult;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesResult;
import com.amazonaws.services.applicationautoscaling.model.ScalableDimension;
import com.amazonaws.services.applicationautoscaling.model.ServiceNamespace;
ServiceNamespace ns = ServiceNamespace.Dynamodb;
ScalableDimension tableWCUs = ScalableDimension.DynamodbTableWriteCapacityUnits;
String resourceID = "table/TestTable";
try {
aaClient.deleteScalingPolicy(delSPRequest);
} catch (Exception e) {
System.err.println("Unable to delete scaling policy: ");
System.err.println(e.getMessage());
}
try {
DescribeScalingPoliciesResult dspResult =
aaClient.describeScalingPolicies(descSPRequest);
System.out.println("DescribeScalingPolicies result: ");
System.out.println(dspResult);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Unable to describe scaling policy: ");
System.err.println(e.getMessage());
}
System.out.println();
try {
aaClient.deregisterScalableTarget(delSTRequest);
} catch (Exception e) {
System.err.println("Unable to deregister scalable target: ");
System.err.println(e.getMessage());
}
try {
DescribeScalableTargetsResult dsaResult =
aaClient.describeScalableTargets(dscRequest);
System.out.println("DescribeScalableTargets result: ");
System.out.println(dsaResult);
System.out.println();
} catch (Exception e) {
System.err.println("Unable to describe scalable target: ");
System.err.println(e.getMessage());
}
A los ndices secundarios locales (LSI) y los ndices secundarios globales (GSI) relacionados
con las tablas etiquetadas se les asignan automticamente las mismas etiquetas. En la
actualidad, no se puede etiquetar el uso de DynamoDB Streams.
Se admite el etiquetado en algunos servicios de AWS como Amazon EC2, Amazon S3, DynamoDB y
otros. Un etiquetado eficiente puede ofrecerle informacin detallada sobre los costos, porque permite crear
informes sobre los servicios que llevan una etiqueta determinada.
Por ltimo, es conveniente seguir estrategias de etiquetado ptimas. Para obtener ms informacin,
consulte AWS Tagging Strategies.
Restricciones de etiquetado
Cada etiqueta consta de una clave y un valor, ambos definidos por el usuario. Se aplican las siguientes
restricciones:
Cada tabla puede de DynamoDB solo puede tener una etiqueta con la misma clave. Si intenta agregar
una etiqueta existente (con la misma clave), el valor de la etiqueta existente se actualizar con el valor
nuevo.
Las claves y los valores de las etiquetas distinguen entre maysculas y minsculas.
Longitud mxima de la clave: 128 caracteres Unicode
Longitud mxima del valor: 256 caracteres Unicode
Los caracteres permitidos son letras, espacios en blanco y nmeros, adems de los caracteres
especiales siguientes: + - = . _ : /
Nmero mximo de etiquetas por recurso: 50
A los nombres y valores de etiquetas asignados por AWS se les asigna automticamente el prefijo aws:,
que usted no puede asignar. Los nombres de etiqueta asignados por AWS no cuentan para el lmite
de 50etiquetas. Los nombres de etiquetas asignados por el usuario presentan el prefijo user: en el
informe de asignacin de costos.
No puede etiquetar un recurso a la vez que lo crea. El etiquetado es una accin independiente que solo
puede ejecutarse despus de haber creado el recurso.
No es posible antedatar la aplicacin de una etiqueta.
Operaciones de etiquetado
En esta seccin se describe cmo utilizar la consola o la CLI de DynamoDB para agregar, enumerar,
editar o eliminar etiquetas. A continuacin, puede activar estas etiquetas definidas por el usuario de
modo que aparezcan en la consola de facturacin y administracin de costos y as poder usarlas para el
seguimiento de asignacin de costos. Para obtener ms informacin, consulte Informes de asignacin de
costos (p. 328).
Para la edicin en bloque, tambin puede usar Tag Editor en la consola de administracin de AWS. Para
obtener ms informacin, consulte Working with Tag Editor.
Temas
Etiquetado (consola) (p. 328)
Etiquetado (CLI) (p. 328)
Etiquetado (consola)
Para usar la consola con el fin de agregar, enumerar, editar o eliminar etiquetas:
Aqu puede agregar, enumerar, editar o eliminar etiquetas. En este ejemplo, la etiqueta Movies se ha
creado con el valor moviesProd para la tabla Movies.
Etiquetado (CLI)
Para agregar la etiqueta Owner con el valor blueTeam para la tabla Movies:
Etiquetas generadas por AWS. AWS define, crea y aplica estas etiquetas automticamente.
Etiquetas definidas por el usuario. Usted puede definir, crear y aplicar estas etiquetas.
Debe activar ambos tipos de etiquetas por separado para que puedan aparecer en Cost Explorer o en un
informe de asignacin de costos.
Despus de crear y activar las etiquetas, AWS genera un informe de asignacin de costos con el uso y
los costos agrupados segn las etiquetas activas. El informe de asignacin de costos incluye todos los
costos de AWS para cada periodo de facturacin. El informe incluye tanto recursos etiquetados como sin
etiquetar, para que pueda organizar con claridad los cargos de los recursos.
Note
En la actualidad, los datos transferidos desde DynamoDB no se desglosan segn las etiquetas en
los informes de asignacin de costos.
Puede utilizar AWS SDK for Java para crear, actualizar y eliminar tablas, enumerar todas las tablas de la
cuenta u obtener informacin sobre una tabla concreta.
A continuacin se indican los pasos comunes para las operaciones con tablas mediante el API de
documentos del AWS SDK for Java.
Para crear una tabla con el API del AWS SDK for Java:
Debe proporcionar el nombre de la tabla, las definiciones de atributos, el esquema de claves y los
valores de desempeo provisionado.
3. Ejecute el mtodo createTable proporcionando el objeto de solicitud como parmetro.
table.waitForActive();
La tabla no estar lista para usarla hasta que DynamoDB la haya creado y haya establecido su estado
en ACTIVE. La solicitud createTable devuelve un objeto Table que puede usar para obtener ms
informacin sobre la tabla.
Example
TableDescription tableDescription =
dynamoDB.getTable(tableName).describe();
Puede llamar al mtodo describe del cliente para obtener informacin sobre la tabla en cualquier
momento.
Example
Puede aumentar la capacidad de desempeo con la frecuencia que desee y reducirla a razn de
hasta nueve veces por cada tabla y da natural segn la hora UTC. Para obtener ms informacin,
consulte Lmites en DynamoDB (p. 765).
Para actualizar una tabla con el API del AWS SDK for Java:
Example
table.updateTable(provisionedThroughput);
table.waitForActive();
Example
table.delete();
table.waitForDelete();
Enumeracin de tablas
Para enumerar las tablas de la cuenta, cree una instancia de DynamoDB y ejecute el mtodo listTables.
La operacin ListTables no requiere parmetros.
Example
while (iterator.hasNext()) {
Table table = iterator.next();
System.out.println(table.getTableName());
import java.util.ArrayList;
import java.util.Iterator;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.TableCollection;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ListTablesResult;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.TableDescription;
createExampleTable();
listMyTables();
getTableInformation();
updateExampleTable();
deleteExampleTable();
}
try {
// key
getTableInformation();
}
catch (Exception e) {
System.err.println("CreateTable request failed for " + tableName);
System.err.println(e.getMessage());
}
while (iterator.hasNext()) {
Table table = iterator.next();
System.out.println(table.getTableName());
}
}
try {
table.updateTable(new
ProvisionedThroughput().withReadCapacityUnits(6L).withWriteCapacityUnits(7L));
table.waitForActive();
}
catch (Exception e) {
System.err.println("UpdateTable request failed for " + tableName);
System.err.println(e.getMessage());
}
table.waitForDelete();
}
catch (Exception e) {
System.err.println("DeleteTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}
Puede utilizar AWS SDK para .NET para crear, actualizar y eliminar tablas, enumerar todas las tablas de la
cuenta u obtener informacin sobre una tabla concreta.
A continuacin se indican los pasos comunes para las operaciones con tablas mediante AWS SDK
para .NET.
Por ejemplo, cree un objeto CreateTableRequest para crear una tabla y un objeto
UpdateTableRequest para actualizar una tabla existente.
3. Ejecute el mtodo apropiado proporcionado por el cliente que ha creado en el paso anterior.
Note
Los ejemplos que aparecen en esta seccin no funcionan con .NET Core, ya que no es
compatible con los mtodos sincrnicos. Para obtener ms informacin, consulte AWS
Asynchronous APIs for .NET.
A continuacin se indican los pasos que hay que seguir para crear una tabla mediante el API de bajo nivel
de .NET.
Debe proporcionar el nombre de la tabla, su clave principal y los valores de desempeo provisionado.
3. Ejecute el mtodo AmazonDynamoDBClient.CreateTable proporcionando el objeto de solicitud
como parmetro.
En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el ejemplo se crea
una tabla (ProductCatalog) que utiliza el identificador como clave principal y un conjunto de valores de
desempeo provisionado. Segn los requisitos de aplicacin, puede actualizar los valores de desempeo
provisionado mediante el API UpdateTable.
Debe esperar hasta que DynamoDB cree la tabla y establezca el estado de esta ltima en ACTIVE. La
respuesta de CreateTable incluye la propiedad TableDescription que proporciona la informacin
necesaria sobre la tabla.
Example
Tambin puede llamar al mtodo DescribeTable del cliente para obtener informacin sobre la tabla en
cualquier momento.
Example
Puede aumentar la capacidad de desempeo con la frecuencia que desee y reducirla a razn de
hasta nueve veces por cada tabla y da natural segn la hora UTC. Para obtener ms informacin,
consulte Lmites en DynamoDB (p. 765).
A continuacin se indican los pasos que hay que seguir para actualizar una tabla mediante el API de bajo
nivel de .NET.
Example
2. Cree una instancia de la clase DeleteTableRequest y proporcione el nombre de la tabla que desea
eliminar.
3. Ejecute el mtodo AmazonDynamoDBClient.DeleteTable proporcionando el objeto de solicitud
como parmetro.
Example
Enumeracin de tablas
Para enumerar las tablas de la cuenta mediante el API de bajo nivel del AWS SDK para .NET, cree una
instancia de AmazonDynamoDBClient y ejecute el mtodo ListTables. La operacin ListTables
no requiere parmetros. Sin embargo, puede especificar parmetros opcionales. Por ejemplo, puede
establecer el parmetro Limit si desea usar la paginacin para limitar el nmero de nombres de
tablas por pgina. Para ello, debe crear un objeto ListTablesRequest y proporcionar parmetros
opcionales, como se muestra en el siguiente fragmento de cdigo C#. Adems del tamao de
pgina, la solicitud establece el parmetro ExclusiveStartTableName. Inicialmente, el valor de
ExclusiveStartTableName es null. Sin embargo, para recuperar la siguiente pgina de resultados
despus de obtener la primera de ellas, deber establecer el valor de este parmetro en la propiedad
LastEvaluatedTableName del resultado actual.
Example
lastEvaluatedTableName = result.LastEvaluatedTableName;
actualizar la tabla, se aumentan los valores de desempeo provisionado. Para obtener instrucciones
paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte Ejemplos de cdigo
de .NET (p. 298).
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class LowLevelTableExample
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
private static string tableName = "ExampleTable";
DeleteExampleTable();
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 5,
WriteCapacityUnits = 6
},
TableName = tableName
};
WaitUntilTableReady(tableName);
}
lastTableNameEvaluated = response.LastEvaluatedTableName;
} while (lastTableNameEvaluated != null);
}
WaitUntilTableReady(tableName);
}
En DynamoDB, un elemento es una coleccin de atributos. Cada atributo tiene un nombre y un valor.
Los valores de los atributos pueden ser escalares, conjuntos o tipos de documentos. Para obtener ms
informacin, consulte Amazon DynamoDB: funcionamiento (p. 2).
DynamoDB proporciona cuatro operaciones que aportan la funcionalidad bsica de creacin, lectura,
actualizacin y eliminacin (CRUD, Create, Read, Update and Delete):
Cada una de estas operaciones requiere que especifique la clave principal del elemento que se va a usar.
Por ejemplo, para leer un elemento mediante GetItem, debe especificar la clave de particin y la clave de
ordenacin (si procede) de ese elemento.
Adems de las cuatro operaciones CRUD bsicas, DynamoDB tambin ofrece las siguientes:
Estas operaciones por lotes combinan varias operaciones CRUD en una sola solicitud. Adems, las
operaciones por lotes leen y escriben los elementos en paralelo, para minimizar las latencias de respuesta.
Esta seccin se describe cmo utilizar estas operaciones y se incluyen los temas relacionados, tales como
las actualizaciones condicionales y los contadores atmicas. Adems, se facilitan ejemplos de cdigo
en los que se utilizan los SDK de AWS. Para obtener las prcticas recomendadas, consulte Prcticas
recomendadas para los elementos (p. 707).
Lectura de un elemento
Para leer un elemento de una tabla de DynamoDB, se utiliza la operacin GetItem. Debe proporcionar el
nombre de la tabla, as como la clave principal del elemento que se desea.
Example
En el siguiente ejemplo de la AWS CLI se muestra cmo leer un elemento de la tabla ProductCatalog.
Note
Con GetItem, es preciso especificar la clave principal completa, no solo una parte de ella.
Por ejemplo, si una tabla contiene una clave principal compuesta (clave de particin y clave de
ordenacin), tendr que proporcionar un valor para la clave de particin y un valor para la clave de
ordenacin.
De forma predeterminada, la solicitud GetItem lleva a cabo una lectura consistente final. Puede usar el
parmetro ConsistentRead para solicitar una lectura de consistencia alta, si lo prefiere. Esto consumir
unidades de capacidad de lectura adicionales, pero devolver la versin ms actualizada del elemento.
GetItem devuelve todos los atributos del elemento. Puede usar una expresin de proyeccin para
devolver solamente algunos de los atributos. (Para obtener ms informacin, consulte Expresiones de
proyeccin (p. 355).)
Para devolver el nmero de unidades de capacidad de lectura consumidas por GetItem, establezca el
parmetro ReturnConsumedCapacity en TOTAL.
Example
En el siguiente ejemplo de la AWS CLI se muestran algunos de los parmetros de GetItem opcionales.
Escritura de un elemento
Para crear, actualizar o eliminar un elemento de una tabla de DynamoDB, utilice una de las siguientes
operaciones:
PutItem
UpdateItem
DeleteItem
Para cada una de estas operaciones, debe especificar la clave principal completa, no solo parte de
ella. Por ejemplo, si una tabla contiene una clave principal compuesta (clave de particin y clave de
ordenacin), tendr que proporcionar un valor para la clave de particin y un valor para la clave de
ordenacin.
Para devolver el nmero de unidades de capacidad de escritura consumidas por cualquiera de estas
operaciones, establezca el parmetro ReturnConsumedCapacity en uno de los valores siguientes:
PutItem
PutItem crea un elemento nuevo. Si ya existe un elemento con la misma clave en la tabla, se sustituir
por el nuevo.
Example
Escriba un elemento nuevo en la tabla Thread. La clave principal de Thread consta de ForumName (clave
de particin) y Subject (clave de ordenacin).
{
"ForumName": {"S": "Amazon DynamoDB"},
"Subject": {"S": "New discussion thread"},
"Message": {"S": "First post in this thread"},
"LastPostedBy": {"S": "fred@example.com"},
"LastPostDateTime": {"S": "201603190422"}
}
UpdateItem
Si no existe un elemento con la clave especificada, UpdateItem crea uno nuevo. De lo contrario, modifica
los atributos de un elemento existente.
Se utiliza una expresin de actualizacin para especificar los atributos que se desea modificar y los nuevos
valores. (Para obtener ms informacin, consulte Expresiones de actualizacin (p. 368).) En la expresin
de actualizacin, se utilizan valores de atributos de expresin como marcadores de posicin de los valores
reales. (Para obtener ms informacin, consulte Valores de los atributos de expresin (p. 359).)
Example
Modifique varios atributos del elemento Thread. El parmetro ReturnValues opcional muestra el
elemento tal y como aparece despus de la actualizacin. (Para obtener ms informacin, consulte Valores
devueltos (p. 344).)
{
"ForumName": {"S": "Amazon DynamoDB"},
"Subject": {"S": "New discussion thread"}
{
":zero": {"N":"0"},
":lastpostedby": {"S":"barney@example.com"}
}
DeleteItem
DeleteItem elimina el elemento con la clave especificada.
Example
En este ejemplo de la AWS CLI se muestra cmo eliminar el elemento Thread.
Valores devueltos
En algunos casos, es posible que desee que DynamoDB devuelva los valores de algunos atributos tal y
como aparecen antes o despus de modificarlos. Las operaciones PutItem, UpdateItem y DeleteItem
tienen un parmetro ReturnValues que se puede usar para devolver los valores de los atributos antes o
despus de modificarlos.
A continuacin se indican los dems ajustes vlidos de ReturnValues, organizados segn la operacin
del API de DynamoDB:
PutItem
ReturnValues: ALL_OLD
Si sobrescribe un elemento existente, ALL_OLD devuelve el elemento completo tal y como apareca
antes de sobrescribirlo.
Si escribe un elemento que no exista, ALL_OLD no surte efecto.
UpdateItem
Lo ms frecuente es usar UpdateItem para actualizar un elemento existente. Sin embargo, UpdateItem
en realidad lleva a cabo una operacin upsert (actualizacin/insercin). Esto quiere decir que crear el
elemento automticamente si este no existe.
ReturnValues: ALL_OLD
Si actualiza un elemento existente, ALL_OLD devuelve el elemento completo tal y como apareca
antes de actualizarlo.
DeleteItem
ReturnValues: ALL_OLD
Si elimina un elemento existente, ALL_OLD devuelve el elemento completo tal y como apareca antes
de eliminarlo.
Si elimina un elemento que no exista, ALL_OLD no devuelve ningn dato.
En esencia, las operaciones por lotes son encapsuladores que incluyen varias solicitudes de lectura o
escritura. Por ejemplo, si una solicitud BatchGetItem contiene cinco elementos, DynamoDB lleva a cabo
cinco operaciones GetItem. De igual modo, si una solicitud BatchWriteItem contiene dos solicitudes de
colocacin y cuatro de eliminacin, DynamoDB llevar a cabo dos solicitudes PutItem y cuatro solicitudes
DeleteItem.
En general, una operacin por lotes no genera un error a no ser que todas las solicitudes del lote generen
un error. Por ejemplo, supongamos que lleva a cabo una operacin BatchGetItem, pero que se produce
un error en una de las solicitudes GetItem individuales del lote. En este caso, BatchGetItem devolver
las claves y los datos de la solicitud GetItem en la que se ha producido el error. Las dems solicitudes
GetItem del lote no se ven afectadas.
BatchGetItem
Una sola operacin BatchGetItem puede contener hasta 100 solicitudes GetItem individuales y
recuperar hasta 16 MB de datos. Adems, una operacin BatchGetItem puede recuperar elementos de
varias tablas.
Example
Recupere dos elementos de la tabla Thread usando una expresin de proyeccin para devolver solo
algunos de los atributos.
{
"Thread": {
"Keys": [
{
"ForumName":{"S": "Amazon DynamoDB"},
"Subject":{"S": "DynamoDB Thread 1"}
},
{
"ForumName":{"S": "Amazon S3"},
"Subject":{"S": "S3 Thread 1"}
}
],
"ProjectionExpression":"ForumName, Subject, LastPostedDateTime, Replies"
}
}
BatchWriteItem
La operacin BatchWriteItem puede contener hasta 25 solicitudes PutItem y DeleteItem
individuales y puede escribir hasta 16 MB de datos. El tamao mximo de un elemento individual es de
400 KB. Adems, una operacin BatchWriteItem puede colocar o eliminar elementos en varias tablas.
Note
Example
{
"ProductCatalog": [
{
"PutRequest": {
"Item": {
"Id": { "N": "601" },
"Description": { "S": "Snowboard" },
"QuantityOnHand": { "N": "5" },
"Price": { "N": "100" }
}
}
},
{
"PutRequest": {
"Item": {
Contadores atmicos
Puede usar la operacin UpdateItem para implementar un contador atmico. Se trata de un atributo
numrico que se incrementa de forma incondicional y sin interferir con las dems solicitudes de escritura.
Todas las solicitudes de escritura se aplican en el orden en que se reciben. Con un contador atmico, las
actualizaciones no son idempotentes. Esto significa que el valor numrico aumentar cada vez que se
llame a UpdateItem.
Es posible utilizar un contador atmico para realizar el seguimiento del nmero de visitantes de un sitio
web. En este caso, la aplicacin incrementara un valor numrico, independientemente del valor actual. En
caso de error en la operacin UpdateItem, la aplicacin solo tendra que reintentarla. Aunque se correra
el riesgo de actualizar dos veces el contador, seguramente sera tolerable un pequeo margen de error al
alza o a la baja en el nmero de visitantes del sitio web.
Un contador atmico no sera adecuado en aquellos casos en que no fuese admisible un margen de error
al alza o a la baja (por ejemplo, en una aplicacin bancaria). En tales ocasiones, es ms seguro utilizar una
actualizacin condicional en lugar de un contador atmico.
Para obtener ms informacin, consulte Aumento y reduccin de atributos numricos (p. 372).
Example
En el siguiente ejemplo de la AWS CLI se incrementa el valor de Price de un producto en 5. Dado que
UpdateItem no es idempotente, el valor de Price se aumentar cada vez que se ejecute el ejemplo.
Escrituras condicionales
De forma predeterminada, las operaciones de escritura de DynamoDB (PutItem, UpdateItem,
DeleteItem) son incondicionales. Esto significa que cada una de ellas sobrescribir cualquier elemento
existente que tenga la clave principal especificada.
Opcionalmente, DynamoDB admite las escrituras condicionales para estas operaciones. Una escritura
condicional solamente se lleva a cabo si los atributos del elemento cumplen una o varias de las
condiciones esperadas. En caso contrario, devuelve un error. Las escrituras condicionales resultan tiles
en muchas situaciones. Por ejemplo, puede ser conveniente que una operacin PutItem solamente se
lleve a cabo si no existe ningn elemento que tenga la misma clave principal. O puede que desee impedir
que una operacin UpdateItem modifique un elemento si uno de sus atributos tiene un valor determinado.
Las escrituras condicionales son tiles en aquellos casos en que varios usuarios intentan modificar el
mismo elemento. Fjese en el siguiente diagrama, en el que dos usuarios (Alice y Bob) trabajan con el
mismo elemento de una tabla de DynamoDB:
Supongamos que Alice utiliza la AWS CLI para actualizar el atributo Price a 8:
{
":newval":{"N":"8"}
}
Ahora, supongamos que Bob emite una solicitud UpdateItem parecida ms adelante, pero cambia el
valor de Price a 12. Para Bob, el parmetro --expression-attribute-values tendr este aspecto:
{
":newval":{"N":"12"}
}
Bob la solicitud de Bob se lleva a cabo, pero se pierde la actualizacin previa de Alice.
Para solicitar una operacin PutItem, DeleteItem o UpdateItem condicional, debe especificar una
expresin de condicin. Una expresin de condicin es una cadena que contiene nombres de atributos,
operadores condicionales y funciones integradas. La totalidad de expresin debe evaluarse en true. De lo
contrario, la operacin no se llevar a cabo correctamente.
Ahora, fjese en el siguiente diagrama, en el que se muestra que el uso de escrituras condicionales
impedira que la actualizacin de Alice se sobrescribiese:
Alice intenta actualizar el valor de Price a 8, pero solamente si el valor de Price actual es 10:
{
":newval":{"N":"8"},
":currval":{"N":"10"}
La actualizacin de Alice se lleva a cabo correctamente porque el resultado de evaluar la condicin es true.
A continuacin, Bob intenta actualizar el valor de Price a 12, pero solamente si el valor de Price actual
es 10. Para Bob, el parmetro --expression-attribute-values tendr este aspecto:
{
":newval":{"N":"12"},
":currval":{"N":"10"}
}
Dado que Alice ha cambiado previamente el valor de Price a 8, la expresin de condicin se evala en
false, de modo que la actualizacin de Bob no se lleva a cabo.
Por ejemplo, supongamos que emite una solicitud UpdateItem para aumentar el valor de Price de un
elemento en 3, pero solamente si el valor de Price actual es 20. Despus de enviar la solicitud, pero
antes de recibir su resultado, se produce un error en la red y usted no sabe si la solicitud se ha realizado
correctamente. Dado que las escrituras condicionales son idempotentes, puede reintentar la misma
solicitud UpdateItem y DynamoDB actualizar el elemento solamente si el valor de Price actual es 20.
Note
Para devolver el nmero de unidades de capacidad de escritura consumidas durante una escritura
condicional, se usa el parmetro ReturnConsumedCapacity:
Note
Temas
Especificacin de atributos de elementos (p. 352)
Expresiones de proyeccin (p. 355)
Nombres de atributos de expresin (p. 356)
Valores de los atributos de expresin (p. 359)
Expresiones de condicin (p. 360)
Expresiones de actualizacin (p. 368)
Temas
Atributos de nivel superior (p. 354)
Atributos anidados (p. 354)
Rutas de documento (p. 355)
En esta seccin, tomaremos un elemento de la tabla ProductCatalog. Esta tabla se describe en Ejemplos
de tablas y datos (p. 773). A continuacin se muestra una representacin del elemento:
Id
Title
Description
BicycleType
Brand
Price
Color
ProductCategory
InStock
QuantityOnHand
RelatedItems
Pictures
ProductReviews
Comment
Safety.Warning
Todos estos atributos de nivel superior son escalares, con la salvedad de Color (lista), RelatedItems
(lista), Pictures (mapa) y ProductReviews (mapa).
Atributos anidados
Se considera que un atributo es anidado si est integrado en otro atributo. Para obtener acceso a un
atributo anidado, se utilizan los operadores de desreferenciacin:
MyList[0]
AnotherList[12]
ThisList[5][11]
El nmero contenido entre corchetes debe ser un entero no negativo. Por lo tanto, las siguientes
expresiones no son vlidas:
MyList[-1]
MyList[0.4]
El operador de desreferenciacin de una entrada de un mapa es . (punto). Utilice el punto como separador
entre las entradas de un mapa:
MyMap.nestedField
MyMap.nestedField.deeplyNestedField
Rutas de documento
En una expresin, se utiliza una ruta de documento para indicar a DynamoDB dnde se encuentra un
atributo. En el caso de un atributo de nivel superior, la ruta de documento es el nombre de atributo. En
el caso de un atributo anidado, se utilizan operadores de desreferenciacin para construir la ruta de
documento.
ProductDescription
Atributo de lista de nivel superior. Devolver la lista completa, no solo algunas de las entradas.
RelatedItems
Tercera entrada de la lista RelatedItems. Recuerde que las entradas de lista se basan en cero.
RelatedItems[2]
Imagen frontal del producto.
Pictures.FrontView
Todas las opiniones de cinco estrellas.
ProductReviews.FiveStar
Primera de las opiniones de cinco estrellas.
ProductReviews.FiveStar[0]
Note
La profundidad mxima de una ruta de documento es 32. Por lo tanto, el nmero de operadores
de desreferenciacin de una ruta no puede superar este lmite.
Puede utilizar cualquier nombre de atributo en una ruta de documento, siempre y cuando el primer carcter
sea a-z o A-Z y el segundo carcter (si lo hay) sea a-z, A-Z o 0-9. Si un nombre de atributo no cumple
este requisito, deber definir un nombre de atributo de expresin como marcador de posicin. Para obtener
ms informacin, consulte Nombres de atributos de expresin (p. 356).
Expresiones de proyeccin
Para leer datos de una tabla, se utilizan operaciones tales como GetItem, Query o Scan. De forma
predeterminada, DynamoDB devuelve todos los atributos de los elementos. Si desea obtener solo uno en
lugar de todos ellos, debe usar una expresin de proyeccin.
Una expresin de proyeccin es una cadena que identifica los atributos que se desea obtener. Para
recuperar un solo atributo, especifique su nombre. Si desea obtener varios atributos, separe sus nombres
mediante comas.
Title
Tres atributos de nivel superior. DynamoDB recuperar el conjunto Color completo.
Puede utilizar cualquier nombre de atributo en una expresin de proyeccin, siempre y cuando el primer
carcter sea a-z o A-Z y el segundo carcter (si lo hay) sea a-z, A-Z o 0-9. Si un nombre de atributo no
cumple este requisito, deber definir un nombre de atributo de expresin como marcador de posicin. Para
obtener ms informacin, consulte Nombres de atributos de expresin (p. 356).
En el ejemplo de la AWS CLI siguiente se muestra cmo usar una expresin de proyeccin con
una operacin GetItem. La expresin de proyeccin recupera un atributo escalar de nivel superior
(Description), la primera entrada de una lista (RelatedItems[0]) y una lista anidada en un mapa
(ProductReviews.FiveStar).
{
"Id": { "N": "123" }
}
Para obtener ejemplos de cdigo especficos de los lenguajes de programacin, consulte Introduccin a
DynamoDB (p. 55).
En esta seccin se describen varias situaciones en las que deber utilizar nombres de atributos de
expresin.
Note
En los ejemplos de esta seccin se utiliza la AWS CLI. Para obtener ejemplos de cdigo
especficos de los lenguajes de programacin, consulte Introduccin a DynamoDB (p. 55).
Temas
Palabras reservadas (p. 357)
Palabras reservadas
En algunas ocasiones, es posible que necesite escribir una expresin que contenga un nombre de atributo
que entre en conflicto con una palabra reservada de DynamoDB. Para obtener una lista completa de
palabras reservadas, consulte Palabras reservadas en DynamoDB (p. 815).
Por ejemplo, el siguiente ejemplo de la AWS CLI no funcionara correctamente porque COMMENT es una
palabra reservada:
Para solucionar este problema, puede sustituir Comment por un nombre de atributo de expresin; por
ejemplo, #c. El smbolo de almohadilla (#) es obligatorio e indica que se trata de un marcador de posicin
del nombre de un atributo. Ahora, el ejemplo de la AWS CLI tendra este aspecto:
Note
Supongamos que desea obtener acceso a Safety.Warning mediante una expresin de proyeccin:
DynamoDB podra devolver un resultado vaco, en lugar de la cadena prevista ("Always wear a
helmet"). El motivo es que DynamoDB interpreta el punto en una expresin como un separador de ruta de
documento. En este caso, habra que definir un nombre de atributo de expresin (por ejemplo, #sw) como
sustituto de Safety.Warning. A continuacin, podra utilizar la siguiente expresin de proyeccin:
Atributos anidados
Supongamos que desea obtener acceso al atributo anidado ProductReviews.OneStar, utilizando la
siguiente expresin de proyeccin:
El resultado podra contener todas las opiniones sobre productos de una sola estrella, que es lo previsto.
Pero qu sucedera si utiliza en su lugar un nombre de atributo de expresin? Por ejemplo, qu ocurrira
si definiese #pr1star como sustituto de ProductReviews.OneStar?
DynamoDB podra devolver un resultado vaco, en lugar del mapa previsto de opiniones de una sola
estrella. Esto se debe a que DynamoDB interpreta el punto en el valor de un atributo de expresin como
un carcter del nombre del atributo. Cuando DynamoDB evala el nombre de atributo de expresin
#pr1star, determina que ProductReviews.OneStar hace referencia a un atributo escalar, que no es
lo que estaba previsto.
El enfoque correcto consiste en definir un nombre de atributo de expresin para cada componente de la
ruta del documento:
#pr ProductReviews
#1star OneStar
Para que resulte ms concisa, puede sustituir ProductReviews por un nombre de atributo de expresin,
como #pr. Ahora, la expresin revisada tendra este aspecto:
Si define un nombre de atributo de expresin, debe usarlo de forma coherente en toda la expresin.
Adems, es importante no omitir el signo #.
Por ejemplo, supongamos que desea devolver todos los elementos de ProductCatalog que estn
disponibles en el color Black y tengan un precio de 500 o menos. Podra utilizar una operacin Scan con
una expresin de filtro, como en este ejemplo de la AWS CLI:
{
":c": { "S": "Black" },
Note
Una operacin Scan lee todos los elementos de una tabla; por consiguiente, debe evitarse usar
Scan con tablas de gran tamao.
La expresin de filtro se aplica a los resultados de Scan y los elementos que no coinciden con la
expresin de filtro se descartan.
Si define un valor de atributo de expresin, debe usarlo de forma coherente en toda la expresin. Adems,
es importante no omitir el signo :.
Los valores de atributos de expresin se usan con expresiones de condicin, expresiones de actualizacin
y expresiones de filtro.
Note
Expresiones de condicin
Para manipular datos en una tabla de DynamoDB, se usan las operaciones PutItem, UpdateItem y
DeleteItem. Tambin puede utilizar BatchWriteItem para realizar varias operaciones PutItem o
DeleteItem en una sola llamada.
Para estas operaciones de manipulacin de datos, puede especificar una expresin de condicin con el fin
de determinar qu elementos deben modificarse. Si la expresin de condicin se evala en true, entonces
la operacin se realiza correctamente; de lo contrario, se produce un error.
Los argumentos de --item se almacenan en el archivo item.json. Para simplificar, se utilizan tan solo
algunos de los atributos de elementos.
{
"Id": {"N": "456" },
"ProductCategory": {"S": "Sporting Goods" },
"Price": {"N": "650" }
}
Temas
Cmo evitar sobrescribir un elemento existente (p. 361)
Comprobacin de los atributos de un elemento (p. 361)
Eliminaciones condicionales (p. 361)
Actualizaciones condicionales (p. 362)
Si la expresin de condicin se evala en false, DynamoDB devuelve el siguiente mensaje de error: The
conditional request failed.
Note
Note
Eliminaciones condicionales
Para realizar una eliminacin condicional, se usa una operacin DeleteItem con una expresin de
condicin. La expresin de condicin debe evaluarse en true para que la operacin se lleve a cabo
correctamente; de lo contrario, se produce un error.
{
"Id": {
"N": "456"
},
"Price": {
"N": "650"
},
"ProductCategory": {
"S": "Sporting Goods"
}
}
Ahora, supongamos que deseamos eliminar el elemento, pero solo en las siguientes condiciones:
{
":cat1": {"S": "Sporting Goods"},
":cat2": {"S": "Gardening Supplies"},
":lo": {"N": "500"},
":hi": {"N": "600"}
}
Note
Actualizaciones condicionales
Para realizar una actualizacin condicional, se usa una operacin UpdateItem con una expresin de
condicin. La expresin de condicin debe evaluarse en true para que la operacin se lleve a cabo
correctamente; de lo contrario, se produce un error.
Note
UpdateItem tambin admite las expresiones de actualizacin, en las que se especifican las
modificaciones que se desea aplicar a un elemento. Para obtener ms informacin, consulte
Expresiones de actualizacin (p. 368).
Supongamos que hemos comenzado por el elemento mostrado en Expresiones de condicin (p. 360):
{
"Id": { "N": "456"},
"Price": {"N": "650"},
"ProductCategory": {"S": "Sporting Goods"}
}
En el ejemplo siguiente se realiza una operacin UpdateItem. Se intenta reducir el valor de Price de
un producto en 75, pero la expresin de condicin impide la actualizacin si el valor de Price actual es
menor que 500:
{
":discount": { "N": "75"},
":limit": {"N": "500"}
}
Si el valor inicial de Price es 650, entonces la operacin UpdateItem reduce el precio a 575. Si ejecuta
la operacin UpdateItem de nuevo, el valor de Price se reduce a 500. Si se ejecuta una tercera vez, la
expresin de condicin se evala en false y la actualizacin no se lleva a cabo.
Note
Temas
Sintaxis de las expresiones de condicin (p. 364)
Realizacin de comparaciones (p. 364)
Funciones (p. 365)
En el siguiente resumen de sintaxis, el componente operand puede ser uno de los siguientes:
Un nombre de atributo de nivel superior, como por ejemplo Id, Title, Description o
ProductCategory
Una ruta de documento que hace referencia a un atributo anidado
condition-expression ::=
operand comparator operand
| operand BETWEEN operand AND operand
| operand IN ( operand (',' operand (, ...) ))
| function
| condition AND condition
| condition OR condition
| NOT condition
| ( condition )
comparator ::=
=
| <>
| <
| <=
| >
| >=
function ::=
attribute_exists (path)
| attribute_not_exists (path)
| attribute_type (path, type)
| begins_with (path, substr)
| contains (path, operand)
| size (path)
Realizacin de comparaciones
Utilice estos comparadores para comparar un operando con un rango o una lista de valores:
Use las palabras clave BETWEEN e IN para comparar un operando con un rango o una lista de valores:
Funciones
Utilice las siguientes funciones para determinar si un atributo existe en un elemento o evaluar el valor de
un atributo. Los nombres de estas funciones distinguen entre maysculas y minsculas. En el caso de los
atributos anidados, debe proporcionar su ruta de documento completa.
Funcin Descripcin
attribute_exists (Pictures.SideView)
attribute_not_exists (Manufacturer)
S Cadena
SS: String Set
N: Number
NS: Number Set
B: Binary
BS: Binary Set
BOOL: Boolean
NULL Null
L List
M: Map
attribute_type
(ProductReviews.FiveStar, :v_sub)
Funcin Descripcin
Ejemplo: Comprobacin de si los primeros
caracteres de la URL de la imagen de vista frontal
son http://.
begins_with
(Pictures.FrontView, :v_sub)
Funcin Descripcin
size(ProductReviews.OneStar)
> :v_sub
Evaluaciones lgicas
Utilice las palabras clave AND, OR y NOT para llevar a cabo evaluaciones lgicas. En la lista siguiente, a y b
representan las condiciones que se van a evaluar.
Parntesis
Los parntesis se utilizan para cambiar la preferencia de una evaluacin lgica. Por ejemplo, supongamos
que las condiciones a y b son true y que la condicin c es false. La siguiente expresin se evala en true:
a OR b AND c
Sin embargo, si se incluye una condicin entre parntesis, esta se evala antes. Por ejemplo, lo siguiente
se evala en false:
(a OR b) AND c
Note
En una expresin se pueden utilizar parntesis anidados. En este caso, se evalan primero los
ms internos.
DynamoDB evala las condiciones de izquierda a derecha aplicando las siguientes normas de prioridad:
Expresiones de actualizacin
Para actualizar un elemento existente de una tabla, utilice la operacin UpdateItem. Es preciso
proporcionar la clave del elemento que se desea actualizar. Asimismo, debe proporcionar una expresin
de actualizacin que indique los atributos que se van a modificar y los valores que se les asignarn.
Una expresin de actualizacin especifica cmo UpdateItem modificar los atributos de un elemento; por
ejemplo, estableciendo un valor escalar o eliminando entradas de una lista o un mapa.
update-expression ::=
[ SET action [, action] ... ]
[ REMOVE action [, action] ...]
[ ADD action [, action] ... ]
[ DELETE action [, action] ...]
Una expresin de actualizacin consta de una o varias clusulas. Cada clusula comienza con una palabra
clave SET, REMOVE, ADD o DELETE. Puede incluir cualquiera de estas clusulas en una expresin de
actualizacin, en cualquier orden. Sin embargo, cada palabra clave de accin solo puede aparecer una
vez.
Cada clusula contiene una o ms acciones, separadas por comas. Cada accin representa una
modificacin de datos.
Los ejemplos que aparecen en esta seccin se basan en el elemento ProductCatalog que se muestra en
Expresiones de proyeccin (p. 355).
Temas
SET: modificacin o adicin de atributos de elementos (p. 369)
REMOVE: eliminacin de atributos de un elemento (p. 374)
ADD: actualizacin de nmeros y conjuntos (p. 375)
DELETE: eliminacin de entradas de un conjunto (p. 376)
Tambin puede utilizar SET para sumar o restar un valor de un atributo de tipo Number. Para llevar a cabo
varias acciones SET, debe separarlas por comas.
set-action ::=
path = value
value ::=
operand
| operand '+' operand
| operand '-' operand
operand ::=
path | function
La siguiente operacin PutItem crea un elemento de muestra al que nos referiremos en los ejemplos:
Los argumentos de --item se almacenan en el archivo item.json. Para simplificar, se utilizan tan solo
algunos de los atributos de elementos.
{
"Id": {"N": "789"},
"ProductCategory": {"S": "Home Improvement"},
"Price": {"N": "52"},
"InStock": {"BOOL": true},
Temas
Modificacin de atributos (p. 370)
Adicin de listas y mapas (p. 370)
Adicin de entradas a una lista (p. 371)
Adicin de atributos de mapa anidados (p. 371)
Aumento y reduccin de atributos numricos (p. 372)
Adicin de entradas a una lista (p. 372)
Cmo evitar sobrescribir un atributo existente (p. 373)
Modificacin de atributos
Example
{
":c": { "S": "Hardware" },
":p": { "N": "60" }
}
Note
Example
{
":ri": {
"L": [
{ "S": "Hammer" }
]
},
":pr": {
"M": {
"FiveStar": {
"L": [
{ "S": "Best product ever!" }
]
}
}
}
}
Example
Agregue un nuevo atributo a la lista RelatedItems. Recuerde que las entradas de lista estn basadas en
cero; es decir, [0] representa la primera entrada de la lista, [1] representa la segunda, y as sucesivamente.
{
":ri": { "S": "Nails" }
}
Note
Cuando se utiliza SET para actualizar una entrada de lista, el contenido de esa entrada se
sustituye por los nuevos datos que ha especificado. Si la entrada no existe, SET adjunta la nueva
entrada al final de la lista.
Si agrega varias entradas en una misma operacin SET, las entradas se ordenan segn su
nmero.
Example
--expression-attribute-names file://names.json \
--expression-attribute-values file://values.json \
--return-values ALL_NEW
{
"#pr": "ProductReviews",
"#5star": "FiveStar",
"#3star": "ThreeStar"
}
{
":r5": { "S": "Very happy with my purchase" },
":r3": {
"L": [
{ "S": "Just OK - not that great" }
]
}
}
Puede sumar o restar un valor a un atributo numrico. Para ello, se utilizan los operadores + (ms) y -
(menos).
Example
Puede agregar entradas al final de una lista. Para ello, se utiliza SET con la funcin list_append. El
nombre de funcin distingue entre maysculas y minsculas. La funcin list_append es especfica de la
accin SET y solamente se puede utilizar en una expresin de actualizacin. La sintaxis es la siguiente:
La funcin toma dos listas como informacin de entrada y agrega list2 a list1.
Example
En Adicin de entradas a una lista (p. 371), hemos creado la lista RelatedItems y hemos incluido en
ella dos entradas: Hammer y Nails. Ahora, vamos a agregar dos entradas ms al final de RelatedItems:
{
":vals": {
"L": [
{ "S": "Screwdriver" },
{"S": "Hacksaw" }
]
}
}
Por ltimo, vamos a agregar una entrada ms al principio de RelatedItems. Para ello, tenemos que
cambiar el orden de las entradas de list_append. Recuerde que list_append toma dos listas como
informacin de entrada y agrega la segunda lista a la primera.
Ahora, el atributo RelatedItems resultante contiene cinco entradas, el siguiente orden: Chisel, Hammer,
Nails, Screwdriver y Hacksaw.
Si desea evitar sobrescribir un atributo existente, puede utilizar SET con la funcin if_not_exists. El
nombre de funcin distingue entre maysculas y minsculas. La funcin if_not_exists es especfica de
la accin SET y solamente se puede utilizar en una expresin de actualizacin. La sintaxis es la siguiente:
Example
Establezca el valor de Price de un elemento, pero solo si este no tiene ya un atributo Price. Si Price ya
existe, no sucede nada.
remove-action ::=
path
Example
Example
En Adicin de entradas a una lista (p. 372), hemos modificado un atributo de lista (RelatedItems) para
que contenga cinco elementos:
[0]Chisel
[1]Hammer
[2]Nails
[3]Screwdriver
[4]Hacksaw
Despus de eliminar Hammer y Nails, los elementos siguientes se reordenan. Ahora, la lista contiene lo
siguiente:
[0]Chisel
[1]Screwdriver
[2]Hacksaw
Utilice la accin ADD en una expresin de actualizacin para agregar un nuevo atributo y sus valores a un
elemento.
Si el atributo ya existe, el comportamiento de ADD depende del tipo de datos del atributo:
Si el atributo es un nmero y el valor que se agrega tambin es un nmero, entonces el valor se suma
matemticamente al atributo existente. Si el valor es un nmero negativo, entonces se resta del atributo
existente.
Si el atributo es un conjunto y el valor que se agrega tambin es un conjunto, entonces el valor se
agrega al conjunto existente.
Note
La accin ADD solo es compatible con los tipos de datos Number y Set.
Para llevar a cabo varias acciones ADD, debe separarlas por comas.
El componentepathes la ruta de documento de un atributo. El tipo de datos del atributo debe ser
Number o Set.
El componentevaluees un nmero que se desea agregar al atributo (si el tipo de datos es Number) o
un conjunto que se desea agregar al atributo (si el tipo de datos es Set).
add-action ::=
path value
Adicin de un nmero
Ahora que QuantityOnHand ya existe, puede volver a ejecutar el ejemplo para incrementar
QuantityOnHand en 5cada vez.
Supongamos que el atributo Color no existe. En el siguiente ejemplo de la AWS CLI se establece Color
en un conjunto de cadenas que contiene dos entradas:
Utilice la accin DELETE en una expresin de actualizacin para eliminar una o varias entradas de un
conjunto. Para llevar a cabo varias acciones DELETE, debe separarlas por comas.
El componentepathes la ruta de documento de un atributo. El tipo de datos del atributo debe ser Set.
El componentesubset representa una o varias entradas que se van a eliminar de path . Para subset
debe especificar un tipo de datos Set.
delete-action ::=
path value
Example
En Adicin de entradas a un conjunto (p. 376), hemos creado el conjunto de cadenas Colors. En este
ejemplo se eliminan algunas de las entradas de ese conjunto:
Tiempo de vida
El Tiempo de vida (TTL) en DynamoDB permite definir cundo vencen los elementos de una tabla y
eliminarlos automticamente de la base de datos.
El TTL se ofrece sin costo adicional para reducir el uso del almacenamiento que ocupan los datos que
ya no se necesitan, pero sin consumir desempeo provisionado. Cuando el TTL se ha activado en una
tabla, se puede establecer una marca temporal para eliminar cada elemento cuando el corresponde.
Esto permite limitar el uso de almacenamiento, porque solamente se conservan los registros que son
pertinentes.
El TTL resulta til cuando se van acumulando continuamente datos que pierden su pertinencia transcurrido
un periodo determinado. Por ejemplo: datos de sesin, logs de eventos, patrones de uso y otros datos
temporales. Si tiene informacin confidencial que es preciso conservar solamente durante un plazo
determinado en virtud de obligaciones contractuales o normativas, el TTL le ayuda a garantizar su
eliminacin puntual de acuerdo con las fechas programadas.
TTL compara la fecha y hora actuales en formato de tiempo Unix con la fecha y hora almacenadas en
el atributo de Tiempo de vida de un elemento. Si el valor de tiempo en formato Unix almacenado en el
atributo es menor que la fecha y hora actuales, el elemento se marca como vencido y, a continuacin, se
elimina.
Note
El formato de tiempo en formato Unix es el nmero de segundos transcurridos desde las 12:00:00
a.m. del 1 de enero de 1970 en UTC.
DynamoDB elimina los elementos vencidos en la medida en que sea posible para garantizar la
disponibilidad del desempeo para otras operaciones de datos.
Important
A medida que se eliminan, los elementos se retiran inmediatamente de los ndice secundario local y ndice
secundario global, de la misma forma consistente final que si se tratase de una operacin de eliminacin
normal.
Por ejemplo, tomemos una tabla denominada SessionData que realiza el seguimiento del historial de
sesiones de los usuarios. Cada elemento de SessionData se identifica mediante una clave de particin
(UserName) y una clave de ordenacin (SessionId). Hay otros atributos, como UserName,SessionId,
CreationTime y ExpirationTime que realizan el seguimiento de la informacin de las sesiones.
SessionData
En este ejemplo, cada elemento tiene un valor del atributo ExpirationTime que se establece al crearlo.
Tomemos el primer registro:
SessionData
En este ejemplo, el elemento CreationTime se establece en el viernes 29 de abril de 2016 a las 12:00
p.m. en UTC y ExpirationTime se ha establecido en dos horas ms tarde el viernes, 29 de abril de 2016
a las 2:00 p.m. en UTC. El elemento vencer cuando la fecha y hora actuales, en formato de tiempo
Unix, sea mayor que la fecha y hora del atributo ExpirationTime. En este caso, el elemento cuya clave
es { Username: user1, SessionId: 74686572652773 } vencer despus de las 2:00 p.m.
(1461938400).
Note
Debido a la posible demora entre las fechas y horas de vencimiento y eliminacin, las consultas
podran devolver elementos vencidos. Si no desea que aparezcan elementos vencidos cuando
emita una solicitud de lectura, es importante definir y utilizar un atributo de vencimiento para
filtrarlos.
Para ello, utilice una expresin de filtro que solamente devuelva los elementos cuyo valor de
vencimiento de Tiempo de vida sea mayor que la fecha y hora actuales en formato de tiempo
Unix. Para obtener ms informacin, consulte Expresiones de filtro para Query (p. 427) y
Expresiones de filtro para Scan (p. 443).
Asegrese de que todos los valores de marca temporal del atributo de Tiempo de vida especificado sean
correctos y tengan el formato adecuado.
Los elementos cuyo vencimiento est definido para hace ms de 5aos no se eliminan.
Si es importante poder recuperar los datos, recomendamos realizar un backup de la tabla.
Si solo necesita recuperar los datos de las ltimas 24horas, puede usar Amazon DynamoDB Streams.
Para obtener ms informacin, consulte Flujos de DynamoDB y Tiempo de vida (p. 545).
Para realizar un backup completo, puede utilizar AWS Data Pipeline. Para obtener ms informacin,
consulte Exportacin e importacin de datos de DynamoDB mediante AWS Data Pipeline (p. 755).
Puede utilizar polticas de IAM para impedir actualizaciones no autorizadas del atributo TTL
o que se configure la caracterstica de Tiempo de vida. Si solamente permite el acceso a
determinadas acciones en las polticas de IAM existentes, asegrese de actualizarlas para permitir
dynamodb:UpdateTimeToLive en los roles que necesiten habilitar o deshabilitar el Tiempo de vida en
las tablas. Para obtener ms informacin, consulte Uso de polticas basadas en identidad (polticas de
IAM) en Amazon DynamoDB (p. 640).
Estudie si debe aplicar algn proceso posterior a los elementos eliminados. Los registros de secuencia
de las eliminaciones de TTL se marcan y se pueden monitorizar mediante una funcin AWS Lambda.
Para obtener ms informacin sobre adiciones a los registros de secuencia, consulte Flujos de
DynamoDB y Tiempo de vida (p. 545).
Temas
Cmo habilitar Tiempo de vida (consola) (p. 379)
Cmo habilitar Tiempo de vida (CLI) (p. 381)
4. En el cuadro de dilogo Manage TTL, elija Enable TTL y despus especifique un nombre para TTL
attribute.
Enable TTL: elija esta opcin para habilitar o deshabilitar TTL en la tabla. Puede que el cambio tarde
hasta una hora en procesarse completamente.
TTL Attribute: nombre del atributo de DynamoDB en el que se almacenar la marca temporal de
TTL para los elementos.
24-hour backup streams: elija esta opcin para habilitar Amazon DynamoDB Streams en la tabla.
Para obtener ms informacin sobre cmo usar Flujos de DynamoDB con fines de backup, consulte
Flujos de DynamoDB y Tiempo de vida (p. 545).
5. (Opcional) Para obtener una vista previa de algunos de los elementos que se eliminarn cuando se
habilite TTL, elija Run preview.
Warning
Ahora que TTL est habilitado, el atributo TTL lleva la marca TTL cuando consulta los elementos en la
consola de DynamoDB.
Para ver la fecha y la hora de vencimiento de un elemento, mantenga el cursor del ratn sobre el atributo.
Para agregar un elemento a la tabla "TTLExample" con el atributo de Tiempo de vida establecido utilizando
el shell de BASH y la CLI:
Este ejemplo comenz con la fecha actual y se le agregaron cinco das para crear una fecha de
vencimiento. A continuacin, convierte la fecha de vencimiento al formato de tiempo Unix y, por ltimo,
agrega un elemento a la tabla "TTLExample".
Note
Una forma de establecer valores de vencimiento para Tiempo de vida consiste en calcular el
nmero de segundos que se sumarn al momento del vencimiento. Por ejemplo, cinco das son
432000segundos. Sin embargo, a menudo es preferible comenzar por una fecha y tomarla como
punto de partida.
Es bastante sencillo obtener el tiempo actual en formato de tiempo Unix. Por ejemplo:
Puede usar el API de documentos del AWS SDK for Java para realizar operaciones tpicas de creacin,
lectura, actualizacin y eliminacin (CRUD, Create, Read, Update and Delete) en los elementos de una
tabla.
Note
Adems, SDK para Java proporciona un modelo de persistencia de objetos, que permite
mapear las clases del lado del cliente a las tablas de DynamoDB. Este enfoque puede reducir
la cantidad de cdigo que hay que escribir. Para obtener ms informacin, consulte Java:
DynamoDBMapper (p. 202).
En las siguientes secciones se describen fragmentos de Java que permiten realizar diversas acciones con
elementos del API de documentos de Java. Si prefiere ejecutar ejemplos de trabajo completos, consulte:
Ejemplo: Operaciones CRUD mediante el API de documentos del AWS SDK for Java (p. 392)
Ejemplo: Operaciones por lotes mediante el API de documentos del AWS SDK for Java (p. 395)
Ejemplo: Control de atributos de tipo Binary mediante el API de documentos de AWS SDK for
Java (p. 399)
Colocacin de un elemento
El mtodo putItem almacena un elemento en una tabla. Si el elemento existe, sustituye el elemento
completo. En lugar de ello, si prefiere actualizar solamente algunos atributos concretos, puede usar el
mtodo updateItem. Para obtener ms informacin, consulte Actualizacin de un elemento (p. 389).
En el siguiente fragmento de cdigo Java se ponen en prctica las tareas anteriores. En el fragmento se
escribe un nuevo elemento en la tabla ProductCatalog.
Example
.withNumber("Price", 500)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red", "Black")))
.withString("ProductCategory", "Bicycle")
.withBoolean("InStock", true)
.withNull("QuantityOnHand")
.withList("RelatedItems", relatedItems)
.withMap("Pictures", pictures)
.withMap("Reviews", reviews);
En el ejemplo anterior, el elemento tiene atributos que son escalares (de tipo String, Number, Boolean o
Null), conjuntos (de tipo String Set) y tipos de documentos (de tipo List o Map).
En el siguiente ejemplo se agrega un nuevo elemento de libro utilizando estos parmetros opcionales.
Example
Supongamos que desea almacenar el siguiente documento JSON, que contiene los proveedores que
pueden servir pedidos de un producto determinado:
Example
{
"V01": {
"Name": "Acme Books",
"Offices": [ "Seattle" ]
},
"V02": {
"Name": "New Publishers, Inc.",
"Offices": ["London", "New York"
]
},
"V03": {
"Name": "Better Buy Books",
"Offices": [ "Tokyo", "Los Angeles", "Sydney"
]
}
}
Puede utilizar el mtodo withJSON para almacenar esta informacin en la tabla ProductCatalog en
un atributo de tipo Map denominado VendorInfo. En el siguiente fragmento de cdigo Java se muestra
cmo hacerlo.
Obtencin de un elemento
Para recuperar un solo elemento, utilice el mtodo getItem de un objeto Table. Sigue estos pasos:
En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores. En el fragmento de
cdigo se obtiene el elemento que tiene la clave de particin especificada.
Puede usar una expresin ProjectionExpression para recuperar solamente algunos atributos o
componentes concretos, en lugar de un elemento completo. Una expresin ProjectionExpression
permite especificar atributos de nivel superior o anidados mediante rutas de documentos. Para obtener
ms informacin, consulte Expresiones de proyeccin (p. 355).
Los parmetros del mtodo getItem no permiten especificar la consistencia de lectura. Sin embargo,
puede crear una especificacin GetItemSpec, que proporciona acceso pleno a toda la informacin
de entrada de la operacin de bajo nivel GetItem. En el ejemplo de cdigo siguiente se crea una
especificacin GetItemSpec y se utiliza como informacin de entrada para el mtodo getItem.
Example
System.out.println(item.toJSONPretty());
Para imprimir un Item en formato fcil de leer, utilice el mtodo toJSONPretty. El resultado del ejemplo
anterior tiene este aspecto:
{
"RelatedItems" : [ 341 ],
"Reviews" : {
"FiveStar" : [ "Excellent! Can't recommend it highly enough! Buy it!", "Do yourself a
favor and buy this" ]
},
"Id" : 123,
"Title" : "20-Bicycle 123"
}
spec.withProjectionExpression("VendorInfo");
System.out.println(table.getItem(spec).toJSON());
Note
Puede usar el mtodo toJSON para convertir cualquier elemento (o sus atributos) en una cadena
con formato JSON. En el siguiente fragmento de cdigo se recuperan varios atributos de nivel
superior y anidados y se imprimen los resultados como JSON:
{"VendorInfo":{"V01":{"Name":"Acme Books","Offices":
["Seattle"]}},"Price":30,"Title":"Book 210 Title"}
pueden especificar en ella. Si supera estos lmites, DynamoDB rechaza la solicitud. Para obtener ms
informacin, consulte Lmites en DynamoDB (p. 765).
En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores. El ejemplo lleva
a cabo una operacin batchWriteItem en dos tablas, Forum y Thread. Los objetos TableWriteItems
correspondientes definen las siguientes acciones:
Para ver un ejemplo prctico, consulte Ejemplo: Operacin de escritura por lotes mediante el API de
documentos del AWS SDK for Java (p. 396).
En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores. El ejemplo recupera
dos elementos de la tabla Forum y tres de la tabla Thread.
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name",
"Amazon S3",
"Amazon DynamoDB");
Example
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name",
"Amazon S3",
"Amazon DynamoDB");
Actualizacin de un elemento
El mtodo updateItem de un objeto Table permite actualizar los valores de atributos presentes, agregar
atributos nuevos o eliminarlos de un elemento existente.
Si un elemento no existe (no hay ningn elemento en la tabla con la misma clave principal especificada),
updateItem agrega un elemento nuevo a la tabla.
Si un elemento ya existe, updateItem lleva a cabo la actualizacin segn lo especificado en el
parmetro UpdateExpression:
Note
Tambin es posible actualizar un elemento mediante putItem. Por ejemplo, si llama a putItem
para agregar un elemento a la tabla pero ya existe uno con la clave principal especificada,
1. Cree una instancia de la clase Table para representar la tabla que desea usar.
2. Llame al mtodo updateTable de la instancia de Table. Debe especificar la clave principal del
elemento que desea recuperar, junto con una expresin UpdateExpression que describa los atributos
que hay que cambiar y cmo modificarlos.
En el siguiente fragmento de cdigo Java se ponen en prctica las tareas anteriores. En el fragmento se
actualiza un elemento de libro de la tabla ProductCatalog. Se agrega un nuevo autor al conjunto Authors y
se elimina el atributo ISBN existente. Tambin se reduce el precio en una unidad.
Example
Contador atmico
Puede usar updateItem para implementar un contador atmico y aumentar o reducir el valor de un
atributo existente sin interferir con las dems solicitudes de escritura. Para incrementar un contador
atmico, use una expresin UpdateExpression con la accin set para sumar un valor numrico a una
atributo existente de tipo Number.
Eliminacin de un elemento
El mtodo deleteItem elimina un elemento de una tabla. Es preciso proporcionar la clave principal del
elemento que se desea eliminar.
Example
ProductCatalog solo se puede eliminar si el libro est descatalogado (el atributo InPublication es
false).
Example
Adems, SDK para Java proporciona un modelo de persistencia de objetos, que permite
mapear las clases del lado del cliente a las tablas de DynamoDB. Este enfoque puede reducir
la cantidad de cdigo que hay que escribir. Para obtener ms informacin, consulte Java:
DynamoDBMapper (p. 202).
Note
En este ejemplo de cdigo, se presupone que los datos ya se han cargado en DynamoDB para
su cuenta siguiendo las instrucciones de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291).
Para obtener instrucciones paso a paso acerca de cmo ejecutar el ejemplo, consulte Ejemplos
de cdigo Java (p. 296).
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DeleteItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome;
import com.amazonaws.services.dynamodbv2.document.spec.DeleteItemSpec;
import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec;
import com.amazonaws.services.dynamodbv2.document.utils.NameMap;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
import com.amazonaws.services.dynamodbv2.model.ReturnValue;
createItems();
retrieveItem();
}
catch (Exception e) {
System.err.println("Create items failed.");
System.err.println(e.getMessage());
}
}
try {
}
catch (Exception e) {
System.err.println("GetItem failed.");
System.err.println(e.getMessage());
}
try {
}
catch (Exception e) {
System.err.println("Failed to add new attribute in " + tableName);
System.err.println(e.getMessage());
}
}
try {
}
catch (Exception e) {
System.err.println("Failed to update multiple attributes in " + tableName);
System.err.println(e.getMessage());
}
}
try {
// Specify the desired price (25.00) and also the condition (price =
// 20.00)
}
catch (Exception e) {
System.err.println("Error updating item in " + tableName);
System.err.println(e.getMessage());
}
}
try {
}
catch (Exception e) {
System.err.println("Error deleting item in " + tableName);
System.err.println(e.getMessage());
}
}
}
En esta seccin se proporcionan ejemplos de operaciones de escritura y obtencin por lotes mediante el
API de documentos del AWS SDK for Java.
Note
Adems, SDK para Java proporciona un modelo de persistencia de objetos, que permite
mapear las clases del lado del cliente a las tablas de DynamoDB. Este enfoque puede reducir
la cantidad de cdigo que hay que escribir. Para obtener ms informacin, consulte Java:
DynamoDBMapper (p. 202).
Al crear la solicitud de escritura por lotes, puede especificar cualquier cantidad de solicitudes de colocacin
y eliminacin en una o varias tablas. Sin embargo, batchWriteItem limita el tamao de una solicitud de
escritura por lotes y el nmero de operaciones de colocacin y eliminacin que se pueden llevar a cabo
en una misma operacin de escritura por lotes. Si la solicitud supera estos lmites, se rechaza la solicitud.
Si la tabla no cuenta con suficiente desempeo provisionado para atender esta solicitud, los elementos de
solicitud sin procesar se devuelven en la respuesta.
En el siguiente ejemplo se comprueba la respuesta para saber si contiene elementos de solicitud sin
transformar. En caso afirmativo, entra en bucle y vuelve a enviar la solicitud batchWriteItem con
elementos sin procesar. Si ha seguido la seccin Creacin de tablas y carga de ejemplos de datos (p. 291),
seguramente habr creado ya las tablas Forum y Thread. Tambin puede crear estas tablas y cargar los
ejemplos de datos mediante programacin. Para obtener ms informacin, consulte Creacin de ejemplos
de tablas y carga de datos mediante el AWS SDK para Java (p. 783).
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo Java (p. 296).
Example
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.BatchWriteItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableWriteItems;
import com.amazonaws.services.dynamodbv2.model.WriteRequest;
writeMultipleItemsBatchWrite();
do {
if (outcome.getUnprocessedItems().size() == 0) {
System.out.println("No unprocessed items found");
}
else {
System.out.println("Retrieving the unprocessed items");
outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems);
}
}
catch (Exception e) {
System.err.println("Failed to retrieve items: ");
e.printStackTrace(System.err);
}
una lista de claves para cada elemento que se desea obtener. En el ejemplo se procesa la respuesta y se
imprimen los elementos recuperados.
Note
En este ejemplo de cdigo, se presupone que los datos ya se han cargado en DynamoDB para
su cuenta siguiendo las instrucciones de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291).
Para obtener instrucciones paso a paso acerca de cmo ejecutar el ejemplo, consulte Ejemplos
de cdigo Java (p. 296).
Example
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.BatchGetItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes;
import com.amazonaws.services.dynamodbv2.model.KeysAndAttributes;
try {
BatchGetItemOutcome outcome =
dynamoDB.batchGetItem(forumTableKeysAndAttributes,
threadTableKeysAndAttributes);
do {
for (String tableName : outcome.getTableItems().keySet()) {
System.out.println("Items in table " + tableName);
List<Item> items = outcome.getTableItems().get(tableName);
for (Item item : items) {
System.out.println(item.toJSONPretty());
}
}
if (unprocessed.isEmpty()) {
System.out.println("No unprocessed keys found");
}
else {
System.out.println("Retrieving the unprocessed keys");
outcome = dynamoDB.batchGetItemUnprocessed(unprocessed);
}
} while (!unprocessed.isEmpty());
}
catch (Exception e) {
System.err.println("Failed to retrieve items.");
System.err.println(e.getMessage());
}
Adems, SDK para Java proporciona un modelo de persistencia de objetos, que permite
mapear las clases del lado del cliente a las tablas de DynamoDB. Este enfoque puede reducir
la cantidad de cdigo que hay que escribir. Para obtener ms informacin, consulte Java:
DynamoDBMapper (p. 202).
Si ha seguido la seccin Creacin de tablas y carga de ejemplos de datos (p. 291), seguramente habr
creado ya la tabla Reply. Tambin puede crear esta tabla mediante programacin. Para obtener ms
informacin, consulte Creacin de ejemplos de tablas y carga de datos mediante el AWS SDK para
Java (p. 783).
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo Java (p. 296).
Example
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.GetItemSpec;
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String replyDateTime = dateFormatter.format(new Date());
is.close();
baos.close();
bais.close();
return result;
}
}
Puede usar el API de bajo nivel del AWS SDK para .NET para realizar operaciones tpicas de creacin,
lectura, actualizacin y eliminacin (CRUD, Create, Read, Update and Delete) en los elementos de una
tabla.
A continuacin se indican los pasos que suelen llevarse a cabo para realizar operaciones CRUD mediante
el API de bajo nivel de .NET.
Por ejemplo, use el objeto de solicitud PutItemRequest para cargar un elemento y el objeto de
solicitud GetItemRequest para recuperar un elemento existente.
Puede usar el objeto de solicitud para proporcionar los parmetros necesarios y opcionales.
3. Ejecute el mtodo apropiado proporcionado por el cliente pasndolo en el objeto de solicitud que ha
creado en el paso anterior.
Colocacin de un elemento
El mtodo PutItem carga un elemento en una tabla. Si el elemento existe, sustituye el elemento
completo.
Note
En lugar de ello, si prefiere actualizar solamente algunos atributos concretos, puede usar
el mtodo UpdateItem. Para obtener ms informacin, consulte Actualizacin de un
elemento (p. 405).
A continuacin se indican los pasos que hay que seguir para cargar un elemento mediante el API de bajo
nivel del SDK para .NET.
En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el ejemplo se carga
un elemento en la tabla ProductCatalog.
Example
En el ejemplo anterior, hemos cargado un elemento de libro que tiene los atributos Id, Title, ISBN y
Authors. Tenga en cuenta Id es un atributo de tipo numrico y dems son de cadena. Authors es de tipo
String Set.
Example
};
var response = client.PutItem(request);
Obtencin de un elemento
El mtodo GetItem recupera un elemento.
Note
Para recuperar varios elementos, puede usar el mtodo BatchGetItem. Para obtener ms
informacin, consulte Obtencin por lotes: obtencin de varios elementos (p. 410).
A continuacin se indican los pasos que hay que seguir para recuperar un elemento existente mediante el
API de bajo nivel del SDK para .NET.
Para obtener un elemento, debe proporcionar el nombre de la tabla y la clave principal del elemento.
3. Ejecute el mtodo GetItem proporcionando el objeto GetItemRequest que cre en el paso anterior.
Example
Actualizacin de un elemento
El mtodo UpdateItem actualiza un elemento si existe. Puede usar la operacin UpdateItem para
actualizar los valores de atributos presentes, agregar atributos nuevos o eliminarlos de la coleccin
existente. Si el elemento que tiene clave principal especificada no se encuentra, se agrega un nuevo
elemento.
Si se utiliza ADD para Action, puede agregar valores a un conjunto existente (de tipo String Set o
Number Set) o bien sumar (si se usa un nmero positivo) o restar (si se usa un nmero negativo)
matemticamente un valor del atributo numrico existente.
Note
La operacin PutItem tambin puede llevar a cabo una actualizacin. Para obtener ms
informacin, consulte Colocacin de un elemento (p. 403). Por ejemplo, si llama a PutItem
para cargar un elemento y la clave principal ya existe, la operacin PutItem sustituye el elemento
completo. Tenga en cuenta que, si hay atributos en el elemento existente que no se especifican
en la informacin de entrada, la operacin PutItem los eliminar. Sin embargo, UpdateItem
solo actualiza los atributos de entrada especificados y deja intactos los dems atributos de ese
elemento.
A continuacin se indican los pasos que hay que seguir para actualizar un elemento existente mediante el
API de bajo nivel del SDK para .NET.
Se trata del objeto de solicitud en el que se describen todas las actualizaciones, tales como agregar
atributos o actualizar o eliminar atributos existentes. Para eliminar un atributo, especifique su nombre
con el valor null.
3. Ejecute el mtodo UpdateItem proporcionando el objeto UpdateItemRequest que cre en el paso
anterior.
Example
Contador atmico
Puede usar updateItem para implementar un contador atmico y aumentar o reducir el valor de un
atributo existente sin interferir con las dems solicitudes de escritura. Para actualizar un contador atmico,
use updateItem con un atributo de tipo Number en el parmetro UpdateExpression y use ADD como valor
de Action.
Eliminacin de un elemento
El mtodo DeleteItem elimina un elemento de una tabla.
A continuacin se indican los pasos que hay que seguir para eliminar un elemento mediante el API de bajo
nivel del SDK para .NET.
Para eliminar un elemento, se requieren el nombre de la tabla y la clave principal del elemento.
3. Ejecute el mtodo DeleteItem proporcionando el objeto DeleteItemRequest que cre en el paso
anterior.
Example
Example
TableName = tableName,
Key = new Dictionary<string,AttributeValue>() { { "Id", new AttributeValue { N =
"201" } } },
// Optional parameters.
ReturnValues = "ALL_OLD",
ExpressionAttributeNames = new Dictionary<string, string>()
{
{"#IP", "InPublication"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":inpub",new AttributeValue {BOOL = false}}
},
ConditionExpression = "#IP = :inpub"
};
En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el siguiente ejemplo
se crea una solicitud BatchWriteItemRequest para realizar las siguientes operaciones de escritura:
A continuacin, el cdigo ejecuta BatchWriteItem para llevar a cabo una operacin por lotes.
{
new WriteRequest
{
PutRequest = new PutRequest
{
Item = new Dictionary<string,AttributeValue>
{
{ "Name", new AttributeValue { S = "Amazon S3 forum" } },
{ "Threads", new AttributeValue { N = "0" }}
}
}
}
}
} ,
{
table2Name, new List<WriteRequest>
{
new WriteRequest
{
PutRequest = new PutRequest
{
Item = new Dictionary<string,AttributeValue>
{
{ "ForumName", new AttributeValue { S = "Amazon S3 forum" } },
{ "Subject", new AttributeValue { S = "My sample question" } },
{ "Message", new AttributeValue { S = "Message Text." } },
{ "KeywordTags", new AttributeValue { SS = new List<string> { "Amazon S3",
"Bucket" } } }
}
}
},
new WriteRequest
{
DeleteRequest = new DeleteRequest
{
Key = new Dictionary<string,AttributeValue>()
{
{ "ForumName", new AttributeValue { S = "Some forum name" } },
{ "Subject", new AttributeValue { S = "Some subject" } }
}
}
}
}
}
}
};
response = client.BatchWriteItem(request);
Para ver un ejemplo prctico, consulte Ejemplo: Operaciones por lotes mediante el API de bajo nivel del
AWS SDK para .NET (p. 417).
A continuacin se indican los pasos que hay que seguir para recuperar varios elementos mediante el API
de bajo nivel del SDK para .NET.
2. Cree una instancia de la clase BatchGetItemRequest para proporcionar los parmetros requeridos.
Para recuperar varios elementos, es obligatorio indicar el nombre de la tabla y una lista de valores de
clave principal.
3. Ejecute el mtodo BatchGetItem proporcionando el objeto BatchGetItemRequest que cre en el
paso anterior.
4. Procese la respuesta. Debe comprobar si han quedado claves sin procesar, lo que podra ocurrir si se
alcanza el lmite de desempeo provisionado o se produce cualquier otro error transitorio.
}
}
};
Example
},
// Optional - name of an attribute to retrieve.
ProjectionExpression = "Title"
}
}
};
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class LowLevelItemCRUDExample
{
private static string tableName = "ProductCatalog";
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
// Delete item.
DeleteItem();
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
}
N = "1000"
} }
},
// Perform the following updates:
// 1) Add two new authors to the list
// 1) Set a new attribute
// 2) Remove the ISBN attribute
ExpressionAttributeNames = new Dictionary<string, string>()
{
{"#A","Authors"},
{"#NA","NewAttribute"},
{"#I","ISBN"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":auth",new AttributeValue {
SS = {"Author YY", "Author ZZ"}
}},
{":new",new AttributeValue {
S = "New Value"
}}
},
TableName = tableName,
ReturnValues = "ALL_NEW" // Give me all attributes of the updated item.
};
var response = client.UpdateItem(request);
TableName = tableName,
Console.WriteLine(
attributeName + " " +
(value.S == null ? "" : "S=[" + value.S + "]") +
(value.N == null ? "" : "N=[" + value.N + "]") +
(value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray())
+ "]") +
(value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray())
+ "]")
);
}
Console.WriteLine("************************************************");
}
}
}
En esta seccin se proporcionan ejemplos de las operaciones de escritura y obtencin por lotes que
DynamoDB admite.
Ejemplo: Operacin de escritura por lotes mediante el API de bajo nivel del AWS
SDK para .NET
En el siguiente ejemplo de cdigo C# se usa el mtodo BatchWriteItem para llevar a cabo las siguientes
operaciones de colocacin y eliminacin:
Al crear la solicitud de escritura por lotes, puede especificar cualquier cantidad de solicitudes de colocacin
y eliminacin en una o varias tablas. Sin embargo, BatchWriteItem de DynamoDB limita el tamao
de una solicitud de escritura por lotes y el nmero de operaciones de colocacin y eliminacin que se
pueden llevar a cabo en una misma operacin de escritura por lotes. Para obtener ms informacin,
consulte BatchWriteItem. Si la solicitud supera estos lmites, se rechaza la solicitud. Si la tabla no cuenta
con suficiente desempeo provisionado para atender esta solicitud, los elementos de solicitud sin procesar
se devuelven en la respuesta.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class LowLevelBatchWrite
{
private static string table1Name = "Forum";
},
new WriteRequest
{
// For the operation to delete an item, if you provide a
primary key value
// that does not exist in the table, there is no error, it is
just a no-op.
DeleteRequest = new DeleteRequest
{
Key = new Dictionary<string, AttributeValue>()
{
{ "ForumName", new AttributeValue {
S = "Some partition key value"
} },
{ "Subject", new AttributeValue {
S = "Some sort key value"
} }
}
}
}
}
}
}
};
CallBatchWriteTillCompletion(request);
}
int callCount = 0;
do
{
Console.WriteLine("Making request");
response = client.BatchWriteItem(request);
callCount++;
Console.WriteLine("Unprocessed");
foreach (var unp in unprocessed)
{
Console.WriteLine("{0} - {1}", unp.Key, unp.Value.Count);
}
Console.WriteLine();
// For the next iteration, the request will have unprocessed items.
request.RequestItems = unprocessed;
} while (response.UnprocessedItems.Count > 0);
Ejemplo: Operacin de obtencin por lotes mediante el API de bajo nivel del AWS
SDK para .NET
En el siguiente ejemplo de cdigo C# se usa el mtodo BatchGetItem para recuperar varios elementos
de las tablas Forum y Thread. La solicitud BatchGetItemRequest especifica los nombres de las tablas
y una lista de claves principales para cada tabla. En el ejemplo se procesa la respuesta y se imprimen los
elementos recuperados.
Si ha seguido los pasos de Creacin de tablas y carga de ejemplos de datos (p. 291), habr creado ya
estas tablas con ejemplos de datos. Tambin puede crear estos ejemplos de tablas y cargar los ejemplos
de datos mediante programacin. Para obtener ms informacin, consulte Creacin de ejemplos de tablas
y carga de datos mediante el AWS SDK para .NET (p. 790).
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class LowLevelBatchGet
{
private static string table1Name = "Forum";
private static string table2Name = "Thread";
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
S = "Amazon DynamoDB"
} }
},
new Dictionary<string, AttributeValue>()
{
{ "Name", new AttributeValue {
S = "Amazon S3"
} }
}
}
}},
{
table2Name,
new KeysAndAttributes
{
Keys = new List<Dictionary<string, AttributeValue> >()
{
new Dictionary<string, AttributeValue>()
{
{ "ForumName", new AttributeValue {
S = "Amazon DynamoDB"
} },
{ "Subject", new AttributeValue {
S = "DynamoDB Thread 1"
} }
},
new Dictionary<string, AttributeValue>()
{
{ "ForumName", new AttributeValue {
S = "Amazon DynamoDB"
} },
{ "Subject", new AttributeValue {
S = "DynamoDB Thread 2"
} }
},
new Dictionary<string, AttributeValue>()
{
{ "ForumName", new AttributeValue {
S = "Amazon S3"
} },
{ "Subject", new AttributeValue {
S = "S3 Thread 1"
} }
}
}
}
}
}
};
BatchGetItemResponse response;
do
{
Console.WriteLine("Making request");
response = client.BatchGetItem(request);
}
}
request.RequestItems = unprocessedKeys;
} while (response.UnprocessedKeys.Count > 0);
}
Console.WriteLine(
attributeName + " " +
(value.S == null ? "" : "S=[" + value.S + "]") +
(value.N == null ? "" : "N=[" + value.N + "]") +
(value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray())
+ "]") +
(value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray())
+ "]")
);
}
Console.WriteLine("************************************************");
}
}
}
Si ha seguido los pasos de Creacin de tablas y carga de ejemplos de datos (p. 291), habr creado ya
la tabla Reply. Tambin puede crear estos ejemplos de tablas mediante programacin. Para obtener
ms informacin, consulte Creacin de ejemplos de tablas y carga de datos mediante el AWS SDK
para .NET (p. 790).
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class LowLevelItemBinaryExample
{
private static string tableName = "Reply";
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
try
{
CreateItem(replyIdPartitionKey, replyDateTimeSortKey);
RetrieveItem(replyIdPartitionKey, replyDateTimeSortKey);
// Delete item.
DeleteItem(replyIdPartitionKey, replyDateTimeSortKey);
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
}
PrintItem(attributeList);
}
Console.WriteLine(
attributeName + " " +
(value.S == null ? "" : "S=[" + value.S + "]") +
(value.N == null ? "" : "N=[" + value.N + "]") +
(value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray())
+ "]") +
(value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray())
+ "]") +
(value.B == null ? "" : "B=[" + FromGzipMemoryStream(value.B) + "]")
);
}
Console.WriteLine("************************************************");
}
{
MemoryStream output = new MemoryStream();
using (GZipStream zipStream = new GZipStream(output, CompressionMode.Compress,
true))
using (StreamWriter writer = new StreamWriter(zipStream))
{
writer.Write(value);
}
return output;
}
Uso de consultas
Temas
Expresiones de condicin de clave (p. 425)
Expresiones de filtro para Query (p. 427)
Limitacin del nmero de elementos del conjunto de resultados (p. 428)
Paginacin de los resultados (p. 428)
Recuento de los elementos de los resultados (p. 430)
Unidades de capacidad que Query consume (p. 430)
Consistencia de lectura de Query (p. 431)
Consulta de tablas e ndices: Java (p. 431)
Consulta de tablas e ndices: .NET (p. 436)
La operacin Query busca elementos segn los valores de clave principal. Puede consultar cualquier tabla
o ndice secundario que cuenta con una clave principal compuesta (una clave de particin y una clave de
ordenacin).
Debe proporcionar el nombre del atributo de clave de particin y un nico valor para dicho atributo.Query
devolver todos los elementos que contengan ese valor de clave de particin. Si lo desea, puede
proporcionar un atributo de clave de ordenacin y utilizar un operador de comparacin para limitar los
resultados de bsqueda.
begins_with (a, substr): es true si el valor del atributo a comienza por una subcadena
determinada.
En los siguientes ejemplos de la AWS CLI se muestra el uso de expresiones de condicin de clave.
Tenga en cuenta que en estas expresiones se utilizan marcadores de posicin (tales como:name y
:sub) en lugar de los valores reales. Para obtener ms informacin, consulteNombres de atributos de
expresin (p. 356) y Valores de los atributos de expresin (p. 359).
Example
Consulta la tabla Thread para buscar un valor concreto de ForumName (clave de particin). La consulta
leer todos los elementos que tengan ese valor de ForumName, porque la clave de ordenacin (Subject)
no se incluye en KeyConditionExpression.
Example
Consulta la tabla Thread para buscar un valor concreto de ForumName (clave de particin), pero esta vez
devuelve solo los elementos que tienen un valor determinado de Subject (clave de ordenacin).
{
":name":{"S":"Amazon DynamoDB"},
":sub":{"S":"DynamoDB Thread 1"}
}
Example
Consulta la tabla Reply para buscar un valor concreto de Id (clave de particin), pero solo devuelve los
elementos cuyo valor de ReplyDateTime (clave de ordenacin) comienza por determinados caracteres.
--table-name Reply \
--key-condition-expression "Id = :id and begins_with(ReplyDateTime, :dt)" \
--expression-attribute-values file://values.json
{
":id":{"S":"Amazon DynamoDB#DynamoDB Thread 1"},
":dt":{"S":"2015-09"}
}
Puede utilizar cualquier nombre de atributo en una expresin de condicin de clave, siempre y cuando el
primer carcter sea a-z o A-Z y el segundo carcter (si lo hay) sea a-z, A-Z o 0-9. Adems, el nombre
de atributo no debe ser una palabra reservada de DynamoDB. Para obtener una lista completa de estas
palabras, consulte Palabras reservadas en DynamoDB (p. 815). Si un nombre de atributo no cumple
estos requisitos, deber definir un nombre de atributo de expresin como marcador de posicin. Para
obtener ms informacin, consulte Nombres de atributos de expresin (p. 356).
DynamoDB almacena cerca unos de otros y ordenados segn su clave de ordenacin aquellos
elementos que tienen un valor de clave de particin determinado. En una operacin Query, DynamoDB
recupera los elementos de forma ordenada y, a continuacin, los procesa mediante las expresiones
KeyConditionExpression y FilterExpression que estn presentes. Solo entonces devuelve los
resultados de Query al cliente.
Los resultados de Query siempre se ordenan segn el valor de la clave de ordenacin. Si el tipo de datos
de la clave de ordenacin es Number, los resultados se devuelven en orden numrico; de lo contrario,
los resultados se devuelven segn el orden de los bytes UTF-8. De forma predeterminada, el orden es
ascendente. Para invertirlo, establezca el parmetro ScanIndexForward en false.
En una sola operacin Query se puede recuperar un mximo de 1 MB de datos. Este lmite se aplica
antes de aplicar cualquier expresin FilterExpression a los resultados. Si LastEvaluatedKey
est presente en la respuesta y su valor no es null, deber paginar el conjunto de resultados (consulte
Paginacin de los resultados (p. 428)).
Una expresin de filtro se aplica despus de que la operacin Query haya finalizado, pero antes de
devolver los resultados. Por consiguiente, Query consume la misma cantidad de capacidad de lectura
aunque se especifique una expresin de filtro.
En una operacin Query se puede recuperar un mximo de 1 MB de datos. Este lmite se aplica antes de
evaluar la expresin de filtro.
Una expresin de filtro no puede contener atributos de clave de particin ni de clave de ordenacin. Esos
atributos se deben especificar en la expresin de condicin de clave, no en la expresin de filtro.
La sintaxis de una expresin de filtro es la misma que la de una expresin de condicin. Las expresiones
de filtro pueden utilizar los comparadores, funciones y operadores lgicos que las expresiones de
condicin. Para obtener ms informacin, Expresiones de condicin (p. 360).
Example
En el siguiente ejemplo de la AWS CLI, se consulta la tabla Thread para buscar un valor concreto de
ForumName (clave de particin) y Subject (clave de ordenacin). De los elementos encontrados, solo se
devuelven las conversaciones ms populares; es decir, solo aquellas que tienen un valor de Views mayor
que el nmero especificado.
{
":fn":{"S":"Amazon DynamoDB#DynamoDB Thread 1"},
":num":{"N":"3"}
}
Tenga en cuenta que Views es una palabra reservada en DynamoDB (consulte Palabras reservadas en
DynamoDB (p. 815)), por lo que en este ejemplo se utiliza #v como marcador de posicin. Para obtener
ms informacin, consulte Nombres de atributos de expresin (p. 356).
Note
Una expresin de filtro elimina los elementos del conjunto de resultados de Query. Si es posible,
evite usar Query cuando prevea que va a recuperar gran cantidad de elementos, pero que tendr
que descartar la mayora de ellos.
Por ejemplo, supongamos que utiliza la operacin Query en una tabla con un valor de Limit de 6 y sin
expresin de filtro. El resultado de Query contendr los seis primeros elementos de la tabla que coincidan
con la expresin de condicin de clave de la solicitud.
Ahora, supongamos que se agrega una expresin de filtro a Query. En este caso, DynamoDB aplicar
la expresin de filtro a los seis elementos que se hayan devuelto y descartar los que no coincidan. El
resultado de Query final contendr 6elementos o menos, segn el nmero de elementos que el filtro
elimine.
Una operacin Query nica devolver solamente un conjunto de resultados que se ajuste al lmite de
tamao de 1 MB. Para determinar si hay ms resultados y para recuperarlos de pgina en pgina, las
aplicaciones deben hacer lo siguiente:
Puede utilizar la AWS CLI para ver este comportamiento. La CLI enva solicitudes Query de bajo nivel
a DynamoDB una y otra vez hasta que LastEvaluatedKey ya no est presente en los resultados.
Considere el siguiente ejemplo de la AWS CLI que recupera ttulos de pelculas de un determinado ao:
El elemento LastEvaluatedKey de la respuesta indica que no se han recuperado todos los elementos.
La AWS CLI enviar entonces otra solicitud Query a DynamoDB. Este patrn de solicitud y respuesta
contina hasta la respuesta final:
Los SDK de AWS se encargan tambin de las respuestas de DynamoDB de bajo nivel (incluida la
presencia o ausencia de LastEvaluatedKey) y proporcionan varias abstracciones para paginar
los resultados de Query. Por ejemplo, la interfaz de documentos de SDK para Java proporciona
compatibilidad con java.util.Iterator para que pueda examinar los resultados de uno en
uno.
ScannedCount: nmero de elementos que coinciden con la expresin de condicin de clave antes de
aplicar una expresin de filtro (si la hay).
Count: nmero de elementos restantes despus de aplicar una expresin de filtro (si la hay).
Note
Si el tamao del conjunto de resultados de Query es mayor que 1 MB, entonces ScannedCount y Count
representarn nicamente un recuento parcial de los elementos totales. Deber llevar a cabo varias
operaciones Query para recuperar todos los resultados (consulte Paginacin de los resultados (p. 428)).
Cada respuesta de Query contendr los valores de ScannedCount y Count de los elementos que se
han procesado en esa solicitud Query concreta. Para obtener totales globales para todas las solicitudes
Query, puede llevar un recuento total de ScannedCount y Count.
De forma predeterminada, una operacin Query no devuelve datos sobre la cantidad de capacidad de
lectura que consume. Sin embargo, puede especificar el parmetro ReturnConsumedCapacity en
una solicitud Query para obtener esta informacin. A continuacin se muestran los ajustes vlidos de
ReturnConsumedCapacity:
DynamoDB calcula el nmero de unidades de capacidad de lectura consumidas segn el tamao de los
elementos y no segn la cantidad de datos que se devuelven a la aplicacin. Por este motivo, el nmero
de unidades de capacidad consumidas ser el mismo si se solicitan todos los atributos (el comportamiento
predeterminado) o solo algunos de ellos (mediante una expresin de proyeccin). El nmero tambin ser
el mismo tanto si se utiliza una expresin de filtro como si no.
A continuacin se indican los pasos que hay que seguir para recuperar un elemento mediante el API de
documentos del AWS SDK for Java.
La respuesta incluye un objeto ItemCollection que proporciona todos los elementos devueltos por la
consulta.
En el siguiente fragmento de cdigo Java se ponen en prctica las tareas anteriores. En el fragmento se
presupone que existe ya una tabla Reply en la que se almacenan las respuestas de las conversaciones del
foro. Para obtener ms informacin, consulte Creacin de tablas y carga de ejemplos de datos (p. 291).
Cada conversacin de un foro tiene un identificador nico y puede tener cero o ms respuestas. Por lo
tanto, el atributo Id de la tabla Reply consta del nombre del foro y del asunto del foro. La clave principal
compuesta de la tabla consta de Id (clave de particin) y ReplyDateTime (clave de ordenacin key).
La siguiente consulta recupera todas las respuestas del asunto de una conversacin concreta. La consulta
necesita el nombre de la tabla y el valor de Subject.
Example
.withKeyConditionExpression("Id = :v_id")
.withValueMap(new ValueMap()
.withString(":v_id", "Amazon DynamoDB#DynamoDB Thread 1"));
En el siguiente fragmento de cdigo Java se recuperan las respuestas de las conversaciones de un foro
publicadas en los ltimos 15das. En el fragmento se especifican parmetros mediante:
En este fragmento se utiliza un objeto QuerySpec que proporciona acceso a todos los parmetros de
entrada de bajo nivel de Query.
Example
Adems, si lo desea puede limitar el nmero de elementos por pgina con el mtodo withMaxPageSize.
Cuando se llama al mtodo query, se obtiene una ItemCollection que contiene los elementos
resultantes. A continuacin, puede recorrer los resultados paso a paso, procesando una pgina cada vez,
hasta que no queden ms pginas.
Example
spec.withMaxPageSize(10);
Example
En este ejemplo de cdigo Java, puede ejecutar variaciones de bsqueda de respuestas para la
conversacin "DynamoDB Thread 1" del foro "DynamoDB".
En las dos consultas anteriores se muestra cmo especificar condiciones de clave de ordenacin para
delimitar los resultados de la consulta y utilizar otros parmetros de consulta opcionales.
Note
En este ejemplo de cdigo, se presupone que los datos ya se han cargado en DynamoDB para
su cuenta siguiendo las instrucciones de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291).
Para obtener instrucciones paso a paso acerca de cmo ejecutar el ejemplo, consulte Ejemplos
de cdigo Java (p. 296).
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.Page;
import com.amazonaws.services.dynamodbv2.document.QueryOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
findRepliesForAThread(forumName, threadSubject);
findRepliesForAThreadSpecifyOptionalLimit(forumName, threadSubject);
findRepliesInLast15DaysWithConfig(forumName, threadSubject);
findRepliesPostedWithinTimePeriod(forumName, threadSubject);
findRepliesUsingAFilterExpression(forumName, threadSubject);
}
System.out.println("\nfindRepliesForAThread results:");
System.out.println("\nfindRepliesForAThreadSpecifyOptionalLimit results:");
System.out.println("\nfindRepliesInLast15DaysWithConfig results:");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
System.out.println("\nfindRepliesPostedWithinTimePeriod results:");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
System.out.println("\nfindRepliesUsingAFilterExpression results:");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
A continuacin se indican los pasos que hay que seguir para consultar una tabla mediante el API de bajo
nivel del SDK para .NET.
La respuesta incluye el objeto QueryResult que proporciona todos los elementos devueltos por la
consulta.
Example
Cada conversacin de un foro tiene un identificador nico y puede tener cero o ms respuestas. Por lo
tanto, la clave principal consta de la clave de particin (Id) y la clave de ordenacin (ReplyDateTime).
La siguiente consulta recupera todas las respuestas del asunto de una conversacin concreta. La consulta
necesita el nombre de la tabla y el valor de Subject.
Example
Una expresin KeyConditionExpression para recuperar solamente las respuestas de los ltimos
15das.
Un parmetro ProjectionExpression para especificar una lista de atributos que deben recuperarse
para los elementos presentes en el resultado de la consulta.
Un parmetro ConsistentRead para realizar una lectura de consistencia alta.
Example
Adems, si lo desea puede limitar el tamao de la pgina, es decir, el nmero de elementos por pgina,
agregando el parmetro opcional Limit. Cada vez que se ejecuta el mtodo Query, se obtiene una
pgina de resultados con el nmero de elementos especificado. Para recuperar la pgina siguiente, debe
volver a ejecutar el mtodo Query proporcionando el valor de clave principal del ltimo elemento de la
pgina anterior, para que el mtodo devuelva el siguiente conjunto de elementos. Esta informacin se
proporciona dentro de la solicitud estableciendo la propiedad ExclusiveStartKey. Inicialmente, esta
propiedad puede ser null. Para recuperar las pginas siguientes, debe actualizar el valor de esta propiedad
de modo que tome el valor de la clave principal del ltimo elemento de la pgina anterior.
Example
do
{
var request = new QueryRequest
{
TableName = "Reply",
KeyConditionExpression = "Id = :v_Id",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_Id", new AttributeValue { S = "Amazon DynamoDB#DynamoDB Thread 2" }}
},
// Optional parameters.
Limit = 1,
ExclusiveStartKey = lastKeyEvaluated
};
lastKeyEvaluated = response.LastEvaluatedKey;
Example
En este ejemplo de cdigo C#, puede ejecutar variaciones de la bsqueda de respuestas para la
conversacin "DynamoDB Thread 1" del foro "DynamoDB".
Esta funcin ilustra el uso de la paginacin para procesar resultados en varias pginas. Amazon
DynamoDB tiene un lmite de tamao de pgina. Si el resultado supera este tamao de pgina, solo se
obtiene la primera pgina de resultados. Este patrn de codificacin garantiza que el cdigo procese
todas las pginas del resultado de la consulta.
Buscar las respuestas de los ltimos 15das.
Buscar las respuestas de un intervalo de fechas determinado.
En las dos consultas anteriores se muestra cmo especificar condiciones de clave de ordenacin para
delimitar los resultados de la consulta y utilizar otros parmetros de consulta opcionales.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.Util;
namespace com.amazonaws.codesamples
{
class LowLevelQuery
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
FindRepliesForAThread(forumName, threadSubject);
FindRepliesForAThreadSpecifyOptionalLimit(forumName, threadSubject);
FindRepliesInLast15DaysWithConfig(forumName, threadSubject);
FindRepliesPostedWithinTimePeriod(forumName, threadSubject);
PrintItem(item);
}
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
// Optional parameter.
ProjectionExpression = "Id, ReplyDateTime, PostedBy",
// Optional parameter.
ConsistentRead = true
};
Console.ReadLine();
}
Console.WriteLine(
Una operacin de examen (Scan) lee todos los elementos de una tabla o de un ndice secundario. De
manera predeterminada, una operacin Scan devuelve todos los atributos de datos de todos los elementos
de la tabla o el ndice. Puede utilizar el parmetro ProjectionExpression para que Scan solo devuelva
algunos de los atributos, en lugar de todos ellos.
Una nica solicitud Scan puede recuperar un mximo de 1 MB de datos;. Si lo desea, DynamoDB puede
aplicar una expresin de filtro a estos datos, para reducir los resultados antes de que se devuelvan al
usuario.
Una expresin de filtro se aplica despus de que la operacin Scan haya finalizado, pero antes de
devolver los resultados. Por consiguiente, Scan consume la misma cantidad de capacidad de lectura
aunque se especifique una expresin de filtro.
En una operacin Scan se puede recuperar un mximo de 1 MB de datos. Este lmite se aplica antes de
evaluar la expresin de filtro.
Con Scan, puede especificar cualquier atributo en una expresin de filtro, incluidos los atributos de clave
de particin y de clave de ordenacin.
La sintaxis de una expresin de filtro es la misma que la de una expresin de condicin. Las expresiones
de filtro pueden utilizar los comparadores, funciones y operadores lgicos que las expresiones de
condicin. Para obtener ms informacin, Expresiones de condicin (p. 360).
Example
En el siguiente ejemplo de la AWS CLI se examina la tabla Thread y solo se devuelven los ltimos
elementos publicados por un usuario determinado.
Por ejemplo, supongamos que utiliza la operacin Scan en una tabla con un valor de Limit de 6 y sin
expresin de filtro. El resultado de Scan contendr los seis primeros elementos de la tabla que coincidan
con la expresin de condicin de clave de la solicitud.
Ahora, supongamos que se agrega una expresin de filtro a Scan. En este caso, DynamoDB aplicar
la expresin de filtro a los seis elementos que se hayan devuelto y descartar los que no coincidan. El
resultado de Scan final contendr 6elementos o menos, segn el nmero de elementos que el filtro
elimine.
Una operacin Scan nica devolver solamente un conjunto de resultados que se ajuste al lmite de
tamao de 1 MB. Para determinar si hay ms resultados y para recuperarlos de pgina en pgina, las
aplicaciones deben hacer lo siguiente:
Puede utilizar la AWS CLI para ver este comportamiento. La CLI enva solicitudes Scan de bajo nivel
a DynamoDB una y otra vez hasta que LastEvaluatedKey ya no est presente en los resultados.
Considere el siguiente ejemplo de la AWS CLI que examina toda la tabla Movies, pero solo devuelve las
pelculas de un determinado gnero:
El elemento LastEvaluatedKey de la respuesta indica que no se han recuperado todos los elementos.
La AWS CLI enviar entonces otra solicitud Scan a DynamoDB. Este patrn de solicitud y respuesta
contina hasta la respuesta final:
Los SDK de AWS se encargan tambin de las respuestas de DynamoDB de bajo nivel (incluida la
presencia o ausencia de LastEvaluatedKey) y proporcionan varias abstracciones para paginar
los resultados de Scan. Por ejemplo, la interfaz de documentos de SDK para Java proporciona
compatibilidad con java.util.Iterator para que pueda examinar los resultados de uno en
uno.
Para ver ejemplos de cdigo en diversos lenguajes de programacin, consulte la Gua de
introduccin a Amazon DynamoDB y la documentacin del SDK de AWS correspondiente a su
lenguaje.
ScannedCount: nmero de elementos que coinciden con la expresin de condicin de clave antes de
aplicar una expresin de filtro (si la hay).
Count: nmero de elementos restantes despus de aplicar una expresin de filtro (si la hay).
Note
Si el tamao del conjunto de resultados de Scan es mayor que 1 MB, entonces ScannedCount y Count
representarn nicamente un recuento parcial de los elementos totales. Deber llevar a cabo varias
operaciones Scan para recuperar todos los resultados (consulte Paginacin de los resultados (p. 444)).
Cada respuesta de Scan contendr los valores de ScannedCount y Count de los elementos que se han
procesado en esa solicitud Scan concreta. Para obtener totales globales para todas las solicitudes Scan,
puede llevar un recuento total de ScannedCount y Count.
De forma predeterminada, una operacin Scan no devuelve datos sobre la cantidad de capacidad de
lectura que consume. Sin embargo, puede especificar el parmetro ReturnConsumedCapacity en
una solicitud Scan para obtener esta informacin. A continuacin se muestran los ajustes vlidos de
ReturnConsumedCapacity:
DynamoDB calcula el nmero de unidades de capacidad de lectura consumidas segn el tamao de los
elementos y no segn la cantidad de datos que se devuelven a la aplicacin. Por este motivo, el nmero
de unidades de capacidad consumidas ser el mismo si se solicitan todos los atributos (el comportamiento
predeterminado) o solo algunos de ellos (mediante una expresin de proyeccin). El nmero tambin ser
el mismo tanto si se utiliza una expresin de filtro como si no.
Si requiere lecturas de consistencia alta desde el momento en que se inicie la operacin Scan, establezca
el parmetro ConsistentRead en true en la solicitud Scan. De este modo, se asegurar de que todas
las operaciones de escritura que se han completado antes de iniciar Scan se incluyan en la respuesta de
Scan.
Establecer ConsistentRead en true puede resultar til para realizar backups o replicaciones de tablas,
combinado con Flujos de DynamoDB. En primer lugar, se utiliza Scan con ConsistentRead establecido
en true para obtener una copia consistente de los datos de la tabla. Durante la operacin Scan, Flujos
de DynamoDB registra la actividad de escritura adicional que se produce en la tabla. Una vez que la
operacin Scan ha finalizado, puede aplicar la actividad de escritura de la secuencia a la tabla.
Note
Tenga en cuenta que una operacin Scan con ConsistentRead establecido en true consumir
el doble de unidades de capacidad de lectura que si ConsistentRead se deja establecido en su
valor predeterminado (false).
Examen en paralelo
De forma predeterminada, la operacin Scan procesa los datos secuencialmente. DynamoDB devuelve los
datos a la aplicacin en incrementos de 1 MB y una aplicacin lleva a cabo operaciones Scan adicionales
para recuperar la siguiente franja de 1 MB de datos.
Cuanto mayor es la tabla o el ndice que se examina, ms tiempo tarda Scan en completarse. Adems,
puede que una operacin Scan secuencial no consiga siempre utilizar plenamente la capacidad de
desempeo de lectura provisionada. Esto se debe a que, aunque DynamoDB distribuye los datos de las
tablas grandes entre varias particiones fsicas, una operacin Scan solo puede leer una particin a la vez.
Por este motivo, el desempeo de una operacin Scan se ve restringido por el desempeo mximo de
cada particin individual.
Para abordar estos problemas, la operacin Scan puede dividir una tabla o un ndice secundario
lgicamente en varios segmentos, de tal forma que varios procesos de trabajo de la aplicacin puedan
examinarlos en paralelo. Cada proceso de trabajo puede ser un subproceso (en los lenguajes de
programacin que admiten la ejecucin de mltiples subprocesos) o un proceso del sistema operativo.
Para llevar a cabo un examen en paralelo, cada proceso de trabajo emite su propia solicitud Scan con los
siguientes parmetros:
Segment segmento que un proceso de trabajo concreto examinar. Cada proceso de trabajo debe
utilizar un valor diferente de Segment.
TotalSegments nmero total de segmentos del examen en paralelo. Este valor debe ser el mismo
que el nmero de procesos de trabajo que la aplicacin va a utilizar.
En el siguiente diagrama se muestra cmo una aplicacin de ejecucin multiproceso realiza una operacin
Scan en paralelo con tres grados de paralelismo:
En este diagrama, la aplicacin crea tres subprocesos y asigna un nmero a cada uno de ellos. Los
segmentos parten de cero, de modo que el primer nmero siempre es 0. Cada subproceso emite una
solicitud Scan y establece el valor de Segment en el nmero designado y el valor de TotalSegments,
en 3. Cada subproceso examina su segmento designado, recupera datos en franjas de 1 MB a la vez y
devuelve los datos al subproceso principal de la aplicacin.
Los valores de Segment y TotalSegments se aplican a las solicitudes Scan individuales; puede utilizar
valores diferentes en cualquier momento. Es posible que tenga que experimentar con estos valores y con
el nmero de procesos de trabajo utilizados hasta lograr el desempeo ptimo de la aplicacin.
Note
Un examen en paralelo con un gran nmero de procesos de trabajo puede consumir fcilmente
todo el desempeo provisionado de la tabla o el ndice que se examina. Es preferible evitar este
tipo de exmenes si la tabla o el ndice tambin llevan a cabo una intensa actividad de lectura o
escritura de otras aplicaciones.
Para controlar la cantidad de datos devueltos por cada solicitud, utilice el parmetro Limit. Esto
puede ayudar a evitar situaciones en las que un proceso de trabajo consume todo el desempeo
provisionado a costa de todos los dems procesos de trabajo.
A continuacin se indican los pasos que hay que seguir para examinar una tabla con el API de documentos
del AWS SDK for Java.
En la siguiente tabla Reply se almacenan las respuestas de las conversaciones del foro.
Example
En la tabla se mantienen todas las respuestas de varias conversaciones del foro. Por lo tanto, la clave
principal consta de la clave de particin (Id) y la clave de ordenacin (ReplyDateTime). En el siguiente
fragmento de cdigo Java se examina toda la tabla. La instancia de ScanRequest especifica el nombre de
la tabla que debe examinarse.
Example
En el siguiente fragmento de cdigo Java se examina la tabla ProductCatalog para buscar elementos cuyo
precio es menor que 0. En el fragmento se especifican los parmetros opcionales siguientes:
Una expresin de filtro para recuperar tan solo aquellos elementos cuyo precio sea menor que 0
(condicin de error).
Una lista de atributos que deben recuperarse para los elementos que aparezcan en los resultados de la
consulta.
Example
Adems, si lo desea puede limitar el tamao de la pgina, es decir, el nmero de elementos por pgina,
con el mtodo withLimit de la solicitud de examen. Cada vez que se ejecuta el mtodo scan, se obtiene
una pgina de resultados con el nmero de elementos especificado. Para recuperar la pgina siguiente,
debe volver a ejecutar el mtodo scan proporcionando el valor de clave principal del ltimo elemento de la
pgina anterior, para que el mtodo scan devuelva el siguiente conjunto de elementos. Esta informacin
se proporciona dentro de la solicitud con el mtodo withExclusiveStartKey. Inicialmente, el parmetro
de este mtodo puede ser null. Para recuperar las pginas siguientes, debe actualizar el valor de esta
propiedad de modo que tome el valor de la clave principal del ltimo elemento de la pgina anterior.
Example
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
findProductsForPriceLessThanZero();
}
System.out.println("Scan of " + tableName + " for items with a price less than
100.");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
Adems, SDK para Java proporciona un modelo de persistencia de objetos, que permite
mapear las clases del lado del cliente a las tablas de DynamoDB. Este enfoque puede reducir
la cantidad de cdigo que hay que escribir. Para obtener ms informacin, consulte Java:
DynamoDBMapper (p. 202).
Note
En este ejemplo de cdigo, se presupone que los datos ya se han cargado en DynamoDB para
su cuenta siguiendo las instrucciones de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291).
Para obtener instrucciones paso a paso acerca de cmo ejecutar el ejemplo, consulte Ejemplos
de cdigo Java (p. 296).
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.ScanSpec;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
}
catch (AmazonServiceException ase) {
System.err.println(ase.getMessage());
}
}
shutDownExecutorService(executor);
}
@Override
public void run() {
System.out.println("Scanning " + tableName + " segment " + segment + " out of "
+ totalSegments
+ " segments " + itemLimit + " items at a time...");
int totalScannedItemCount = 0;
try {
ScanSpec spec = new
ScanSpec().withMaxResultSize(itemLimit).withTotalSegments(totalSegments)
.withSegment(segment);
}
catch (Exception e) {
System.err.println(e.getMessage());
}
finally {
System.out.println("Scanned " + totalScannedItemCount + " items from
segment " + segment + " out of "
+ totalSegments + " of " + tableName);
}
}
}
try {
System.out.println("Processing record #" + productIndex);
}
catch (Exception e) {
System.err.println("Failed to create item " + productIndex + " in " +
tableName);
System.err.println(e.getMessage());
}
}
}
catch (Exception e) {
System.err.println("Failed to delete table " + tableName);
e.printStackTrace(System.err);
}
}
try {
System.out.println("Creating table " + tableName);
// key
if (sortKeyName != null) {
keySchema.add(new
KeySchemaElement().withAttributeName(sortKeyName).withKeyType(KeyType.RANGE)); // Sort
// key
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName(sortKeyName).withAttributeType(sortKeyType));
}
.withReadCapacityUnits(readCapacityUnits).withWriteCapacityUnits(writeCapacityUnits));
System.out.println("Waiting for " + tableName + " to be created...this may take
a while...");
table.waitForActive();
}
catch (Exception e) {
System.err.println("Failed to create table " + tableName);
e.printStackTrace(System.err);
}
}
executor.shutdownNow();
A continuacin se indican los pasos que hay que seguir para examinar una tabla mediante el API de bajo
nivel del AWS SDK para .NET.
En la siguiente tabla Reply se almacenan las respuestas de las conversaciones del foro.
Example
En la tabla se mantienen todas las respuestas de varias conversaciones del foro. Por lo tanto, la clave
principal consta de la clave de particin (Id) y la clave de ordenacin (ReplyDateTime). En el siguiente
fragmento de cdigo C# se examina toda la tabla. La instancia de ScanRequest especifica el nombre de
la tabla que debe examinarse.
Example
como un nombre de atributo respecto al que debe evaluarse esa condicin. Para obtener ms informacin,
consulte Scan.
En el siguiente cdigo C# se examina la tabla ProductCatalog para buscar elementos cuyo precio es
menor que 0. En el ejemplo se especifican los parmetros opcionales siguientes:
Un parmetro FilterExpression para recuperar tan solo aquellos elementos cuyo precio sea menor
que 0 (condicin de error).
Un parmetro ProjectionExpression para especificar los atributos que deben recuperarse para los
elementos que aparezcan en los resultados de la consulta.
En el siguiente fragmento de cdigo C# se examina la tabla ProductCatalog para buscar todos los
elementos cuyo precio es menor que 0.
Example
Adems, si lo desea puede limitar el tamao de la pgina, es decir, el nmero de elementos por pgina,
agregando el parmetro opcional Limit. Cada vez que se ejecuta el mtodo Scan, se obtiene una pgina
de resultados con el nmero de elementos especificado. Para recuperar la pgina siguiente, debe volver
a ejecutar el mtodo Scan proporcionando el valor de clave principal del ltimo elemento de la pgina
anterior, para que el mtodo Scan devuelva el siguiente conjunto de elementos. Esta informacin se
proporciona dentro de la solicitud estableciendo la propiedad ExclusiveStartKey. Inicialmente, esta
propiedad puede ser null. Para recuperar las pginas siguientes, debe actualizar el valor de esta propiedad
de modo que tome el valor de la clave principal del ltimo elemento de la pgina anterior.
Example
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class LowLevelScan
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
in response.Items)
{
Console.WriteLine("\nScanThreadTableUsePaging - printing.....");
PrintItem(item);
}
lastKeyEvaluated = response.LastEvaluatedKey;
} while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);
Console.WriteLine(
attributeName + " " +
(value.S == null ? "" : "S=[" + value.S + "]") +
(value.N == null ? "" : "N=[" + value.N + "]") +
(value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray())
+ "]") +
(value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray())
+ "]")
);
}
Console.WriteLine("************************************************");
}
}
}
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
namespace com.amazonaws.codesamples
{
class LowLevelParallelScan
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
private static string tableName = "ProductCatalog";
private static int exampleItemCount = 100;
private static int scanItemLimit = 10;
private static int totalSegments = 5;
tasks[segment] = task;
}
}
} while (lastEvaluatedKey.Count != 0);
},
KeySchema = new List<KeySchemaElement>
{
new KeySchemaElement
{
AttributeName = "Id",
KeyType = "HASH" //Partition key
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 5,
WriteCapacityUnits = 6
},
TableName = tableName
};
WaitUntilTableReady(tableName);
}
TableName = tableName
});
Amazon DynamoDB proporciona un acceso rpido a los elementos de una tabla especificando sus valores
de clave principal. Sin embargo, muchas aplicaciones podran beneficiarse de disponer de una o varias
claves secundarias (o alternativas) para permitir un acceso eficiente a datos con otros atributos aparte de
la clave principal. Para responder a esta necesidad, puede crear uno o varios ndices secundarios en una
tabla y emitir solicitudes Query o Scan para estos ndices.
Un ndice secundario es una estructura de datos que contiene un subconjunto de atributos de una tabla,
adems de una clave alternativa para admitir las operaciones Query. Puede recuperar datos del ndice
usando una operacin Query prcticamente de la misma forma que Query se usa en una tabla. Una tabla
puede tener varios ndices secundarios, lo que permite a las aplicaciones obtener acceso a diferentes
patrones de consulta.
Note
Tambin se pueden utilizar operaciones Scan en los ndices, de un modo bastante similar a como
Scan se usara en una tabla.
Cada ndice secundario est asociado exactamente con una tabla de la que obtiene sus datos. Esta
se denomina tabla base del ndice. Al crear un ndice, se define una clave alternativa para l (clave de
particin y clave de ordenacin). Tambin se definen los atributos de la tabla base que se desea proyectar,
o copiar, en el ndice. DynamoDB copia estos atributos en el ndice, junto con los atributos de clave
principal de la tabla base. A partir de ese momento, puede consultar o examinar el ndice exactamente
igual que una tabla.
DynamoDB mantiene automticamente todos los ndices secundarios. Cuando se agregan, modifican o
eliminan elementos en la tabla base, los ndices basados en esa tabla se actualizan tambin para reflejar
estos cambios.
Global secondary index: ndice con una clave de particin y una clave de ordenacin que pueden diferir
de las claves de la tabla base. Un ndices secundario global se considera "global" porque las consultas
del ndice pueden abarcar todos los datos de la tabla base para todas las particiones.
ndice secundario local: ndice que tiene la misma clave de particin que la tabla base, pero una clave
de ordenacin distinta. Un local secondary index es "local" en el sentido de que el mbito de todas sus
particiones corresponde a una particin de tabla base que tiene el mismo valor de clave de particin.
Debe tener en cuenta los requisitos de la aplicacin al determinar qu tipo de ndice va a utilizar. En
la tabla siguiente se muestran las principales diferencias entre un ndices secundario global y un local
secondary index:
Operaciones online con ndices Los ndices secundarios Los ndices secundarios locales
globales se pueden crear a se crean a la vez que se crea la
Si desea crear ms de una tabla con ndices secundarios, debe hacerlo de forma secuencial. Por ejemplo,
tendra que crear la primera tabla y esperar a que su estado fuese ACTIVE, luego la siguiente tabla y
esperar a que adquiriese el estado ACTIVE, y as sucesivamente. Si intenta crear simultneamente ms de
una tabla con un ndice secundario, DynamoDB devolver una excepcin LimitExceededException.
El tipo de ndice que se va a crear, que puede ser un ndices secundario global o un local secondary
index.
El nombre del ndice. Las reglas de nomenclatura de los ndices son las mismas que para las tablas,
como se indica en Lmites en DynamoDB (p. 765). El nombre debe ser nico para la tabla base al que
est asociado, pero puede utilizar el mismo nombre para ndices que estn asociados a tablas base
distintas.
El esquema de claves del ndice. Cada atributo del esquema de claves del ndice debe ser un atributo
de nivel superior debe de tipo String, Number o Binary. No se permiten otros tipos de datos, como los
documentos y los conjuntos. Los dems requisitos del esquema de claves dependen del tipo de ndice:
Si se trata de un ndices secundario global, la clave de particin puede ser cualquier atributo escalar
de la tabla base. La clave de ordenacin es opcional y tambin puede ser cualquier atributo escalar de
la tabla base.
Si se trata de un local secondary index, la clave de particin debe ser igual que la tabla de particin de
la tabla base y la clave de ordenacin debe ser un atributo sin clave de la tabla base.
Los atributos adicionales, si los hay, de la tabla base que se proyectarn en el ndice. Estos atributos
se agregan a los atributos de clave de la tabla, que se proyectan de forma automtica en cada ndice.
Puede proyectar atributos de cualquier tipo de datos, incluidos escalares, documentos y conjuntos.
Los ajustes de desempeo provisionado del ndice, si es preciso:
Para un ndices secundario global, debe especificar los ajustes de unidades de capacidad de lectura
y escritura. Estos ajustes de desempeo provisionado son independientes de los ajustes de la tabla
base.
Para un local secondary index, no es preciso especificar los ajustes de unidades de capacidad de
lectura y escritura. Todas las operaciones de lectura y escritura en un local secondary index consumen
el desempeo provisionado configurado para su tabla base.
Para disfrutar de la mxima flexibilidad en las consultas, puede crear hasta 5 ndices secundarios globales
y 5 ndices secundarios locales por tabla.
Para obtener un listado detallado de los ndices secundarios de una tabla, utilice la operacin
DescribeTable. DescribeTable devolver el nombre, el tamao de almacenamiento y el recuento
de elementos de cada ndice secundario de la tabla. Estos valores no se actualizan en tiempo real, sino
aproximadamente cada seis horas.
Para obtener acceso a los datos de un ndice secundario, utilice las operaciones Query o Scan. Debe
especificar el nombre de la tabla base y el nombre del ndice que se desea utilizar, los atributos que se
devolvern en los resultados y las expresiones de condicin o filtros que se van a aplicar. DynamoDB
puede devolver los resultados en orden ascendente o descendente.
Al eliminar una tabla, todos los ndices asociados a ella se eliminan tambin.
Para ver las prcticas recomendadas, consulte Prcticas recomendadas para los ndices secundarios
locales (p. 713) y Prcticas recomendadas para los ndices secundarios globales (p. 715).
Algunas aplicaciones pueden necesitar llevar a cabo muy diversos tipos de consultas en las que se usen
distintos atributos como criterios de consulta. Para responder a estos requisitos, puede crear un ndices
secundario global o varios y emitir solicitudes Query en ellos. Por poner un ejemplo, tomemos una tabla
denominada GameScores que realiza el seguimiento de los usuarios y las puntuaciones de una aplicacin
de juegos para mviles. Cada elemento GameScores se identifica mediante una clave de particin (UserId)
y una clave de ordenacin (GameTitle). En el siguiente diagrama se muestra cmo se organizaran los
elementos de la tabla. No se muestran todos los atributos.
Ahora, supongamos que desea escribir una aplicacin de clasificacin para mostrar las puntuaciones
mximas de cada juego. Una consulta que especifique los atributos de clave (UserId y GameTitle) sera
muy eficiente. Sin embargo, si la aplicacin tuviese que recuperar datos de GameScores solo segn
GameTitle, tendra que usar una operacin Scan. A medida que se agregan elementos a la tabla, los
exmenes de todos los datos resultaran lentos e ineficientes. En consecuencia, resultara difcil responder
a preguntas como estas:
Para agilizar las consultas de atributos sin clave, puede crear un ndices secundario global. Un ndices
secundario global contiene una seleccin de atributos de la tabla base, pero estn organizados por una
clave principal distinta de la clave principal de la tabla. La clave de ndice no requiere disponer de ninguno
de los atributos de clave de la tabla; ni siquiera del mismo esquema de claves que una tabla.
Por ejemplo, podemos se podra un ndices secundario global denominado GameTitleIndex con la clave
de particin GameTitle y la clave de ordenacin TopScore. Puesto que los atributos de clave principal de
la tabla base siempre se proyectan en un ndice, el atributo UserId tambin est presente. En el siguiente
diagrama se muestra el aspecto que tendra el ndice GameTitleIndex:
Ahora, puede consultar GameTitleIndex y obtener fcilmente las puntuaciones de Meteor Blasters. Los
resultados se ordenan segn los valores de la clave de ordenacin, TopScore. Si establece el parmetro
ScanIndexForward en false, los resultados se devuelven en orden descendente, de modo que la
puntuacin mxima se devuelve en primer lugar.
Cada ndices secundario global debe tener una clave de particin y puede tener una clave de ordenacin
opcional. El esquema de claves de ndice puede ser distinto del de la tabla base; la tabla podra tener una
clave principal simple (clave de particin) y, en cambio, se podra crear un ndices secundario global con
una clave principal compuesta (clave de particin y clave de ordenacin), o viceversa. Los atributos de
clave del ndice pueden constar de cualquier atributo de nivel superior de tipo String, Number o Binary de
la tabla base; no se admiten otros tipos de escalares ni documentos o conjuntos.
Puede proyectar otros atributos de la tabla base en el ndice si lo desea. Cuando se consulta el ndice,
DynamoDB puede recuperar los atributos proyectados de forma eficiente; sin embargo, las consultas
del ndices secundario global no permiten recuperar atributos de la tabla base. Por ejemplo, si consulta
GameTitleIndex como se muestra en el diagrama anterior, la consulta no podra obtener acceso a ningn
atributo sin clave excepto a TopScore, aunque los atributos de clave GameTitle y UserId se proyectaran
automticamente.
En una tabla de DynamoDB, cada valor de clave debe ser nico. Sin embargo, no es obligatorio que los
valores de clave de un ndices secundario global sean nicos. A modo de ejemplo, supongamos que
un juego denominado Comet Quest es especialmente difcil, de tal forma que muchos usuarios nuevos
intentan lograr una puntuacin superior a cero, sin conseguirlo. A continuacin se muestran algunos datos
que podramos usar para representar esta situacin:
Cuando estos datos se agregan a la tabla GameScores, DynamoDB los propagar a GameTitleIndex. Si,
a continuacin, consultamos el ndice con el valor Comet Quest en GameTitle y el valor 0 en TopScore, se
devolvern los valores siguientes:
Solo aparecern en la respuesta los elementos que tengan los valores de clave especificados; dentro de
ese conjunto de datos, los elementos no aparecen en ningn orden concreto.
Un ndices secundario global solo realiza el seguimiento de los elementos de datos cuyos atributos de
clave existen realmente. Por ejemplo, supongamos que ha agregado otro elemento nuevo a la tabla
GameScores, pero que solo ha proporcionado los atributos de clave principal obligatorios:
UserId GameTitle
Una consulta parecida de GameTitleIndex devolvera tres elementos, en lugar de cuatro. Esto se debe a
que el elemento cuyo valor de TopScore no existe no se propaga al ndice:
Proyecciones de atributos
Una proyeccin es un conjunto de atributos de una tabla que se copia en un ndice secundario. La clave
de particin y la clave de ordenacin de la tabla siempre se proyectan en el ndice. Tambin se pueden
proyectar otros atributos que sean compatibles con los requisitos de consulta de la aplicacin. Cuando
consulte un ndice, Amazon DynamoDB podr obtener acceso a cualquier atributo de la proyeccin si
dichos atributos estuvieran en una tabla de la proyeccin.
Si crea un ndice secundario, tendr que especificar los atributos que se proyectarn en el ndice.
DynamoDB cuenta con tres opciones diferentes para esto:
KEYS_ONLY: cada elemento del ndice se compone nicamente de los valores de la clave de particin
y la clave de ordenacin de la tabla, as como los valores de la clave del ndice. La opcin KEYS_ONLY
genera el ndice secundario ms pequeo posible.
INCLUDE: adems de los atributos que se describen en KEYS_ONLY, el ndice secundario incluir los
atributos que no son de clave que se especifiquen.
ALL: el ndice secundario incluye todos los atributos de la tabla de origen. Como todos los datos de la
tabla se duplican en el ndice, las proyecciones ALL generan el ndice secundario ms grande posible.
En el diagrama anterior, GameTitleIndex no tiene atributos proyectados adicionales. Una aplicacin puede
utilizar GameTitle y TopScore en las consultas; sin embargo, no es posible determinar de manera eficiente
qu usuario tiene la mxima puntuacin en un juego en concreto, ni la mayor proporcin de partidas
ganadas respecto a las perdidas. La forma ms eficiente de consultar estos datos sera proyectar estos
atributos de la tabla base en el ndices secundario global, tal y como se muestra en este diagrama:
Dado que los atributos sin clave Wins y Losses se proyectan en el ndice, una aplicacin puede
determinar la proporcin de partidas ganadas respecto a las perdidas en cualquier juego, o para cualquier
combinacin de juego e identificador de usuario.
Cuando elija los atributos para proyectarlos en un ndices secundario global, debe estudiar el equilibrio
entre los costos de desempeo provisionado y de almacenamiento:
Si solo necesita obtener acceso a algunos atributos con la menor latencia posible, puede ser
conveniente proyectar solamente esos atributos en un ndices secundario global. Cuando menor es el
ndice, menos costar almacenarlo e inferiores sern los costos de escritura.
Si la aplicacin va a obtener acceso con frecuencia a determinados atributos sin clave, puede ser
interesante proyectarlos en un ndices secundario global. Los costos del almacenamiento adicionales del
ndices secundario global compensarn el costo que supondran los frecuentes exmenes de la tabla.
Si tiene que obtener acceso a la mayora de los atributos sin clave con frecuencia, puede proyectar estos
atributos o, incluso, toda la tabla base, en un ndices secundario global. De este modo, dispondr de la
mxima flexibilidad. Sin embargo, el costo del almacenamiento aumentara y podra llegar a duplicarse.
Si la aplicacin tiene que consultar una tabla con poca frecuencia, pero tiene que realizar gran cantidad
de escrituras o actualizaciones en los datos de la tabla, puede ser conveniente proyectar KEYS_ONLY.
El ndices secundario global tendr el tamao mnimo, pero estara disponible siempre que se requiriese
para actividades de consulta.
utilizar, los atributos que se devolvern en los resultados de la consulta y las condiciones de consulta que
se van a aplicar. DynamoDB puede devolver los resultados en orden ascendente o descendente.
Tomemos los datos siguientes devueltos por una operacin Query que solicita datos de juegos para una
aplicacin de clasificacin de juegos:
{
"TableName": "GameScores",
"IndexName": "GameTitleIndex",
"KeyConditionExpression": "GameTitle = :v_title",
"ExpressionAttributeValues": {
":v_title": {"S": "Meteor Blasters"}
},
"ProjectionExpression": "UserId, TopScore",
"ScanIndexForward": false
}
En esta consulta:
DynamoDB obtiene acceso GameTitleIndex; utiliza la clave de particin GameTitle para localizar los
elementos de ndice correspondientes a Meteor Blasters. Todos los elementos de ndice que tienen esta
clave se almacenan en posiciones adyacentes, para agilizar su recuperacin.
En este juego, DynamoDB utiliza el ndice para obtener acceso a todos los identificadores de los
usuarios y a las puntuaciones mximas de este juego.
Los resultados se devuelven ordenados por orden descendente, porque el parmetro
ScanIndexForward se ha establecido en false.
Al crear un ndices secundario global, debe especificar uno o varios atributos de clave de ndice y sus
tipos de datos. Esto significa que, cada vez que se escribe un elemento en la tabla base, los tipos de
datos de esos atributos deben coincidir con los tipos de datos del esquema de claves de ndice. En el caso
de GameTitleIndex, el tipo de datos de la clave de particin GameTitle del ndice es String y la clave de
ordenacin TopScore del ndice es de tipo Number. Si intenta agregar un elemento a la tabla GameScores,
pero especifica un tipo de datos distinto para GameTitle o TopScore, DynamoDB devolver una excepcin
ValidationException, porque los tipos de datos no coinciden.
Al colocar o eliminar elementos en una tabla, sus ndices secundarios globales se actualizan de forma
consistente final. En condiciones normales, los cambios en los datos de la tabla se propagan a los ndices
secundarios globales casi al instante. No obstante, en algunos escenarios de error improbables, pueden
producirse retardos de propagacin ms prolongados. Debido a ello, las aplicaciones deben prever y
controlar las situaciones en las que una consulta de un ndices secundario global devuelva resultados que
no se encuentren actualizados.
Si escribe un elemento en una tabla, no tiene que especificar los atributos de ninguna clave de ordenacin
del ndices secundario global. Si utilizamos GameTitleIndex a modo de ejemplo, no sera preciso
especificar un valor para el atributo TopScore para poder escribir un nuevo elemento en la tabla
GameScores, ya que, en este caso, Amazon DynamoDB no escribe ningn dato en el ndice para este
elemento concreto.
Una tabla con muchos ndices secundarios globales devengar costos ms elevados por la actividad de
escritura que las tablas con menos ndices. Para obtener ms informacin, consulte Consideraciones sobre
el desempeo provisionado para los ndices secundarios globales (p. 472).
Por ejemplo, si realiza una operacin Query en un ndices secundario global y supera su capacidad de
lectura provisionada, la solicitud se someter a una limitacin controlada. Si realiza una intensa actividad
de escritura en la tabla, pero un ndices secundario global de esa tabla no tiene suficiente capacidad de
escritura, entonces la actividad de escritura de la tabla se someter a una limitacin controlada.
Para ver los ajustes de desempeo provisionado de un ndices secundario global, utilice la operacin
DescribeTable, que devuelve informacin detallada sobre todos los ndices secundarios globales de la
tabla.
Para las consultas en un ndices secundario global, DynamoDB calcula la actividad de lectura provisionada
de la misma forma que para las consultas en una tabla. La nica diferencia es que el clculo se basa
en el tamao de las entradas del ndice, no en el tamao del elemento en la tabla base. El nmero de
unidades de capacidad de lectura es la suma de todos los tamaos de los atributos proyectados para
todos los elementos devueltos; el resultado se redondea al mltiplo de 4 KB inmediatamente superior.
Para obtener ms informacin sobre cmo calcula DynamoDB el consumo del desempeo provisionado,
consulte Ajustes de desempeo de lecturas y escrituras (p. 305).
El tamao mximo de los resultados devueltos por una operacin Query es de 1 MB. Esta cifra incluye los
tamaos de todos los nombres y valores de los atributos de todos los elementos devueltos.
Por ejemplo, tomemos un ndices secundario global en el que cada elemento contiene 2000bytes
de datos. Ahora, supongamos que se utiliza una operacin Query en este ndice y que la consulta
devuelve 8elementos. El tamao total de los elementos coincidentes es de 2000bytes 8elementos
= 16000bytes; este valor se redondea al mltiplo de 4 KB inmediatamente superior. Puesto que las
consultas en un ndices secundario global presentan consistencia final, el costo total es de 0,5 (16KB/4
KB), lo que equivale a 2unidades de capacidad de lectura.
Para que una escritura en una tabla se lleve a cabo correctamente, la capacidad de desempeo
provisionada definida para la tabla y todos sus ndices secundarios globales debe ser suficiente para
admitir esa escritura; de lo contrario, la escritura en la tabla se someter a una limitacin controlada.
Si escribe un nuevo elemento en la tabla que define un atributo indexado o actualiza un elemento
existente para definir un atributo indexado no definido previamente, se requiere una operacin de
escritura para colocar el elemento en el ndice.
Si al actualizar la tabla se cambia el valor de un atributo de clave indexado (de A a B), se requieren dos
escrituras, una para eliminar el elemento anterior del ndice y otra para colocar el nuevo elemento en el
ndice.
Si ya hay un elemento en el ndice, pero al escribir en la tabla se elimina el atributo indexado, se requiere
una escritura para eliminar la proyeccin del elemento anterior del ndice.
Si no hay ningn elemento presente en el ndice antes o despus de actualizar el elemento, no se
devenga ningn costo de escritura adicional para el ndice.
Si al actualizar la tabla solo se cambia el valor de los atributos proyectados en el esquema de claves del
ndice, pero no se cambia el valor de ningn atributo de clave indexado, se requiere una escritura para
actualizar los valores de los atributos proyectados en el ndice.
Al calcular las unidades de capacidad de escritura, en todos estos factores se presupone que el tamao de
cada elemento del ndice es menor o igual que el tamao de elemento de 1 KB. Las entradas de ndice de
mayor tamao requerirn ms unidades de capacidad de escritura. Para minimizar los costos de escritura,
es conveniente estudiar qu atributos tendrn que devolver las consultas y proyectar solamente esos
atributos en el ndice.
El tamao en bytes de la clave principal (clave de particin y clave de ordenacin) de la tabla base
El tamao en bytes del atributo de clave de ndice
El tamao en bytes de los atributos proyectados (si procede)
100 bytes de gastos generales por cada elemento de ndice
Para calcular los requisitos de almacenamiento de un ndices secundario global, puede calcular el tamao
medio de un elemento del ndice y, a continuacin, multiplicarlo por el nmero de elementos de la tabla
base que tienen atributos de clave del ndices secundario global.
Si una tabla contiene un elemento en el que no se ha definido un atributo determinado, pero ese atributo se
ha definido como clave de particin o de ordenacin del ndice, DynamoDB no escribir ningn dato para
ese elemento en el ndice.
Temas
Creacin de una tabla con ndices secundarios globales (p. 474)
Descripcin de los ndices secundarios globales de una tabla (p. 474)
Adicin de un ndice secundario global a una tabla existente (p. 475)
Modificacin de la creacin de un ndice (p. 477)
Eliminacin de un ndice secundario global de una tabla (p. 477)
Deteccin y correccin de infracciones de claves de ndice (p. 478)
Debe especificar un atributo que acte como clave de particin del ndice y, si lo desea, otro atributo
que ser la clave de ordenacin del ndice. No es necesario que ninguno de estos atributos de clave
sea igual que un atributo de clave de la tabla. Por ejemplo, en la tabla GameScores (consulte ndices
secundarios globales (p. 466)), ni TopScore ni TopScoreDateTime son atributos de clave. Sin embargo,
podra crear un ndices secundario global con la clave de particin TopScore y la clave de ordenacin
TopScoreDateTime. Se podra usar un ndice de este tipo para determinar si existe una correlacin entre
las mejores puntuaciones y la hora del da a la que se juega.
Todos los atributos de clave del ndice deben ser escalares y pueden ser de tipo String, Number o
Binary. No pueden ser documentos ni conjuntos. Puede proyectar atributos de cualquier tipo de datos
en un ndices secundario global, incluidos los escalares, documentos y conjuntos. Para obtener una lista
completa de los tipos de datos, consulte Tipos de datos (p. 13).
En un ndices secundario global, IndexStatus puede tener uno de los siguientes valores:
Cuando DynamoDB ha terminado de crear un ndices secundario global, el estado de este ltimo cambia
de CREATING a ACTIVE.
El nombre del ndice. Este nombre debe ser nico entre todos los ndices de la tabla.
El esquema de claves del ndice. Debe especificar un atributo para la clave de particin del ndice y, si
lo desea, otro atributo para la clave de ordenacin del ndice. No es necesario que ninguno de estos
atributos de clave sea igual que un atributo de clave de la tabla. Los tipos de datos de cada atributo del
esquema deben ser escalares de tipo String, Number o Binary.
Los atributos de la tabla que se van a proyectar en el ndice:
KEYS_ONLY: cada elemento del ndice consta nicamente de los valores de la clave de particin y la
clave de ordenacin de la tabla, as como de los valores de las claves del ndice.
INCLUDE: adems de los atributos que se describen enKEYS_ONLY, el ndice secundario incluir
otros atributos sin clave que se especifiquen.
ALL: el ndice incluye todos los atributos de la tabla de origen.
Los ajustes de desempeo provisionado del ndice, que constan de ReadCapacityUnits
yWriteCapacityUnits. Estos ajustes de desempeo provisionado son independientes de los de la
tabla.
Solo puede crear un ndices secundario global por cada operacin UpdateTable.
Note
Cuando se agrega un nuevo ndices secundario global a una tabla existente, la tabla sigue estando
disponible mientras se crea el ndice. Sin embargo, el nuevo ndice no estar disponible para las
operaciones de consulta hasta que el estado cambie de CREATING a ACTIVE.
Asignacin de recursos
DynamoDB asigna los recursos de computacin y almacenamiento que se necesitarn para crear el
ndice.
Durante la fase de asignacin de recursos, el valor del atributo IndexStatus es CREATING y el valor
del atributo Backfilling es false. Use la operacin DescribeTable para recuperar el estado de
una tabla y todos sus ndices secundarios.
Para cada elemento de la tabla, DynamoDB determina el conjunto de atributos que se escribir en el
ndice segn su proyeccin (KEYS_ONLY, INCLUDE o ALL). A continuacin, escribe estos atributos
en el ndice. Durante la fase de reposicin, DynamoDB lleva un seguimiento de los elementos que
se agregan, eliminan o actualizan en la tabla. Los atributos de estos elementos tambin se agregan,
eliminan o actualizan en el ndice, segn proceda.
Durante la fase de reposicin, el valor del atributo IndexStatus es CREATING y el valor del atributo
Backfilling es true. Use la operacin DescribeTable para recuperar el estado de una tabla y
todos sus ndices secundarios.
Mientras el ndice se encuentra en la fase de reposicin, no se puede eliminar su tabla principal. Sin
embargo, s se puede modificar el desempeo provisionado de la tabla y de cualquiera de sus ndices
secundarios globales.
Note
Mientras las fases de asignacin de recursos y reposicin estn en curso, el ndice se encuentra en el
estado CREATING. Durante este tiempo, DynamoDB realiza operaciones de lectura en la tabla, pero no se
le cobrar por esta actividad de lectura.
Una vez que se completa la creacin del ndice, su estado cambia a ACTIVE. No podr realizar
operaciones Query o Scan en el ndice hasta que su estado sea ACTIVE.
Note
El tiempo necesario para crear un ndices secundario global depende de varios factores, tales como:
El tamao de la tabla.
El nmero de elementos de la tabla que son aptos para incluirlos en el ndice.
El nmero de atributos que se proyectan en el ndice.
La capacidad de escritura provisionada del ndice.
La actividad de escritura en la tabla principal mientras se crean los ndices.
Si se va a agregar un ndices secundario global a una tabla muy grande, el proceso de creacin puede
tardar mucho tiempo en completarse. Para monitorizar el progreso y determinar si el ndice tiene suficiente
capacidad de escritura, consulte las siguientes mtricas de Amazon CloudWatch:
OnlineIndexPercentageProgress
OnlineIndexConsumedWriteCapacity
OnlineIndexThrottleEvents
Note
Para obtener ms informacin sobre las mtricas de CloudWatch relacionadas con DynamoDB,
consulte Mtricas de DynamoDB (p. 671).
Si el ajuste de desempeo de escritura provisionado del ndice es demasiado bajo, la creacin del ndice
tardar ms en completarse. Para reducir el tiempo que se tarda en crear un nuevo ndices secundario
global, puede aumentar temporalmente su capacidad de escritura provisionada.
Note
Por regla general, recomendamos establecer la capacidad de escritura provisionada del ndice en
1,5veces la capacidad de escritura de la tabla. Este ajuste es adecuado en muchos casos de uso;
no obstante, puede que sus requisitos reales sean superiores o inferiores.
Mientras el ndice est en la fase de reposicin, DynamoDB utiliza la capacidad interna del sistema para
leer la tabla. Esto permite minimizar el impacto de la creacin del ndice y asegurarse de que no se agote
la capacidad de lectura de la tabla.
Sin embargo, es posible que el volumen de una actividad de escritura entrante supere la capacidad de
lectura provisionada del ndice. En este caso, se producira un cuello de botella y la creacin del ndice
tardara ms porque la actividad de escritura en el ndice sera objeto de una limitacin controlada.
Mientras se crea el ndice, recomendamos monitorizar las mtricas de Amazon CloudWatch del ndice para
determinar si su capacidad de escritura consumida es superior a la provisionada. Si se produce un cuello
de botella, debe aumentar la capacidad de escritura provisionada en el ndice para evitar que se imponga
la limitacin controlada a las escrituras durante la fase de reposicin.
Una vez que se haya creado el ndice, conviene establecer su capacidad de escritura provisionada de
modo que refleje el uso normal de la aplicacin.
Mientras que la reposicin est en curso, puede actualizar los parmetros de desempeo provisionado
del ndice. Puede optar por esta opcin para agilizar la creacin del ndice: puede aumentar la capacidad
de escritura del ndice mientras se crea y reducirla despus. Para modificar los ajustes de desempeo
provisionado del ndice, utilice la operacin UpdateTable. El estado del ndice cambiar a UPDATING y el
valor de Backfilling ser true hasta que el ndice est listo para usarlo.
En el caso de los ndices que se han creado como parte de una operacin CreateTable, el
atributo Backfilling no aparece en el resultado de DescribeTable. Para obtener ms
informacin, consulte Fases de creacin de los ndices (p. 475).
Solo puede eliminar un ndices secundario global por cada operacin UpdateTable.
Mientras se elimina el ndices secundario global, no afecta en absoluto a la actividad de lectura o escritura
en la tabla principal. Mientras la eliminacin est en curso, puede modificar el desempeo provisionado de
los dems ndices.
Note
Al eliminar una tabla mediante la accin DeleteTable, todos los ndices secundarios globales de
esa tabla se eliminan tambin.
Los tipos de datos del valor de un atributo y del esquema de claves del ndice no coinciden. Por ejemplo,
supongamos que uno de los elementos de la tabla GameScores tiene un atributo TopScore cuyo valor
es de tipo String. Si agrega un ndices secundario global con una clave de particin de TopScore de tipo
Number, el elemento de la tabla infringira la clave de ndice.
El valor de atributo de la tabla supera la longitud mxima de un atributo de clave del ndice. La longitud
mxima de una clave de particin es de 2048 bytes y la longitud mxima de una clave de ordenacin
es de 1024 bytes. Si cualquiera de los valores de atributos correspondientes de la tabla supera estos
lmites, el elemento de la tabla infringira la clave de ndice.
Si se produce una infraccin de ndice, la fase de reposicin contina sin interrupcin, pero no se incluye
en el ndice ninguno de los elementos infractores. Una vez que haya finalizado la fase de reposicin, se
rechazarn todas las escrituras en elementos que infringen el esquema de claves del nuevo ndice.
Para identificar y corregir los valores de los atributos de una tabla que infringen una clave de ndice,
se utiliza la herramienta Violation Detector. Para ejecutar Violation Detector, debe crear un archivo de
configuracin que especifique el nombre de la tabla que se va a examinar, los nombres y los tipos de datos
de las claves de particin y de ordenacin del ndices secundario global y qu medidas deben adoptarse
si se detecta cualquier infraccin de clave de ndice. Violation Detector puede ejecutarse en dos modos
diferentes:
Modo de deteccin: detecta las infracciones de claves de ndice. El modo de deteccin se utiliza para
registrar los elementos de la tabla que causaran infracciones de claves en un ndices secundario global.
Si lo desea, puede solicitar que estos elementos infractores de la tabla se eliminen de inmediato en
cuanto se encuentren. El resultado del modo de deteccin se escribe en un archivo, que se puede
utilizar para analizar los datos posteriormente.
Modo de correccin: corrige las infracciones de claves de ndice. En el modo de correccin, Violation
Detector lee un archivo de informacin de entrada con el mismo formato que el archivo de resultados del
modo de deteccin. En el modo de correccin se leen los registros del archivo de informacin de entrada
y, para cada registro, se elimina o actualiza el elemento correspondiente de la tabla. Tenga en cuenta
que si decide actualizar los elementos, deber editar el archivo de informacin de entrada y establecer
valores adecuados para estas actualizaciones.
Violation Detector est disponible como archivo Java ejecutable (.jar) y se ejecutar en equipos
Windows, Mac o Linux. Violation Detector requiere Java 1.7 (o superior) y Maven.
https://github.com/awslabs/dynamodb-online-index-violation-detector
Siga las instrucciones del archivo README.md para descargar e instalar Violation Detector mediante
Maven.
accessKey
= access_key_id_goes_here
secretKey
= secret_key_goes_here
S | N | B
S | N | B
detectionOutputPath
= //local/path/
filename.csv
detectionOutputPath =
s3://bucket/filename.csv
El ajuste mximo de
numOfSegments es 4096.
correctionOutputPath
= //local/path/
filename.csv
correctionOutputPath =
s3://bucket/filename.csv
Deteccin
Para detectar infracciones de claves de ndice, use Violation Detector con la opcin de lnea de comandos
--detect. Para ver cmo funciona esta opcin, tomemos la tabla ProductCatalog que se muestra
en Creacin de tablas y carga de ejemplos de datos (p. 291). A continuacin se muestra una lista de
elementos de la tabla; solamente se muestran la clave principal (Id) y el atributo Price.
101 -2
102 20
103 200
201 100
202 200
203 300
204 400
205 500
Tenga en cuenta que todos los valores de Price son de tipo Number. No obstante, dado que en
DynamoDB no se usan esquemas, es posible agregar un elemento con un valor de Price no numrico.
Por ejemplo, supongamos que agregamos otro elemento a la tabla ProductCatalog:
999 "Hello"
Ahora vamos a agregar un nuevo ndices secundario global a la tabla: PriceIndex. La clave principal
de este ndice es una clave de particin, Price, que es de tipo Number. Despus de crearlo, el ndice
contendr ocho elementos. Sin embargo, la tabla ProductCatalog tiene nueve elementos. El motivo de
esta discrepancia es que, aunque el valor "Hello" es de tipo String, la clave principal de PriceIndex
es de tipo Number. El valor de tipo String infringe la clave del ndices secundario global, por lo que no est
presente en el ndice.
Para usar Violation Detector en esta situacin, primero se crea un archivo de configuracin, como el
siguiente:
awsCredentialsFile = /home/alice/credentials.txt
dynamoDBRegion = us-west-2
tableName = ProductCatalog
gsiHashKeyName = Price
gsiHashKeyType = N
recordDetails = true
recordGsiValueInViolationRecord = true
detectionOutputPath = ./gsi_violation_check.csv
correctionInputPath = ./gsi_violation_check.csv
numOfSegments = 1
readWriteIOPSPercent = 40
Violation detection started: sequential scan, Table name: ProductCatalog, GSI name:
PriceIndex
Progress: Items scanned in total: 9, Items scanned by this thread: 9, Violations
found by this thread: 1, Violations deleted by this thread: 0
Violation detection finished: Records scanned: 9, Violations found: 1, Violations deleted:
0, see results at: ./gsi_violation_check.csv
Table Hash Key,GSI Hash Key Value,GSI Hash Key Violation Type,GSI Hash Key Violation
Description,GSI Hash Key Update Value(FOR USER),Delete Blank Attributes When Updating?(Y/
N)
El formato del archivo de resultados es de valores separados por comas (CSV). La primera lnea del
archivo es un encabezado, seguido de un registro por cada elemento que infringe la clave del ndice. Los
campos de estos registros de infraccin son los siguientes:
Si alguno de estos campos no est en blanco, entonces Delete Blank Attribute When
Updating(Y/N) no surte ningn efecto.
Note
El formato de los resultados puede variar, en funcin del archivo de configuracin y de las
opciones de la lnea de comandos. Por ejemplo, si la tabla tiene una clave principal simple (sin
clave de ordenacin), no habr ningn campo de clave de ordenacin en el resultado.
Los registros de infraccin del archivo podran no estar ordenados.
Correccin
Para corregir infracciones de claves de ndice, use Violation Detector con la opcin de lnea de comandos
--correct. En el modo de correccin, Violation Detector lee el archivo de informacin de entrada
especificado por el parmetro correctionInputPath. Este archivo tiene el mismo formato que el
archivo detectionOutputPath, lo que permite utilizar el resultado de la deteccin como informacin de
entrada para la correccin.
Violation Detector ofrece dos maneras distintas de corregir las infracciones de claves de ndice:
Eliminar las infracciones: se eliminan los elementos de la tabla cuyos valores de atributos infringen
alguna clave.
Actualizar las violaciones: se actualizan los elementos de la tabla, para lo cual se sustituyen los atributos
infractores por otros que no causan ninguna infraccin.
En ambos casos, puede utilizar el archivo de resultados del modo de deteccin como informacin de
entrada para el modo de correccin.
En este momento, le pedir que confirme si desea eliminar los elementos infractores.
A continuacin se indican los pasos comunes para las operaciones con tablas.
A continuacin se indican los pasos que hay que seguir para crear una tabla con un ndices secundario
global utilizando el API de documentos de DynamoDB.
Debe proporcionar el nombre de la tabla, su clave principal y los valores de desempeo provisionado.
Para el ndices secundario global, debe proporcionar el nombre del ndice, los ajustes de desempeo
provisionado, las definiciones de atributos de la clave de ordenacin del ndice, el esquema de claves
del ndice y la proyeccin de atributos.
3. Llame al mtodo createTable proporcionando el objeto de solicitud como parmetro.
En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores. En el fragmento se
crea una tabla (WeatherData) con un ndices secundario global (PrecipIndex). La clave de particin del
ndice es Date (la fecha) y su clave de ordenacin es Precipitation (la precipitacin). Todos los atributos
de la tabla se proyectan en el ndice. Los usuarios pueden consultar este ndice para obtener los datos
meteorolgicos de una determinada fecha y, si lo desean, ordenarlos segn la cantidad de precipitacin.
Tenga en cuenta que, si bien Precipitation no es obligatorio, porque no es un atributo de clave de la tabla,
los elementos WeatherData que no tengan un valor de Precipitation no aparecern en PrecipIndex.
// Attribute definitions
ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>();
attributeDefinitions.add(new AttributeDefinition()
.withAttributeName("Location")
.withAttributeType("S"));
attributeDefinitions.add(new AttributeDefinition()
.withAttributeName("Date")
.withAttributeType("S"));
attributeDefinitions.add(new AttributeDefinition()
.withAttributeName("Precipitation")
.withAttributeType("N"));
// PrecipIndex
GlobalSecondaryIndex precipIndex = new GlobalSecondaryIndex()
.withIndexName("PrecipIndex")
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits((long) 10)
.withWriteCapacityUnits((long) 1))
.withProjection(new Projection().withProjectionType(ProjectionType.ALL));
indexKeySchema.add(new KeySchemaElement()
.withAttributeName("Date")
.withKeyType(KeyType.HASH)); //Partition key
indexKeySchema.add(new KeySchemaElement()
.withAttributeName("Precipitation")
.withKeyType(KeyType.RANGE)); //Sort key
precipIndex.setKeySchema(indexKeySchema);
Debe esperar hasta que DynamoDB cree la tabla y establezca el estado de esta ltima en ACTIVE. A partir
de ese momento, puede comenzar a incluir elementos de datos en la tabla.
A continuacin se indican los pasos que debe seguir para obtener acceso a la informacin de ndices
secundario global de una tabla.
Example
Iterator<GlobalSecondaryIndexDescription> gsiIter =
tableDesc.getGlobalSecondaryIndexes().iterator();
while (gsiIter.hasNext()) {
GlobalSecondaryIndexDescription gsiDesc = gsiIter.next();
System.out.println("Info for index "
+ gsiDesc.getIndexName() + ":");
A continuacin se indican los pasos que hay que seguir para consultar un ndices secundario global con el
API de documentos del AWS SDK for Java.
Example
Una vez que se ha creado la tabla Issues, el programa carga la tabla con datos que representan informes
de errores de software; a continuacin, consulta los datos mediante ndices secundarios globales. Por
ltimo, el programa elimina la tabla Issues.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo Java (p. 296).
Example
import java.util.ArrayList;
import java.util.Iterator;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Index;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.QueryOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.GlobalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.Projection;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
createTable();
loadData();
queryIndex("CreateDateIndex");
queryIndex("TitleIndex");
queryIndex("DueDateIndex");
deleteTable(tableName);
// Attribute definitions
ArrayList<AttributeDefinition> attributeDefinitions = new
ArrayList<AttributeDefinition>();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("IssueId").withAttributeType("S"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Title").withAttributeType("S"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("CreateDate").withAttributeType("S"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("DueDate").withAttributeType("S"));
// key
tableKeySchema.add(new
KeySchemaElement().withAttributeName("Title").withKeyType(KeyType.RANGE)); // Sort
// key
// CreateDateIndex
GlobalSecondaryIndex createDateIndex = new
GlobalSecondaryIndex().withIndexName("CreateDateIndex")
.withProvisionedThroughput(ptIndex)
.withKeySchema(new
KeySchemaElement().withAttributeName("CreateDate").withKeyType(KeyType.HASH), // Partition
// key
new
KeySchemaElement().withAttributeName("IssueId").withKeyType(KeyType.RANGE)) // Sort
// key
.withProjection(
new
Projection().withProjectionType("INCLUDE").withNonKeyAttributes("Description", "Status"));
// TitleIndex
GlobalSecondaryIndex titleIndex = new
GlobalSecondaryIndex().withIndexName("TitleIndex")
.withProvisionedThroughput(ptIndex)
.withKeySchema(new
KeySchemaElement().withAttributeName("Title").withKeyType(KeyType.HASH), // Partition
// key
new
KeySchemaElement().withAttributeName("IssueId").withKeyType(KeyType.RANGE)) // Sort
// key
.withProjection(new Projection().withProjectionType("KEYS_ONLY"));
// DueDateIndex
GlobalSecondaryIndex dueDateIndex = new
GlobalSecondaryIndex().withIndexName("DueDateIndex")
.withProvisionedThroughput(ptIndex)
.withKeySchema(new
KeySchemaElement().withAttributeName("DueDate").withKeyType(KeyType.HASH)) // Partition
// key
.withProjection(new Projection().withProjectionType("ALL"));
System.out.println("\n***********************************************************
\n");
System.out.print("Querying index " + indexName + "...");
if (indexName == "CreateDateIndex") {
System.out.println("Issues filed on 2013-11-01");
querySpec.withKeyConditionExpression("CreateDate = :v_date and
begins_with(IssueId, :v_issue)")
.withValueMap(new ValueMap().withString(":v_date",
"2013-11-01").withString(":v_issue", "A-"));
items = index.query(querySpec);
}
else if (indexName == "TitleIndex") {
System.out.println("Compilation errors");
querySpec.withKeyConditionExpression("Title = :v_title and
begins_with(IssueId, :v_issue)")
.withValueMap(new ValueMap().withString(":v_title", "Compilation
error").withString(":v_issue", "A-"));
items = index.query(querySpec);
}
else if (indexName == "DueDateIndex") {
System.out.println("Items that are due on 2013-11-30");
querySpec.withKeyConditionExpression("DueDate = :v_date")
.withValueMap(new ValueMap().withString(":v_date", "2013-11-30"));
items = index.query(querySpec);
}
else {
System.out.println("\nNo valid index name provided");
return;
}
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
// IssueId, Title,
// Description,
// CreateDate, LastUpdateDate, DueDate,
// Priority, Status
putItem("A-102", "Can't read data file", "The main data file is missing, or the
permissions are incorrect",
"2013-11-01", "2013-11-04", "2013-11-30", 2, "In progress");
table.putItem(item);
}
Puede utilizar el API de bajo nivel del AWS SDK para .NET para crear una tabla con uno o varios
ndices secundarios globales, describir los ndices de la tabla y utilizarlos para realizar consultas.
Estas operaciones se mapean a las operaciones correspondientes de DynamoDB. Para obtener ms
informacin, consulte la Amazon DynamoDB API Reference.
A continuacin se indican los pasos comunes para las operaciones con tablas mediante el API de bajo
nivel de .NET.
Por ejemplo, cree un objeto CreateTableRequest para crear una tabla y un objeto QueryRequest
para consultar una tabla o un ndice.
3. Ejecute el mtodo apropiado proporcionado por el cliente que ha creado en el paso anterior.
A continuacin se indican los pasos que hay que seguir para crear una tabla con un ndices secundario
global mediante el API de bajo nivel de .NET.
Debe proporcionar el nombre de la tabla, su clave principal y los valores de desempeo provisionado.
Para el ndices secundario global, debe proporcionar el nombre del ndice, los ajustes de desempeo
provisionado, las definiciones de atributos de la clave de ordenacin del ndice, el esquema de claves
del ndice y la proyeccin de atributos.
3. Ejecute el mtodo CreateTable proporcionando el objeto de solicitud como parmetro.
Tenga en cuenta que, si bien Precipitation no es obligatorio, porque no es un atributo de clave de la tabla,
los elementos WeatherData que no tengan un valor de Precipitation no aparecern en PrecipIndex.
// Attribute definitions
var attributeDefinitions = new List<AttributeDefinition>()
{
{new AttributeDefinition{
AttributeName = "Location",
AttributeType = "S"}},
{new AttributeDefinition{
AttributeName = "Date",
AttributeType = "S"}},
{new AttributeDefinition(){
AttributeName = "Precipitation",
AttributeType = "N"}
}
};
{new KeySchemaElement {
AttributeName = "Location",
KeyType = "HASH"}}, //Partition key
{new KeySchemaElement {
AttributeName = "Date",
KeyType = "RANGE"} //Sort key
}
};
// PrecipIndex
var precipIndex = new GlobalSecondaryIndex
{
IndexName = "PrecipIndex",
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = (long)10,
WriteCapacityUnits = (long)1
},
Projection = new Projection { ProjectionType = "ALL" }
};
precipIndex.KeySchema = indexKeySchema;
Debe esperar hasta que DynamoDB cree la tabla y establezca el estado de esta ltima en ACTIVE. A partir
de ese momento, puede comenzar a incluir elementos de datos en la tabla.
A continuacin se indican los pasos que hay que seguir para obtener acceso a la informacin de un ndices
secundario global de una tabla mediante el API de bajo nivel de .NET.
Example
List<GlobalSecondaryIndexDescription> globalSecondaryIndexes =
response.DescribeTableResult.Table.GlobalSecondaryIndexes;
// This code snippet will work for multiple indexes, even though
// there is only one index in this example.
if (projection.ProjectionType.ToString().Equals("INCLUDE")) {
Console.WriteLine("\t\tThe non-key projected attributes are: "
+ projection.NonKeyAttributes);
}
}
A continuacin se indican los pasos que hay que seguir para consultar un ndices secundario global
mediante el API de bajo nivel de .NET.
Example
IndexName = "PrecipIndex",
KeyConditionExpression = "#dt = :v_date and Precipitation > :v_precip",
ExpressionAttributeNames = new Dictionary<String, String> {
{"#dt", "Date"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_date", new AttributeValue { S = "2013-08-01" }},
{":v_precip", new AttributeValue { N = "0" }}
},
ScanIndexForward = true
};
}
Console.WriteLine();
}
Ejemplo: ndices secundarios globales mediante el API de bajo nivel del AWS
SDK para .NET
En el siguiente ejemplo de cdigo C# se muestra cmo usar ndices secundarios globales. En el ejemplo
se crea una tabla denominada Issues, que puede utilizarse en un sistema sencillo de seguimiento de
errores con fines de desarrollo de software. La clave de particin es IssueId y la de ordenacin, Title.
Existen tres ndices secundarios globales en esta tabla:
Una vez que se ha creado la tabla Issues, el programa carga la tabla con datos que representan informes
de errores de software; a continuacin, consulta los datos mediante ndices secundarios globales. Por
ltimo, el programa elimina la tabla Issues.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using System.Linq;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class LowLevelGlobalSecondaryIndexExample
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
public static String tableName = "Issues";
QueryIndex("CreateDateIndex");
QueryIndex("TitleIndex");
QueryIndex("DueDateIndex");
DeleteTable(tableName);
{
ReadCapacityUnits = 1L,
WriteCapacityUnits = 1L
};
// CreateDateIndex
var createDateIndex = new GlobalSecondaryIndex()
{
IndexName = "CreateDateIndex",
ProvisionedThroughput = ptIndex,
KeySchema = {
new KeySchemaElement {
AttributeName = "CreateDate", KeyType = "HASH" //Partition key
},
new KeySchemaElement {
AttributeName = "IssueId", KeyType = "RANGE" //Sort key
}
},
Projection = new Projection
{
ProjectionType = "INCLUDE",
NonKeyAttributes = {
"Description", "Status"
}
}
};
// TitleIndex
var titleIndex = new GlobalSecondaryIndex()
{
IndexName = "TitleIndex",
ProvisionedThroughput = ptIndex,
KeySchema = {
new KeySchemaElement {
AttributeName = "Title", KeyType = "HASH" //Partition key
},
new KeySchemaElement {
AttributeName = "IssueId", KeyType = "RANGE" //Sort key
}
},
Projection = new Projection
{
ProjectionType = "KEYS_ONLY"
}
};
// DueDateIndex
var dueDateIndex = new GlobalSecondaryIndex()
{
IndexName = "DueDateIndex",
ProvisionedThroughput = ptIndex,
KeySchema = {
new KeySchemaElement {
AttributeName = "DueDate",
KeyType = "HASH" //Partition key
}
},
Projection = new Projection
{
ProjectionType = "ALL"
}
};
{
TableName = tableName,
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = (long)1,
WriteCapacityUnits = (long)1
},
AttributeDefinitions = attributeDefinitions,
KeySchema = tableKeySchema,
GlobalSecondaryIndexes = {
createDateIndex, titleIndex, dueDateIndex
}
};
WaitUntilTableReady(tableName);
}
// IssueId, Title,
// Description,
// CreateDate, LastUpdateDate, DueDate,
// Priority, Status
S = issueId
});
item.Add("Title", new AttributeValue
{
S = title
});
item.Add("Description", new AttributeValue
{
S = description
});
item.Add("CreateDate", new AttributeValue
{
S = createDate
});
item.Add("LastUpdateDate", new AttributeValue
{
S = lastUpdateDate
});
item.Add("DueDate", new AttributeValue
{
S = dueDate
});
item.Add("Priority", new AttributeValue
{
N = priority.ToString()
});
item.Add("Status", new AttributeValue
{
S = status
});
try
{
client.PutItem(new PutItemRequest
{
TableName = tableName,
Item = item
});
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
String keyConditionExpression;
Dictionary<string, AttributeValue> expressionAttributeValues = new
Dictionary<string, AttributeValue>();
if (indexName == "CreateDateIndex")
{
Console.WriteLine("Issues filed on 2013-11-01\n");
// Select
queryRequest.Select = "ALL_PROJECTED_ATTRIBUTES";
}
else if (indexName == "DueDateIndex")
{
Console.WriteLine("Items that are due on 2013-11-30\n");
// Select
queryRequest.Select = "ALL_PROJECTED_ATTRIBUTES";
}
else
{
Console.WriteLine("\nNo valid index name provided");
return;
}
queryRequest.KeyConditionExpression = keyConditionExpression;
queryRequest.ExpressionAttributeValues = expressionAttributeValues;
}
Console.WriteLine();
}
}
while (tablePresent)
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});
}
}
Algunas aplicaciones solo requieren consultar datos utilizando la clave principal de la tabla base; sin
embargo, puede haber situaciones en las que resulte til una clave de ordenacin alternativa. Para que
la aplicacin disponga de diversas claves de ordenacin entre las que elegir, puede crear uno o varios
ndices secundarios locales en una tabla y emitir solicitudes Query o Scan para estos ndices.
Por ejemplo, tomemos la tabla Thread definida en Creacin de tablas y carga de ejemplos de
datos (p. 291). Esta tabla resulta til para una aplicacin como, por ejemplo, Foros de debate de AWS. En
el siguiente diagrama se muestra cmo se organizaran los elementos de la tabla. No se muestran todos
los atributos.
DynamoDB almacena en posiciones contiguas todos los elementos que tienen el mismo valor de clave
de particin. En este ejemplo, para un valor determinado de ForumName, una operacin Query podra
localizar inmediatamente todas las conversaciones de ese foro. Dentro de un grupo de elementos con el
mismo valor de clave de particin, los elementos se ordenan segn el valor de la clave de ordenacin. Si
la clave de ordenacin (Subject) tambin se incluye en la consulta, DynamoDB puede afinar los resultados
que se devuelven; por ejemplo, devolvera todas las conversaciones del foro "S3" cuyo valor de Subject
comience por la letra "a".
Algunas solicitudes podran requerir patrones ms complejos de acceso a los datos. Por ejemplo:
Para responder a estas preguntas, la accin Query no bastara. En su lugar, habra que aplicar Scan a
la tabla completa. Si la tabla contiene millones de elementos, esto consumira una cantidad enorme de
desempeo de lectura provisionado y tardara mucho tiempo en completarse.
Sin embargo, puede especificar uno o varios ndices secundarios locales para atributos sin clave, tales
como Replies o LastPostDateTime.
Un local secondary index mantiene una clave de ordenacin alternativa para un determinado valor de clave
de particin. Un local secondary index tambin contiene una copia parcial o total de los atributos de la tabla
base; a usted le corresponde especificar qu atributos se proyectarn en el local secondary index al crear
la tabla. Los datos de un local secondary index se organizan segn la misma clave de particin que la tabla
base, pero con una clave de ordenacin distinta. Esto le permite obtener acceso a los elementos de datos
de forma eficiente en esta otra dimensin. Para lograr una mayor flexibilidad de consulta o examen, puede
crear hasta cinco ndices secundarios locales por tabla.
Supongamos que una aplicacin tiene que hallar todas las conversaciones publicadas en los ltimos
tres meses. Sin un local secondary index, la aplicacin tendra que aplicar la operacin Scan a toda la
tabla Thread y, despus, descartar aquellas publicaciones que no estuviesen comprendidos en el periodo
especificado. Con un local secondary index, una operacin Query podra utilizar LastPostDateTime como
clave de ordenacin para encontrar rpidamente los datos.
En este ejemplo, la clave de particin es ForumName y la clave de ordenacin del local secondary index
es LastPostDateTime. Adems, el valor de clave de ordenacin de la tabla base (en este ejemplo, Subject)
se proyecta en el ndice, aunque no forma parte de la clave de ndice. Si una aplicacin requiere una lista
basada en ForumName y LastPostDateTime, puede emitir una solicitud Query para LastPostIndex. Los
resultados de la consulta se ordenan por LastPostDateTime y se pueden devolver en orden ascendente
o descendente. La consulta tambin puede aplicar condiciones de clave, tales como devolver solamente
aquellos elementos cuyo valor de LastPostDateTime est comprendido en un periodo determinado.
Cada local secondary index contiene automticamente las claves de particin y ordenacin de su
tabla base;. Si lo desea, puede proyectar atributos sin clave en el ndice. Cuando se consulta el ndice,
DynamoDB puede recuperar estos atributos proyectados de forma eficiente. Cuando se consulta un local
secondary index, la consulta tambin puede recuperar atributos no proyectados en el ndice. DynamoDB
recuperar automticamente estos atributos de la tabla base, pero con una mayor latencia y costos ms
elevados de desempeo provisionado.
Para cualquier local secondary index, puede almacenar hasta 10 GB de datos por cada valor diferente de
clave de particin. Esta cifra incluye todos los elementos de la tabla base, adems de todos los elementos
de los ndices, que tengan el mismo valor de clave de particin. Para obtener ms informacin, consulte
Colecciones de elementos (p. 513).
Proyecciones de atributos
Con LastPostIndex, una aplicacin podra usar ForumName y LastPostDateTime como criterios de
consulta. Sin embargo, para recuperar atributos adicionales, DynamoDB tendra que llevar a cabo
operaciones de lectura adicionales en la tabla Thread. Estas lecturas adicionales se denominan
recuperaciones y pueden aumentar la cantidad total de desempeo provisionado necesario para una
consulta.
Supongamos que desea rellenar una pgina web con una lista de todas las conversaciones del foro "S3" y
el nmero de respuestas de cada conversacin, ordenadas segn la fecha y hora de la ltima respuesta y
comenzando por la respuesta ms reciente. Para rellenar esta lista, se requieren los siguientes atributos:
Asunto
Replies
LastPostDateTime
La forma ms eficiente de consultar estos datos y evitar operaciones de recuperacin, sera proyectar el
atributo Replies de la tabla en el local secondary index, tal y como se muestra en este diagrama:
Una proyeccin es un conjunto de atributos de una tabla que se copia en un ndice secundario. La clave
de particin y la clave de ordenacin de la tabla siempre se proyectan en el ndice. Tambin se pueden
proyectar otros atributos que sean compatibles con los requisitos de consulta de la aplicacin. Cuando
consulte un ndice, Amazon DynamoDB podr obtener acceso a cualquier atributo de la proyeccin si
dichos atributos estuvieran en una tabla de la proyeccin.
Si crea un ndice secundario, tendr que especificar los atributos que se proyectarn en el ndice.
DynamoDB cuenta con tres opciones diferentes para esto:
KEYS_ONLY: cada elemento del ndice se compone nicamente de los valores de la clave de particin
y la clave de ordenacin de la tabla, as como los valores de la clave del ndice. La opcin KEYS_ONLY
genera el ndice secundario ms pequeo posible.
INCLUDE: adems de los atributos que se describen en KEYS_ONLY, el ndice secundario incluir los
atributos que no son de clave que se especifiquen.
ALL: el ndice secundario incluye todos los atributos de la tabla de origen. Como todos los datos de la
tabla se duplican en el ndice, las proyecciones ALL generan el ndice secundario ms grande posible.
En el diagrama anterior, el atributo sin clave Replies se proyecta en LastPostIndex. Una aplicacin puede
consultar LastPostIndex en lugar de la tabla Thread completa para rellenar una pgina web con los valores
de Subject, Replies y LastPostDateTime. Si se solicitasen otros atributos sin clave, DynamoDB tendra que
recuperarlos en la tabla Thread.
Desde el punto de vista de una aplicacin, la recuperacin de atributos adicionales de la tabla base se
lleva a cabo de forma automtica y transparente, por lo que no es necesario volver a escribir la lgica de la
aplicacin. No obstante, tenga en cuenta que este tipo de recuperaciones puede reducir en gran medida el
efecto beneficioso para el desempeo que aporta el uso de un local secondary index.
Cuando elija los atributos para proyectarlos en un local secondary index, debe estudiar el equilibrio entre
los costos de desempeo provisionado y de almacenamiento:
Si solo necesita obtener acceso a algunos atributos con la menor latencia posible, puede ser
conveniente proyectar solamente esos atributos en un local secondary index. Cuando menor es el
ndice, menos costar almacenarlo e inferiores sern los costos de escritura. Si hay atributos que solo
tiene que recuperar de vez en cuando, el costo del desempeo provisionado podra superar con creces
el costo a largo plazo de almacenar esos atributos.
Si la aplicacin va a obtener acceso con frecuencia a determinados atributos sin clave, puede ser
interesante proyectarlos en un local secondary index. Los costos del almacenamiento adicionales del
local secondary index compensarn el costo que supondran los frecuentes exmenes de la tabla.
Si tiene que obtener acceso a la mayora de los atributos sin clave con frecuencia, puede proyectar
estos atributos o, incluso, toda la tabla base, en un local secondary index. De este modo, dispondr de
la mxima flexibilidad y el menor consumo de desempeo provisionado, porque no ser preciso realizar
recuperaciones. Sin embargo, el costo del almacenamiento aumentara y podra llegar a duplicarse si se
proyectan todos los atributos.
Si la aplicacin tiene que consultar una tabla con poca frecuencia, pero tiene que realizar gran cantidad
de escrituras o actualizaciones en los datos de la tabla, puede ser conveniente proyectar KEYS_ONLY.
El local secondary index tendr el tamao mnimo, pero estara disponible siempre que se requiriese
para actividades de consulta.
Debe especificar un atributo sin clave que acte como clave de ordenacin del local secondary index. El
atributo que elija deber ser un escalar de tipo String, Number o Binary; no se admite ningn otro tipo de
escalar, documento ni conjunto. Para obtener una lista completa de los tipos de datos, consulte Tipos de
datos (p. 13).
Important
Para las tablas con ndices secundarios locales, existe un lmite de tamao de 10 GB por valor de
clave de particin. Una tabla con ndices secundarios locales puede almacenar cualquier nmero
de elementos, siempre y cuando el tamao total de cualquier valor de clave de particin individual
no supere los 10 GB. Para obtener ms informacin, consulte Lmite de tamao de una coleccin
de elementos (p. 515).
Puede proyectar atributos de cualquier tipo de datos en un local secondary index. Esto incluye escalares,
documentos y conjuntos. Para obtener una lista completa de los tipos de datos, consulte Tipos de
datos (p. 13).
Puede consultar un local secondary index usando lecturas consistentes finales o de consistencia alta.
Para especificar qu tipo de consistencia desea aplicar, se utiliza el parmetro ConsistentRead de la
operacin Query. Una lectura de consistencia alta de un local secondary index siempre devolver los
valores actualizados ms recientemente. Si la consulta tiene que recuperar atributos adicionales de la tabla
base, entonces estos sern consistentes respecto al ndice.
Example
Fjese en los datos siguientes devueltos por una operacin Query que solicita datos de las conversaciones
de un foro determinado:
{
"TableName": "Thread",
"IndexName": "LastPostIndex",
"ConsistentRead": false,
"ProjectionExpression": "Subject, LastPostDateTime, Replies, Tags",
"KeyConditionExpression":
"ForumName = :v_forum and LastPostDateTime between :v_start and :v_end",
"ExpressionAttributeValues": {
":v_start": {"S": "2015-08-31T00:00:00.000Z"},
":v_end": {"S": "2015-11-31T00:00:00.000Z"},
":v_forum": {"S": "EC2"}
}
}
En esta consulta:
DynamoDB obtiene acceso a LastPostIndex. Utiliza la clave de particin ForumName para localizar los
elementos del ndice correspondientes a "EC2". Todos los elementos de ndice que tienen esta clave se
almacenan en posiciones adyacentes, para agilizar su recuperacin.
En este foro, DynamoDB utiliza el ndice para buscar las claves que coinciden con la condicin
LastPostDateTime especificada.
Dado que el atributo Replies se proyecta en el ndice, DynamoDB puede recuperar este atributo sin
consumir ningn desempeo provisionado adicional.
El atributo Tags no se proyecta en el ndice, de tal forma que DynamoDB debe obtener acceso a la tabla
Thread y recuperar este atributo.
Se devuelven los resultados ordenados segn el valor de LastPostDateTime. Las entradas de ndice
se ordenan segn el valor de la clave de particin y, a continuacin, segn el valor de la clave de
ordenacin; Query las devuelve en el orden en el que se encuentran almacenadas. Puede utilizar el
parmetro ScanIndexForward para devolver los resultados en orden descendente.
Puesto que el atributo Tags no se ha proyectado en el local secondary index, DynamoDB debe consumir
unidades de capacidad de lectura adicionales para recuperar este atributo de la tabla base. Si tiene que
ejecutar esta consulta con frecuencia, se debe proyectar Tags en LastPostIndex. De este modo, evitar
realizar recuperaciones en la tabla base. Sin embargo, si solo tiene que obtener acceso a Tags de vez en
cuando, entonces el costo de almacenamiento adicional de proyectar Tags en el ndice podra no merecer
la pena.
Al crear un local secondary index, se especifica un atributo que actuar como clave de ordenacin del
ndice. Tambin se puede especificar el tipo de datos de ese atributo. Esto significa que, cada vez que se
escribe un elemento en la tabla base, si el elemento define un atributo de clave de ndice, su tipo debe
coincidir con el tipo de datos del esquema de claves de ndice. En el caso de LastPostIndex, la clave de
ordenacin LastPostDateTime del ndice se define como el tipo de datos String. Si intenta agregar un
elemento a la tabla Thread, pero especifica un tipo de datos distinto para LastPostDateTime (por ejemplo,
Number), DynamoDB devolver una excepcin ValidationException, porque los tipos de datos no
coinciden.
Si escribe un elemento en una tabla, no tiene que especificar los atributos de ninguna clave de ordenacin
del local secondary index. Si utilizamos LastPostIndex a modo de ejemplo, no sera preciso especificar un
valor para el atributo LastPostDateTime para poder escribir un nuevo elemento en la tabla Thread, ya que,
en este caso, DynamoDB no escribe ningn dato en el ndice para este elemento concreto.
No es obligatorio que exista una relacin biunvoca entre los elementos de una tabla base y los elementos
en un local secondary index; de hecho, este comportamiento puede ser beneficioso para muchas
aplicaciones. Para obtener ms informacin, consulte Saque partido de los ndices dispersos (p. 714).
Una tabla con muchos ndices secundarios locales devengar costos ms elevados por la actividad de
escritura que las tablas con menos ndices. Para obtener ms informacin, consulte Consideraciones sobre
el desempeo provisionado para los ndices secundarios locales (p. 511).
Important
Para las tablas con ndices secundarios locales, existe un lmite de tamao de 10 GB por valor de
clave de particin. Una tabla con ndices secundarios locales puede almacenar cualquier nmero
de elementos, siempre y cuando el tamao total de cualquier valor de clave de particin individual
no supere los 10 GB. Para obtener ms informacin, consulte Lmite de tamao de una coleccin
de elementos (p. 515).
Para ver las tarifas vigentes de capacidad de desempeo provisionada, visite https://aws.amazon.com/
dynamodb/precios.
Al igual que ocurre con las consultas de tablas, las consultas de ndices pueden utilizar lecturas
consistentes finales o de consistencia alta, segn el valor de ConsistentRead. Una lectura de consistencia
alta consume una unidad de capacidad de lectura; una lectura consistente final consume solo la mitad.
Por lo tanto, elegir la opcin de lecturas consistentes finales permite reducir los cargos de unidades de
capacidad de lectura.
Para las consultas de ndices que solo solicitan claves de ndice y atributos proyectados, DynamoDB
calcula la actividad de lectura provisionada de la misma forma que para las consultas de tablas. La nica
diferencia es que el clculo se basa en el tamao de las entradas del ndice, no en el tamao del elemento
en la tabla base. El nmero de unidades de capacidad de lectura es la suma de todos los tamaos de los
atributos proyectados para todos los elementos devueltos; el resultado se redondea al mltiplo de 4 KB
inmediatamente superior. Para obtener ms informacin sobre cmo calcula DynamoDB el consumo del
desempeo provisionado, consulte Ajustes de desempeo de lecturas y escrituras (p. 305).
Para indexar consultas que leen atributos no proyectados en el local secondary index, DynamoDB tendr
que recuperar esos atributos de la tabla base, adems de leer los atributos proyectados en el ndice. Estas
recuperaciones tienen lugar cuando se incluyen atributos no proyectados en los parmetros Select o
ProjectionExpression de la operacin Query. Las recuperaciones provocan latencia adicional en
las respuestas a las consultas y tambin devengan un mayor costo de desempeo provisionado. Esto se
debe a que, adems de las lecturas en el local secondary index que se han descrito anteriormente, se le
cobrarn unidades de capacidad de lectura por cada elemento recuperado de la tabla base. Este cargo
incluye la lectura de cada elemento completo de la tabla, no solo de los atributos solicitados.
El tamao mximo de los resultados devueltos por una operacin Query es de 1 MB. Esta cifra incluye los
tamaos de todos los nombres y valores de los atributos de todos los elementos devueltos. Sin embargo,
si una consulta de un local secondary index hace que DynamoDB recupere atributos de elementos de la
tabla base, el tamao mximo de los datos de los resultados podra ser inferior. En este caso, el tamao
del resultado es la suma de:
Usando esta frmula, el tamao mximo de los resultados que devuelve una operacin Query tambin es
de 1 MB.
Por ejemplo, tomemos una tabla en la que el tamao de cada elemento es de 300bytes. Existe un
local secondary index en esa tabla, pero solo se proyectan en l 200bytes de cada elemento. Ahora,
supongamos que se ejecuta Query en este ndice, que la consulta requiere recuperaciones en la tabla
para cada elemento y que la consulta devuelve 4 elementos. DynamoDB calcula lo siguiente:
El tamao de los elementos coincidentes en el ndice: 200bytes 4elementos = 800bytes; este valor
se redondea hasta 4 KB.
El tamao de cada elemento coincidente de la tabla base: (300bytes, redondeados al mltiplo de 4 KB
inmediatamente superior) 4elementos = 16KB.
Si escribe un nuevo elemento en la tabla que define un atributo indexado o actualiza un elemento
existente para definir un atributo indexado no definido previamente, se requiere una operacin de
escritura para colocar el elemento en el ndice.
Si al actualizar la tabla se cambia el valor de un atributo de clave indexado (de A a B), se requieren dos
escrituras, una para eliminar el elemento anterior del ndice y otra para colocar el nuevo elemento en el
ndice.
Si ya hay un elemento en el ndice, pero al escribir en la tabla se elimina el atributo indexado, se requiere
una escritura para eliminar la proyeccin del elemento anterior del ndice.
Si no hay ningn elemento presente en el ndice antes o despus de actualizar el elemento, no se
devenga ningn costo de escritura adicional para el ndice.
Al calcular las unidades de capacidad de escritura, en todos estos factores se presupone que el tamao de
cada elemento del ndice es menor o igual que el tamao de elemento de 1 KB. Las entradas de ndice de
mayor tamao requerirn ms unidades de capacidad de escritura. Para minimizar los costos de escritura,
es conveniente estudiar qu atributos tendrn que devolver las consultas y proyectar solamente esos
atributos en el ndice.
El tamao en bytes de la clave principal (clave de particin y clave de ordenacin) de la tabla base
El tamao en bytes del atributo de clave de ndice
El tamao en bytes de los atributos proyectados (si procede)
100 bytes de gastos generales por cada elemento de ndice
Para calcular los requisitos de almacenamiento de un local secondary index, puede calcular el tamao
medio de un elemento del ndice y, a continuacin, multiplicarlo por el nmero de elementos de la tabla
base.
Si una tabla contiene un elemento en el que no se ha definido un atributo determinado, pero ese atributo se
ha definido como clave de ordenacin del ndice, DynamoDB no escribir ningn dato para ese elemento
en el ndice. Para obtener ms informacin sobre este comportamiento, consulte Saque partido de los
ndices dispersos (p. 714).
Colecciones de elementos
Note
La siguiente seccin solo concierne a las tablas que tienen ndices secundarios locales.
En DynamoDB, una coleccin de elementos es cualquier grupo de elementos que tienen el mismo
valor de clave de particin en una tabla y en todos los ndices secundarios locales. En los ejemplos
utilizadas en esta seccin, la clave de particin de la tabla Thread es ForumName y la clave de particin
de LastPostIndex tambin es ForumName. Todos los elementos de la tabla y del ndice que tienen el
mismo valor de ForumName forman parte de la misma coleccin de elementos. Por ejemplo, en la tabla
Thread y en el local secondary index LastPostIndex, hay una coleccin de elementos para el foro EC2 y
otra coleccin de elementos distinta para el foro RDS.
En este diagrama, la coleccin de elementos consta de todos los elementos de Thread y LastPostIndex
cuyo valor de clave de particin ForumName es "S3". Si hay otros ndices secundarios locales en la tabla,
los elementos de esos ndices cuyo valor de ForumName sea "S3" tambin formarn parte de la coleccin
de elementos.
Puede utilizar cualquiera de las siguientes operaciones de DynamoDB para devolver informacin sobre las
colecciones de elementos:
BatchWriteItem
DeleteItem
PutItem
UpdateItem
Example
A continuacin se muestra un fragmento del resultado de una operacin UpdateItem en la tabla Thread,
donde ReturnItemCollectionMetrics se ha establecido en SIZE. El elemento que se ha actualizado
tena un valor de ForumName de "EC2", por lo que el resultado incluye informacin acerca de esa
coleccin de elementos.
{
ItemCollectionMetrics: {
ItemCollectionKey: {
ForumName: "EC2"
},
SizeEstimateRangeGB: [0.0, 1.0]
}
}
Si una coleccin de elementos supera el lmite de 10 GB, DynamoDB devolver una excepcin
ItemCollectionSizeLimitExceededException y ya no podr agregar ms elementos a la coleccin
de elementos ni incrementar los tamaos de los elementos contenidos en ella. Las operaciones de lectura
y escritura que reduzcan el tamao de la coleccin de elementos s se permitirn. Tambin podr agregar
elementos a otras colecciones de elementos.
Para reducir el tamao de una coleccin de elementos, puede elegir una de las siguientes opciones:
Eliminar todos los elementos innecesarios que tengan el valor de clave de particin de que se trate. Al
eliminar estos elementos de la tabla base, DynamoDB tambin eliminar las entradas de ndice cuyo
valor de clave de particin sea el mismo.
Actualizar los elementos eliminando atributos o reduciendo el tamao de estos ltimos. Si estos atributos
se han proyectado en uno o varios ndices secundarios locales, DynamoDB tambin reducir el tamao
de las entradas de ndice correspondientes.
Crear una nueva tabla con las mismas clave de particin y clave de ordenacin y, a continuacin,
mover elementos de la tabla anterior a la nueva. Esto puede ser conveniente si una tabla contiene datos
histricos a los que se obtiene acceso con poca frecuencia. Tambin puede ser interesante archivar
estos datos histricos en Amazon Simple Storage Service (Amazon S3).
Cuando el tamao total de la coleccin de elementos disminuye por debajo de 10 GB, podr volver a
agregar elementos con el mismo valor de clave de particin.
Como prctica recomendada, es preferible instrumentar la aplicacin de tal forma que monitorice
los tamaos de las colecciones de elementos. Una forma de hacerlo es establecer el parmetro
ReturnItemCollectionMetrics en SIZE siempre que utilice BatchWriteItem, DeleteItem,
PutItem o UpdateItem. La aplicacin debe examinar el objeto ReturnItemCollectionMetrics en
los resultados y registrar un mensaje de error cada vez que una coleccin de elementos supere un lmite
definido por el usuario (8GB, por ejemplo). Establecer un lmite menor que 10 GB ofrece un mecanismo de
advertencia precoz sistema que le permitir saber qu coleccin de elementos est prxima a alcanzar el
lmite a tiempo para adoptar las medidas pertinentes.
Debe disear las aplicaciones de tal forma que los datos de las tablas se distribuyan uniformemente
entre los distintos valores de clave de particin. Para las tablas que tienen ndices secundarios locales,
las aplicaciones no deben crear "puntos calientes" de actividad de lectura y escritura dentro de una
misma coleccin de elementos de una sola particin. Para obtener ms informacin, consulte Prcticas
recomendadas para las tablas (p. 697).
Puede utilizar el API de documentos del AWS SDK for Java para crear una tabla con uno o varios ndices
secundarios locales, describir los ndices de la tabla y utilizarlos para realizar consultas.
A continuacin se indican los pasos comunes para las operaciones con tablas mediante el API de
documentos del AWS SDK for Java.
A continuacin se indican los pasos que hay que seguir para crear una tabla con un local secondary index
utilizando el API de documentos de DynamoDB.
Debe proporcionar el nombre de la tabla, su clave principal y los valores de desempeo provisionado.
Para el local secondary index, debe proporcionar el nombre de ndice, el nombre y el tipo de datos de la
clave de ordenacin del ndice, el esquema de claves del ndice y la proyeccin de atributos.
3. Llame al mtodo createTable proporcionando el objeto de solicitud como parmetro.
En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores. En el fragmento se
crea una tabla (Music) con un ndice secundario basado en el atributo AlbumTitle. La clave de particin y
la clave de ordenacin de la tabla, adems de la clave de ordenacin del ndice, son los nicos atributos
proyectados en el ndice.
//ProvisionedThroughput
createTableRequest.setProvisionedThroughput(new
ProvisionedThroughput().withReadCapacityUnits((long)5).withWriteCapacityUnits((long)5));
//AttributeDefinitions
ArrayList<AttributeDefinition> attributeDefinitions= new ArrayList<AttributeDefinition>();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Artist").withAttributeType("S"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("SongTitle").withAttributeType("S"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("AlbumTitle").withAttributeType("S"));
createTableRequest.setAttributeDefinitions(attributeDefinitions);
//KeySchema
ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>();
tableKeySchema.add(new
KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH)); //Partition
key
tableKeySchema.add(new
KeySchemaElement().withAttributeName("SongTitle").withKeyType(KeyType.RANGE)); //Sort key
createTableRequest.setKeySchema(tableKeySchema);
.withIndexName("AlbumTitleIndex").withKeySchema(indexKeySchema).withProjection(projection);
Debe esperar hasta que DynamoDB cree la tabla y establezca el estado de esta ltima en ACTIVE. A partir
de ese momento, puede comenzar a incluir elementos de datos en la tabla.
A continuacin se indican los pasos que hay que seguir para obtener acceso a la informacin de un local
secondary index de una tabla mediante el API de documentos del AWS SDK for Java.
Example
List<LocalSecondaryIndexDescription> localSecondaryIndexes
= tableDescription.getLocalSecondaryIndexes();
// This code snippet will work for multiple indexes, even though
// there is only one index in this example.
Los nicos atributos devueltos son aquellos que se han proyectado en el ndice. Puede modificar esta
consulta de modo que tambin seleccione atributos sin clave, pero esto requerira realizar actividad
de recuperacin en la tabla, lo que resulta relativamente costoso. Para obtener ms informacin sobre
recuperaciones de tablas, consulte Proyecciones de atributos (p. 507).
A continuacin se indican los pasos que hay que seguir para consultar un local secondary index con el API
de documentos del AWS SDK for Java.
Example
while (itemsIter.hasNext()) {
Item item = itemsIter.next();
System.out.println(item.toJSONPretty());
}
Una vez que se ha creado la tabla CustomerOrders, el programa carga la tabla con datos que representan
pedidos de clientes; a continuacin, consulta los datos mediante ndices secundarios locales. Por ltimo, el
programa elimina la tabla CustomerOrders.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo Java (p. 296).
Example
import java.util.ArrayList;
import java.util.Iterator;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Index;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.PutItemOutcome;
import com.amazonaws.services.dynamodbv2.document.QueryOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec;
import com.amazonaws.services.dynamodbv2.document.utils.ValueMap;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.LocalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.Projection;
import com.amazonaws.services.dynamodbv2.model.ProjectionType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ReturnConsumedCapacity;
import com.amazonaws.services.dynamodbv2.model.Select;
createTable();
loadData();
query(null);
query("IsOpenIndex");
query("OrderCreationDateIndex");
deleteTable(tableName);
createTableRequest.setAttributeDefinitions(attributeDefinitions);
// key
tableKeySchema.add(new
KeySchemaElement().withAttributeName("OrderId").withKeyType(KeyType.RANGE)); // Sort
// key
createTableRequest.setKeySchema(tableKeySchema);
// OrderCreationDateIndex
LocalSecondaryIndex orderCreationDateIndex = new
LocalSecondaryIndex().withIndexName("OrderCreationDateIndex");
// key
indexKeySchema.add(new
KeySchemaElement().withAttributeName("OrderCreationDate").withKeyType(KeyType.RANGE)); //
Sort
// key
orderCreationDateIndex.setKeySchema(indexKeySchema);
orderCreationDateIndex.setProjection(projection);
localSecondaryIndexes.add(orderCreationDateIndex);
// IsOpenIndex
LocalSecondaryIndex isOpenIndex = new
LocalSecondaryIndex().withIndexName("IsOpenIndex");
// key
indexKeySchema.add(new
KeySchemaElement().withAttributeName("IsOpen").withKeyType(KeyType.RANGE)); // Sort
// key
isOpenIndex.setKeySchema(indexKeySchema);
isOpenIndex.setProjection(projection);
localSecondaryIndexes.add(isOpenIndex);
System.out.println("\n***********************************************************
\n");
System.out.println("Querying table " + tableName + "...");
if (indexName == "IsOpenIndex") {
querySpec.withProjectionExpression("OrderCreationDate, ProductCategory,
ProductName, OrderStatus");
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
else if (indexName == "OrderCreationDateIndex") {
System.out.println("\nUsing index: '" + indexName + "': Bob's orders that were
placed after 01/31/2015.");
System.out.println("Only the projected attributes are returned\n");
Index index = table.getIndex(indexName);
querySpec.withSelect(Select.ALL_PROJECTED_ATTRIBUTES);
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
else {
System.out.println("\nNo index: All of Bob's orders, by OrderId:\n");
querySpec.withKeyConditionExpression("CustomerId = :v_custid")
.withValueMap(new ValueMap().withString(":v_custid", "bob@example.com"));
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
putItemOutcome = table.putItem(item);
assert putItemOutcome != null;
}
Ejemplo: Creacin de ndices secundarios locales mediante el API de bajo nivel del AWS SDK
para .NET (p. 529)
Puede utilizar el API de bajo nivel del AWS SDK para .NET para crear una tabla con uno o varios ndices
secundarios locales, describir los ndices de la tabla y utilizarlos para realizar consultas. Estas operaciones
se mapean a las acciones correspondientes del API de bajo nivel de DynamoDB. Para obtener ms
informacin, consulte Ejemplos de cdigo de .NET (p. 298).
A continuacin se indican los pasos comunes para las operaciones con tablas mediante el API de bajo
nivel de .NET.
Por ejemplo, cree un objeto CreateTableRequest para crear una tabla y un objeto QueryRequest
para consultar una tabla o un ndice.
3. Ejecute el mtodo apropiado proporcionado por el cliente que ha creado en el paso anterior.
A continuacin se indican los pasos que hay que seguir para crear una tabla con un local secondary index
mediante el API de bajo nivel de .NET.
Debe proporcionar el nombre de la tabla, su clave principal y los valores de desempeo provisionado.
Para el local secondary index, debe proporcionar el nombre de ndice, el nombre y el tipo de datos de la
clave de ordenacin del ndice, el esquema de claves del ndice y la proyeccin de atributos.
3. Ejecute el mtodo CreateTable proporcionando el objeto de solicitud como parmetro.
//ProvisionedThroughput
createTableRequest.ProvisionedThroughput = new ProvisionedThroughput()
{
ReadCapacityUnits = (long)5,
WriteCapacityUnits = (long)5
};
//AttributeDefinitions
List<AttributeDefinition> attributeDefinitions = new List<AttributeDefinition>();
attributeDefinitions.Add(new AttributeDefinition()
{
AttributeName = "Artist",
AttributeType = "S"
});
attributeDefinitions.Add(new AttributeDefinition()
{
AttributeName = "SongTitle",
AttributeType = "S"
});
attributeDefinitions.Add(new AttributeDefinition()
{
AttributeName = "AlbumTitle",
AttributeType = "S"
});
createTableRequest.AttributeDefinitions = attributeDefinitions;
//KeySchema
List<KeySchemaElement> tableKeySchema = new List<KeySchemaElement>();
createTableRequest.KeySchema = tableKeySchema;
Debe esperar hasta que DynamoDB cree la tabla y establezca el estado de esta ltima en ACTIVE. A partir
de ese momento, puede comenzar a incluir elementos de datos en la tabla.
A continuacin se indican los pasos que hay que seguir para obtener acceso a la informacin de un local
secondary index de una tabla mediante el API de bajo nivel de .NET.
Example
// This code snippet will work for multiple indexes, even though
// there is only one index in this example.
foreach (LocalSecondaryIndexDescription lsiDescription in localSecondaryIndexes)
{
Console.WriteLine("Info for index " + lsiDescription.IndexName + ":");
if (projection.ProjectionType.ToString().Equals("INCLUDE"))
{
Console.WriteLine("\t\tThe non-key projected attributes are:");
}
}
Los nicos atributos devueltos son aquellos que se han proyectado en el ndice. Puede modificar esta
consulta de modo que tambin seleccione atributos sin clave, pero esto requerira realizar actividad
de recuperacin en la tabla, lo que resulta relativamente costoso. Para obtener ms informacin sobre
recuperaciones de tablas, consulte Proyecciones de atributos (p. 507).
A continuacin se indican los pasos que hay que seguir para consultar un local secondary index mediante
el API de bajo nivel de .NET.
Example
Una vez que se ha creado la tabla CustomerOrders, el programa carga la tabla con datos que representan
pedidos de clientes; a continuacin, consulta los datos mediante ndices secundarios locales. Por ltimo, el
programa elimina la tabla CustomerOrders.
Para obtener instrucciones paso a paso sobre cmo realizar las pruebas del ejemplo siguiente, consulte
Ejemplos de cdigo de .NET (p. 298).
Example
using System;
using System.Collections.Generic;
using System.Linq;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class LowLevelLocalSecondaryIndexExample
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
private static string tableName = "CustomerOrders";
Query(null);
Query("IsOpenIndex");
Query("OrderCreationDateIndex");
DeleteTable(tableName);
{ new AttributeDefinition() {
AttributeName = "CustomerId", AttributeType = "S"
} },
{ new AttributeDefinition() {
AttributeName = "OrderId", AttributeType = "N"
} },
// Attribute definitions for index primary key
{ new AttributeDefinition() {
AttributeName = "OrderCreationDate", AttributeType = "N"
} },
{ new AttributeDefinition() {
AttributeName = "IsOpen", AttributeType = "N"
}}
};
createTableRequest.AttributeDefinitions = attributeDefinitions;
createTableRequest.KeySchema = tableKeySchema;
// OrderCreationDateIndex
LocalSecondaryIndex orderCreationDateIndex = new LocalSecondaryIndex()
{
IndexName = "OrderCreationDateIndex"
};
orderCreationDateIndex.KeySchema = indexKeySchema;
orderCreationDateIndex.Projection = projection;
localSecondaryIndexes.Add(orderCreationDateIndex);
// IsOpenIndex
LocalSecondaryIndex isOpenIndex
= new LocalSecondaryIndex()
{
IndexName = "IsOpenIndex"
};
isOpenIndex.KeySchema = indexKeySchema;
isOpenIndex.Projection = projection;
localSecondaryIndexes.Add(isOpenIndex);
Console.WriteLine("\n***********************************************************\n");
Console.WriteLine("Querying table " + tableName + "...");
if (indexName == "IsOpenIndex")
{
// ProjectionExpression
queryRequest.ProjectionExpression = "OrderCreationDate, ProductCategory,
ProductName, OrderStatus";
}
else if (indexName == "OrderCreationDateIndex")
{
Console.WriteLine("\nUsing index: '" + indexName
+ "': Bob's orders that were placed after 01/31/2013.");
Console.WriteLine("Only the projected attributes are returned\n");
queryRequest.IndexName = indexName;
// Select
queryRequest.Select = "ALL_PROJECTED_ATTRIBUTES";
}
else
{
Console.WriteLine("\nNo index: All of Bob's orders, by OrderId:\n");
}
queryRequest.KeyConditionExpression = keyConditionExpression;
queryRequest.ExpressionAttributeValues = expressionAttributeValues;
TableName = tableName
});
WaitForTableToBeDeleted(tableName);
}
N = "1"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130111"
};
item["ProductCategory"] = new AttributeValue
{
S = "Movie"
};
item["ProductName"] = new AttributeValue
{
S = "Calm Before The Storm"
};
item["OrderStatus"] = new AttributeValue
{
S = "SHIPPING DELAY"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "859323"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);
};
client.PutItem(putItemRequest);
{
S = "Luggage"
};
item["ProductName"] = new AttributeValue
{
S = "Really Big Suitcase"
};
item["OrderStatus"] = new AttributeValue
{
S = "DELIVERED"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "893927"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);
do
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});
while (tablePresent)
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});
Una aplicacin de una regin de AWS modifica los datos de una tabla de DynamoDB. Una segunda
aplicacin de otra regin de AWS lee estas modificaciones de datos y escribe los datos en otra tabla; al
hacerlo, crea una rplica que permanece sincronizada con la tabla original.
Una popular aplicacin para mviles modifica los datos de una tabla de DynamoDB a razn de miles de
actualizaciones por segundo. Otra aplicacin captura y almacena los datos sobre estas actualizaciones y
ofrece mtricas de uso de la aplicacin para mviles prcticamente en tiempo real.
Un juego multijugador de mbito mundial presenta una topologa con varias versiones maestras que
almacenan los datos en distintas regiones de AWS. Para permanecer sincronizada, cada versin
maestra consume y reproduce los cambios que se producen en las regiones remotas.
Una aplicacin enva automticamente notificaciones a los dispositivos mviles de todos los amigos de
un grupo tan pronto como uno de ellos carga una nueva imagen.
Un nuevo cliente agrega datos a una tabla de DynamoDB. Este evento invoca otra aplicacin que enva
un mensaje de correo electrnico de bienvenida al nuevo cliente.
Flujos de DynamoDB hace posibles soluciones como estas y muchas otras. Flujos de DynamoDB captura
una secuencia en orden cronolgico de las modificaciones de los elementos en una tabla de DynamoDB
y almacena esta informacin en un log durante un mximo de 24horas. Las aplicaciones pueden obtener
acceso a este registro y ver los elementos de datos tal y como se encontraban antes y despus de la
modificacin, prcticamente en tiempo real.
Una secuencia de DynamoDB es un flujo ordenado de informacin sobre los cambios que se realizan
en los elementos de una tabla de Amazon DynamoDB. Cuando se habilita una secuencia en una tabla,
DynamoDB obtiene informacin sobre cada modificacin de los elementos de datos de esa tabla.
Cada vez que una aplicacin crea, actualiza o elimina elementos en la tabla, Flujos de DynamoDB escribe
un registro de secuencia con el o los atributos de clave principal de los elementos modificados. Un registro
de secuencia contiene informacin sobre una modificacin de los datos de un solo elemento de una
tabla de DynamoDB. Puede configurar la secuencia de tal forma que sus registros capturen informacin
adicional; por ejemplo, las imgenes de "antes" y "despus" de los elementos modificados.
Flujos de DynamoDB escribe los registros de secuencia prcticamente en tiempo real, para que se puedan
crear aplicaciones que consuman estas secuencias y adopten medidas en funcin de su contenido.
AWS mantiene puntos de enlace distintos para DynamoDB y Flujos de DynamoDB. Para usar las tablas
y los ndices de la base de datos, la aplicacin tendr que obtener acceso a un punto de enlace de
DynamoDB. Para leer y procesar los registros de Flujos de DynamoDB, la aplicacin tendr que obtener
acceso a un punto de enlace de Flujos de DynamoDB situado en la misma regin.
Para obtener una lista completa de las regiones y los puntos de enlace de DynamoDB y Flujos de
DynamoDB, consulte Regiones y puntos de conexin de AWS en la AWS General Reference.
Los SDK de AWS proporcionan clientes independientes para DynamoDB y Flujos de DynamoDB. Segn
cules sean sus necesidades, la aplicacin puede obtener acceso a un punto de enlace de DynamoDB, a
un punto de enlace de Flujos de DynamoDB o a ambos al mismo tiempo. Para conectarse a ambos puntos
de enlace, la aplicacin tendr que crear instancias de dos clientes: uno para DynamoDB y otro para Flujos
de DynamoDB.
DynamoDB opera de forma asincrnica, por lo que el desempeo de una tabla no se vea afectado al
habilitar una secuencia.
Tambin puede usar los API CreateTable o UpdateTable para habilitar o modificar una secuencia,
respectivamente. El parmetro StreamSpecification determina cmo se configura la secuencia:
StreamEnabled: especifica si una secuencia est habilitada (true) o deshabilitada (false) para la
tabla.
StreamViewType: especifica la informacin que se escribir en la secuencia cada vez que se
modifiquen los datos de la tabla:
KEYS_ONLY: solo los atributos de clave del elemento modificado.
NEW_IMAGE: el elemento completo tal y como aparece despus de modificarlo.
OLD_IMAGE: el elemento completo tal y como apareca antes de modificarlo.
NEW_AND_OLD_IMAGES: ambas imgenes del elemento, la nueva y la anterior.
Puede habilitar o deshabilitar una secuencia en cualquier momento. Sin embargo, tenga en cuenta que
recibir una excepcin ResourceInUseException si intenta habilitar una secuencia en una tabla que ya
tiene una, y una excepcin ValidationException si intenta deshabilitar una secuencia en una tabla que no
tiene ninguna.
Cuando se establece StreamEnabled en true, DynamoDB crea una nueva secuencia con un descriptor
de secuencia nico asignado a ella. Si deshabilitar y vuelve a habilitar una secuencia en la tabla, se crea
una secuencia nueva con un descriptor de secuencia distinto.
Cada secuencia se identifica de forma exclusiva mediante un nombre de recurso de Amazon (ARN). A
continuacin se muestra un ejemplo de ARN de una secuencia de una tabla de DynamoDB denominada
TestTable:
arn:aws:dynamodb:us-west-2:111122223333:table/TestTable/stream/2015-05-11T21:21:33.291
Para determinar el ltimo descriptor de secuencia de una tabla, se emite una solicitud DescribeTable de
DynamoDB y se busca el elemento LatestStreamArn en la respuesta.
Una secuencia consta de registros de secuencia. Cada registro de secuencia representa una nica
modificacin de datos de la tabla de DynamoDB a la que pertenece la secuencia. A cada registro de
secuencia se le asigna un nmero de secuencia que refleja el orden en que el registro se ha publicado en
la secuencia.
Los registros de secuencia se organizan en grupos, o fragmentos. Cada fragmento acta como contenedor
de varios registros de secuencia y contiene la informacin necesaria para obtener acceso a estos registros
y recorrerlos en iteracin. Los registros de secuencia de un fragmento se eliminan automticamente
transcurridas de 24horas.
Los fragmentos son efmeros: se crean y eliminan automticamente, segn sea necesario. Adems,
cualquier fragmento se puede dividir en varios fragmentos nuevos; esto tambin sucede automticamente.
Cabe destacar que un fragmento principal puede tener un solo fragmento secundario. Un fragmento se
puede dividir en respuesta a niveles de actividad de escritura elevados en la tabla principal, para que las
aplicaciones puedan procesar en paralelo los registros de varios fragmentos.
Puesto que los fragmentos poseen un parentesco (principales y secundarios), las aplicaciones siempre
deben procesar los fragmentos principales antes de procesar los secundarios. De este modo se garantiza
que los registros de secuencia se procesen tambin en el orden correcto. Si se utiliza Flujos de DynamoDB
Kinesis Adapter, esto se lleva a cabo de forma automatizada: la aplicacin procesar los fragmentos
y registros de secuencia en el orden correcto y tambin administrar automticamente los fragmentos
nuevos o vencidos, as como aquellos que se dividan mientras se ejecuta la aplicacin. Para obtener
ms informacin, consulte Uso de Flujos de DynamoDB Kinesis Adapter para procesar registros de
secuencia (p. 546).)
En el siguiente diagrama se muestra la relacin entre una secuencia, sus fragmentos y los registros de
secuencia contenidos en los fragmentos.
Note
Si lleva a cabo una operacin PutItem o UpdateItem que no modifica ningn dato de un
elemento, Flujos de DynamoDB no escribe ningn registro de secuencia de esa operacin.
Para obtener acceso a una secuencia y procesar los registros que contiene, proceda como sigue:
Determine el nombre de recurso de Amazon (ARN) nico de la secuencia a la que desea obtener
acceso.
Determine qu fragmento o fragmentos de la secuencia contienen los registros de secuencia que le
interesan.
Obtenga acceso al fragmento o los fragmentos y recupere los registros de secuencia que desee.
Note
Nunca debe haber ms de dos procesos leyendo el mismo fragmento de secuencia a la vez.
Usar ms de dos procesos de lectura por fragmento puede provocar que se aplique la limitacin
controlada.
El API de Flujos de DynamoDB ofrece las siguientes acciones para usarlas en los programas de
aplicacin:
Para obtener descripciones completas de estas acciones del API, as como ejemplos de solicitudes y
respuestas, visite Referencia de la API de Amazon DynamoDB Streams.
Si deshabilita una secuencia en una tabla, los datos de esa secuencia continuarn disponibles para leerlos
durante 24horas. Transcurrido ese tiempo, los datos vencen y los registros de secuencia se eliminan
automticamente. Tenga en cuenta que no existe ningn mecanismo para eliminar manualmente las
secuencias; basta con esperar hasta que se alcance el lmite de retencin (24horas) para que se eliminen
los registros de secuencia.
Los elementos que el proceso Tiempo de vida elimina tras su vencimiento tienen los campos siguientes:
Records[<index>].userIdentity.type
"Service"
Records[<index>].userIdentity.principalId
"dynamodb.amazonaws.com"
"Records":[
{
...
"userIdentity":{
"type":"Service",
"principalId":"dynamodb.amazonaws.com"
}
...
]}
En los elementos eliminados por otros usuarios se indica el valor de principalId de la cuenta utilizada
para eliminarlos.
Puede escribir aplicaciones para Kinesis Streams mediante Kinesis Client Library (KCL). KCL simplifica la
codificacin porque proporciona abstracciones tiles por encima del API de bajo nivel de Kinesis Streams.
Para obtener ms informacin sobre KCL, visite Amazon Kinesis Developer Guide.
Como usuario de Flujos de DynamoDB, puede sacar partido de los patrones de diseo contenidos en KCL
para procesar los fragmentos de Flujos de DynamoDB y transmitir registros. Para ello, se utiliza Flujos de
DynamoDB Kinesis Adapter. Kinesis Adapter implementa la interfaz de Kinesis Streams, de tal forma que
se pueda usar KCL para consumir y procesar registros desde Flujos de DynamoDB.
Si Flujos de DynamoDB Kinesis Adapter est implementado, puede comenzar a desarrollar para la interfaz
de KCL y dirigir las llamadas al API de forma transparente al punto de enlace de Flujos de DynamoDB.
Cuando se inicia la aplicacin, llama a KCL para crear una instancia de un proceso de trabajo. Debe
facilitar al proceso de trabajo informacin sobre la configuracin de la aplicacin, como el descriptor de la
secuencia y las credenciales de AWS, as como el nombre de una clase de procesador de registros que
usted proporcione. A medida que el proceso de trabajo ejecuta el cdigo en el procesador de registros,
lleva a cabo las siguientes tareas:
Se conecta a la secuencia.
Enumerates los fragmentos de la secuencia.
Coordina la asociacin de los fragmentos con otros procesos de trabajo (si procede).
Crea instancias de un procesador de registros para cada fragmento que administra.
Extrae registros de la secuencia.
Inserta los registros en el procesador de registros correspondiente.
Note
Para obtener una descripcin de los conceptos de KCL enumerados anteriormente, visite
Desarrollo de consumidores en Amazon Kinesis Streams con la Kinesis Client Library en la
Amazon Kinesis Developer Guide.
1. Crea dos tablas de DynamoDB denominadas KCL-Demo-src y KCL-Demo-dst. En cada una de estas
tablas se ha habilitado una secuencia.
2. Agrega, actualiza y elimina elementos para generar actividad de actualizacin en la tabla de origen. Esto
hace que se escriban datos en la secuencia de la tabla.
3. Lee los registros en la secuencia, los reconstruye como solicitudes de DynamoDB y aplica las
solicitudes a la tabla de destino.
4. Examina las tablas de origen y destino para comprobar que sus contenidos sean idnticos.
5. Efecta una limpieza eliminando las tablas.
Estos pasos se describen en las siguientes secciones y la aplicacin completa se muestra al final del
tutorial.
Temas
Paso1: Crear tablas de DynamoDB (p. 548)
Paso2: Generar actividad de actualizacin en la tabla de origen (p. 549)
Paso3: Procesar la secuencia (p. 549)
Paso4: Comprobar que el contenido de ambas tablas es idntico (p. 550)
Paso 5: Eliminacin (p. 550)
Programa completo: Flujos de DynamoDB Kinesis Adapter (p. 551)
En el siguiente fragmento de cdigo se muestra el cdigo utilizado para crear las dos tablas.
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));
.withProvisionedThroughput(provisionedThroughput).withStreamSpecification(streamSpecification);
En la aplicacin se define una clase auxiliar con mtodos que llaman a las acciones de API PutItem,
UpdateItem y DeleteItem para escribir los datos. En el siguiente fragmento de cdigo se muestra cmo
se utilizan estos mtodos.
Para obtener ms informacin sobre la definicin de la interfaz de KCL, visite Desarrollo de consumidores
en Amazon Kinesis Streams con la Kinesis Client Library en la Amazon Kinesis Developer Guide.
switch (streamRecord.getEventName()) {
case "INSERT":
case "MODIFY":
StreamsAdapterDemoHelper.putItem(dynamoDBClient, tableName,
streamRecord.getDynamodb().getNewImage());
break;
case "REMOVE":
StreamsAdapterDemoHelper.deleteItem(dynamoDBClient, tableName,
streamRecord.getDynamodb().getKeys().get("Id").getN());
}
}
checkpointCounter += 1;
if (checkpointCounter % 10 == 0) {
try {
checkpointer.checkpoint();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
La clase DemoHelper contiene un mtodo ScanTable que llama al API de bajo nivel Scan. En el
siguiente fragmento de cdigo se muestra cmo se utiliza.
if (StreamsAdapterDemoHelper.scanTable(dynamoDBClient, srcTable).getItems()
.equals(StreamsAdapterDemoHelper.scanTable(dynamoDBClient, destTable).getItems())) {
System.out.println("Scan result is equal.");
}
else {
System.out.println("Tables are different!");
}
Paso 5: Eliminacin
La demostracin ha finalizado. Por consiguiente, la aplicacin elimina las tablas de origen y destino.
Consulte el siguiente fragmento de cdigo.
Incluso despus de que las tablas se hayan eliminado, sus secuencias permanecern disponibles durante
un mximo de 24horas; transcurrido este periodo se eliminan automticamente.
dynamoDBClient.deleteTable(new DeleteTableRequest().withTableName(srcTable));
dynamoDBClient.deleteTable(new DeleteTableRequest().withTableName(destTable));
Important
Para ejecutar este programa, utilice polticas con el fin de asegurarse de que la aplicacin cliente
tenga acceso a DynamoDB y a CloudWatch. Para obtener ms informacin, consulte Uso de
polticas basadas en identidad (polticas de IAM) en Amazon DynamoDB (p. 640).
StreamsAdapterDemo.java
StreamsRecordProcessor.java
StreamsRecordProcessorFactory.java
StreamsAdapterDemoHelper.java
StreamsAdapterDemo.java
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.DeleteTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import com.amazonaws.services.dynamodbv2.streamsadapter.AmazonDynamoDBStreamsAdapterClient;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorFactory;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitialPositionInStream;
import
com.amazonaws.services.kinesis.clientlibrary.lib.worker.KinesisClientLibConfiguration;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker;
/**
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("Starting demo...");
dynamoDBClient = AmazonDynamoDBClientBuilder.standard().build();
cloudWatchClient = AmazonCloudWatchClientBuilder.standard().build();
setUpTables();
Thread.sleep(25000);
worker.shutdown();
t.join();
if (StreamsAdapterDemoHelper.scanTable(dynamoDBClient, srcTable).getItems()
.equals(StreamsAdapterDemoHelper.scanTable(dynamoDBClient,
destTable).getItems())) {
System.out.println("Scan result is equal.");
}
else {
System.out.println("Tables are different!");
}
System.out.println("Done.");
cleanupAndExit(0);
}
awaitTableCreation(srcTable);
performOps(srcTable);
}
StreamsRecordProcessor.java
import java.nio.charset.Charset;
import java.util.List;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.streamsadapter.model.RecordAdapter;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessor;
import
com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorCheckpointer;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.ShutdownReason;
import com.amazonaws.services.kinesis.model.Record;
@Override
public void initialize(String shardId) {
checkpointCounter = 0;
}
@Override
public void processRecords(List<Record> records, IRecordProcessorCheckpointer
checkpointer) {
for (Record record : records) {
String data = new String(record.getData().array(), Charset.forName("UTF-8"));
System.out.println(data);
if (record instanceof RecordAdapter) {
com.amazonaws.services.dynamodbv2.model.Record streamRecord =
((RecordAdapter) record)
.getInternalObject();
switch (streamRecord.getEventName()) {
case "INSERT":
case "MODIFY":
StreamsAdapterDemoHelper.putItem(dynamoDBClient, tableName,
streamRecord.getDynamodb().getNewImage());
break;
case "REMOVE":
StreamsAdapterDemoHelper.deleteItem(dynamoDBClient, tableName,
streamRecord.getDynamodb().getKeys().get("Id").getN());
}
}
checkpointCounter += 1;
if (checkpointCounter % 10 == 0) {
try {
checkpointer.checkpoint();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void shutdown(IRecordProcessorCheckpointer checkpointer, ShutdownReason reason)
{
if (reason == ShutdownReason.TERMINATE) {
try {
checkpointer.checkpoint();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
StreamsRecordProcessorFactory.java
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessor;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorFactory;
@Override
public IRecordProcessor createProcessor() {
AmazonDynamoDB dynamoDBClient = AmazonDynamoDBClientBuilder.standard().build();
return new StreamsRecordProcessor(dynamoDBClient, tableName);
}
StreamsAdapterDemoHelper.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.model.AttributeAction;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.CreateTableResult;
import com.amazonaws.services.dynamodbv2.model.DeleteItemRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
import com.amazonaws.services.dynamodbv2.model.ResourceInUseException;
import com.amazonaws.services.dynamodbv2.model.ScanRequest;
import com.amazonaws.services.dynamodbv2.model.ScanResult;
import com.amazonaws.services.dynamodbv2.model.StreamSpecification;
import com.amazonaws.services.dynamodbv2.model.StreamViewType;
import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest;
/**
* @return StreamArn
*/
public static String createTable(AmazonDynamoDB client, String tableName) {
java.util.List<AttributeDefinition> attributeDefinitions = new
ArrayList<AttributeDefinition>();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));
// key
.withProvisionedThroughput(provisionedThroughput).withStreamSpecification(streamSpecification);
try {
System.out.println("Creating table " + tableName);
CreateTableResult result = client.createTable(createTableRequest);
return result.getTableDescription().getLatestStreamArn();
}
catch (ResourceInUseException e) {
System.out.println("Table already exists.");
return describeTable(client, tableName).getTable().getLatestStreamArn();
}
}
Note
Este cdigo no controla todas las excepciones y no funcionar de forma fiable en condiciones
de trfico intenso. La manera recomendada de consumir registros de secuencia de DynamoDB
consiste en usar Kinesis Adapter con la Kinesis Client Library (KCL), tal y como se describe en
Uso de Flujos de DynamoDB Kinesis Adapter para procesar registros de secuencia (p. 546).
Estos pasos se describen en las siguientes secciones y la aplicacin completa se muestra al final del
tutorial.
Temas
Paso1: Crear una tabla con una secuencia habilitada (p. 558)
Paso2: Describir los ajustes de secuencia de la tabla (p. 558)
Paso3: Modificar los datos de la tabla (p. 559)
Paso4: Describir los fragmentos de la secuencia (p. 559)
Paso5: Leer los registros de secuencia (p. 559)
Paso 6: Eliminacin (p. 560)
Programa completo: API de bajo nivel de Flujos de DynamoDB (p. 560)
ArrayList<AttributeDefinition> attributeDefinitions =
new ArrayList<AttributeDefinition>();
attributeDefinitions.add(new AttributeDefinition()
.withAttributeName("Id")
.withAttributeType("N"));
int numChanges = 0;
System.out.println("Making some changes to table data");
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("Id", new AttributeValue().withN("101"));
item.put("Message", new AttributeValue().withS("New item!"));
dynamoDBClient.putItem(tableName, item);
numChanges++;
dynamoDBClient.deleteItem(tableName, key);
numChanges++;
En Paso2: Describir los ajustes de secuencia de la tabla (p. 558), hemos determinado el ARN de la
secuencia actual y se lo hemos asignado a la variable myStreamArn. Podemos utilizarlo con la accin
DescribeStream para obtener los fragmentos de la secuencia.
Puesto que no hemos modificado muchos datos en la tabla de DynamoDB, solamente habr un fragmento
en la lista. En el siguiente fragmento de cdigo se muestra cmo obtener esta informacin.
DescribeStreamResult describeStreamResult =
streamsClient.describeStream(new DescribeStreamRequest()
.withStreamArn(myStreamArn));
String streamArn =
describeStreamResult.getStreamDescription().getStreamArn();
List<Shard> shards =
describeStreamResult.getStreamDescription().getShards();
En el siguiente fragmento de cdigo se utiliza un bucle para procesar la lista de fragmentos, aunque solo
haya uno.
// Use the iterator to read the data records from the shard
GetRecordsResult getRecordsResult =
streamsClient.getRecords(new GetRecordsRequest().
withShardIterator(nextItr));
List<Record> records = getRecordsResult.getRecords();
System.out.println("Getting records...");
for (Record record : records) {
System.out.println(record);
numChanges--;
}
nextItr = getRecordsResult.getNextShardIterator();
}
}
Paso 6: Eliminacin
La demostracin ha finalizado, as que podemos eliminar la tabla. Tenga en cuenta que la secuencia
asociada a esta tabla seguir estando disponible para leerla aunque eliminemos la tabla. La secuencia se
eliminar automticamente transcurridas 24horas.
dynamoDBClient.deleteTable(tableName);
Example
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.amazonaws.AmazonClientException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBStreams;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBStreamsClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeAction;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeStreamRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeStreamResult;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import com.amazonaws.services.dynamodbv2.model.GetRecordsRequest;
import com.amazonaws.services.dynamodbv2.model.GetRecordsResult;
import com.amazonaws.services.dynamodbv2.model.GetShardIteratorRequest;
import com.amazonaws.services.dynamodbv2.model.GetShardIteratorResult;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.Record;
import com.amazonaws.services.dynamodbv2.model.Shard;
import com.amazonaws.services.dynamodbv2.model.ShardIteratorType;
import com.amazonaws.services.dynamodbv2.model.StreamSpecification;
import com.amazonaws.services.dynamodbv2.model.StreamViewType;
import com.amazonaws.services.dynamodbv2.util.TableUtils;
AmazonDynamoDBStreams streamsClient =
AmazonDynamoDBStreamsClientBuilder.standard().build();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));
try {
TableUtils.waitUntilActive(dynamoDBClient, tableName);
} catch (AmazonClientException e) {
e.printStackTrace();
}
int numChanges = 0;
System.out.println("Making some changes to table data");
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("Id", new AttributeValue().withN("101"));
item.put("Message", new AttributeValue().withS("New item!"));
dynamoDBClient.putItem(tableName, item);
numChanges++;
dynamoDBClient.deleteItem(tableName, key);
numChanges++;
.withShardId(shardId).withShardIteratorType(ShardIteratorType.TRIM_HORIZON);
GetShardIteratorResult getShardIteratorResult =
streamsClient.getShardIterator(getShardIteratorRequest);
String nextItr = getShardIteratorResult.getShardIterator();
// Use the iterator to read the data records from the shard
System.out.println("Demo complete");
}
}
}
https://github.com/awslabs/dynamodb-cross-region-library/blob/master/README.md
La solucin de replicacin entre regiones de DynamoDB utiliza la biblioteca de replicacin entre regiones
de Amazon DynamoDB. Esta biblioteca utiliza Flujos de DynamoDB para mantener sincronizadas las
tablas de DynamoDB entre varias regiones prcticamente en tiempo real. Al escribir en una tabla de
DynamoDB de una regin, la biblioteca de replicacin entre regiones propaga automticamente los
cambios a las tablas de otras regiones.
Puede aprovechar la biblioteca de replicacin entre regiones en sus propias aplicaciones, para crear sus
propias soluciones de replicacin con Flujos de DynamoDB. Para obtener ms informacin y descargar el
cdigo fuente, vaya al siguiente repositorio de GitHub:
https://github.com/awslabs/dynamodb-cross-region-library
Amazon DynamoDB se integra con AWS Lambda para que pueda crear disparadores, a saber, fragmentos
de cdigo que responden automticamente a los eventos de Flujos de DynamoDB. Con los disparadores,
puede crear aplicaciones que reaccionan ante las modificaciones de datos en las tablas de DynamoDB.
Si habilita Flujos de DynamoDB en una tabla, puede asociar el ARN de la secuencia con una funcin
Lambda que haya escrito. Inmediatamente despus de modificar un elemento de la tabla, aparece un
nuevo registro en la secuencia de la tabla. AWS Lambda sondea la secuencia y llama a la funcin Lambda
de forma sincrnica cuando detecta nuevos registros en l.
La funcin Lambda pueden realizar cualquier accin que especifique, como, por ejemplo, enviar una
notificacin o iniciar un flujo de trabajo. Por ejemplo, puede escribir una funcin Lambda que simplemente
copie cada registro del secuencia en el almacenamiento persistente, como Amazon Simple Storage
Service (Amazon S3), para crear un rastro de auditora permanente de la actividad de escritura que tiene
lugar en la tabla. O bien supongamos que tiene una aplicacin de juegos para mviles que escribe en una
tabla GameScores. Cada vez que se actualiza el atributo TopScore de la tabla GameScores, se escribe
el registro correspondiente en la secuencia de la tabla. Este evento, a su vez, puede activar una funcin
Lambda que publique un mensaje de felicitacin en una red social. Sencillamente, la funcin deber
pasar por alto todos los registros de secuencia que no sean actualizaciones de GameScores o que no
modifiquen el atributo TopScore.
Para obtener ms informacin sobre AWS Lambda, consulte AWS Lambda Developer Guide.
En este tutorial, vamos a crear un disparador AWS Lambda para procesar la secuencia de una tabla
DynamoDB.
El escenario en que tiene lugar este tutorial es Woofer, una red social sencilla. Los usuarios de Woofer se
comunican utilizando ladridos (mensajes de texto breves) que se envan a otros usuarios de Woofer. En el
siguiente diagrama se muestran los componentes y el flujo de trabajo de esta aplicacin:
1. Un usuario escribe un elemento en una tabla de DynamoDB (BarkTable). Cada elemento de la tabla
representa un ladrido.
2. Se escribe un nuevo registro de secuencia para reflejar que se ha agregado un elemento nuevo a
BarkTable.
3. El nuevo registro de secuencia activa una funcin AWS Lambda (publishNewBark).
4. Si el registro de secuencia indica que se ha agregado un nuevo elemento a BarkTable, la funcin
Lambda lee los datos del registro de secuencia y publica un mensaje en un tema de Amazon Simple
Notification Service (Amazon SNS).
5. Los suscriptores a ese tema de Amazon SNS reciben el mensaje. En este tutorial, el nico suscriptor es
una direccin de correo electrnico.
Antes de empezar
En este tutorial se utiliza la AWS Command Line Interface. Si an no lo ha hecho, siga las instrucciones
que figuran en la AWS Command Line Interface Gua del usuario para instalar y configurar la AWS CLI.
BarkTable tendr una secuencia habilitada. Ms adelante en este tutorial, asociaremos una funcin AWS
Lambda a la secuencia para crear un disparador.
--key-schema AttributeName=Username,KeyType=HASH
AttributeName=Timestamp,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
...
"LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp
...
Anote el valor de region y accountID, porque los necesitar para los dems pasos de este tutorial.
Asimismo, vamos a crear una poltica para el rol. La poltica contendr todos los permisos que la funcin
Lambda va a necesitar en tiempo de ejecucin.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:region:accountID:function:publishNewBark*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:region:accountID:*"
},
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeStream",
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:ListStreams"
],
"Resource": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/*"
},
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": [
"*"
]
}
]
}
La poltica tiene cuatro instrucciones que permiten que WooferLambdaRole realice las siguientes
acciones:
Ejecutar una funcin Lambda (publishNewBark). Crearemos la funcin ms adelante en este tutorial.
Obtener acceso a CloudWatch Logs. La funcin Lambda escribir diagnsticos en CloudWatch Logs
en tiempo de ejecucin.
Leer datos de la secuencia de DynamoDB relativos a BarkTable.
Publicar mensajes en Amazon SNS.
4. Escriba el siguiente comando para adjuntar la poltica a WooferLambdaRole:
2. Escriba el siguiente comando para suscribir una direccin de correo electrnico a wooferTopic.
Sustituya region y accountID por su regin de AWS y su identificador de cuenta; adems, sustituya
example@example.com por una direccin de correo electrnico vlida.
--topic-arn arn:aws:sns:region:accountID:wooferTopic \
--protocol email \
--notification-endpoint example@example.com
3. Amazon SNS enviar un mensaje de confirmacin a la direccin de correo electrnico indicada. Haga
clic en el enlace Confirm subscription del mensaje para completar el proceso de suscripcin.
La funcin publishNewBark solamente procesa los eventos de la secuencia que corresponden a elementos
nuevos de BarkTable. La funcin lee los datos de esos eventos y, a continuacin, llama a Amazon SNS
para publicarlos.
'use strict';
var AWS = require("aws-sdk");
var sns = new AWS.SNS();
event.Records.forEach((record) => {
console.log('Stream record: ', JSON.stringify(record, null, 2));
if (record.eventName == 'INSERT') {
var who = JSON.stringify(record.dynamodb.NewImage.Username.S);
var when = JSON.stringify(record.dynamodb.NewImage.Timestamp.S);
var what = JSON.stringify(record.dynamodb.NewImage.Message.S);
var params = {
Subject: 'A new bark from ' + who,
Message: 'Woofer user ' + who + ' barked the following at ' + when + ':
\n\n ' + what,
TopicArn: 'arn:aws:sns:region:accountID:wooferTopic'
};
sns.publish(params, function(err, data) {
if (err) {
console.error("Unable to send message. Error JSON:",
JSON.stringify(err, null, 2));
} else {
console.log("Results from sending message: ", JSON.stringify(data,
null, 2));
}
});
}
});
callback(null, `Successfully processed ${event.Records.length} records.`);
};
2. Cree un archivo zip que contenga publishNewBark.js. Si tiene la utilidad de lnea de comandos
zip, puede escriba el siguiente comando para hacerlo:
3. Al crear la funcin Lambda, se especifica el ARN de WooferLambdaRole, que cre en Paso 2: Crear
un rol de ejecucin para Lambda (p. 566). Escriba el comando siguiente para recuperar este ARN:
...
"Arn": "arn:aws:iam::region:role/service-role/WooferLambdaRole"
...
A continuacin, escriba el comando siguiente para crear la funcin Lambda. Sustituya roleARN por el
ARN de WooferLambdaRole.
4. Ahora, vamos a probar publishNewBark para asegurarnos de que funciona. Para ello, le facilitaremos
informacin de entrada que parezca un registro autntico de Flujos de DynamoDB.
{
"Records": [
{
"eventID": "7de3041dd709b024af6f29e4fa13d34c",
"eventName": "INSERT",
"eventVersion": "1.1",
"eventSource": "aws:dynamodb",
"awsRegion": "us-west-2",
"dynamodb": {
"ApproximateCreationDateTime": 1479499740,
"Keys": {
"Timestamp": {
"S": "2016-11-18:12:09:36"
},
"Username": {
"S": "John Doe"
}
},
"NewImage": {
"Timestamp": {
"S": "2016-11-18:12:09:36"
},
"Message": {
"S": "This is a bark from the Woofer social network"
},
"Username": {
"S": "John Doe"
}
},
"SequenceNumber": "13021600000000001596893679",
"SizeBytes": 112,
"StreamViewType": "NEW_IMAGE"
},
"eventSourceARN": "arn:aws:dynamodb:us-east-1:123456789012:table/BarkTable/
stream/2016-11-16T20:42:48.104"
}
]
}
{
"StatusCode": 200
}
...
"LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp
...
2. Escriba el comando siguiente para crear el disparador. Sustituya streamARN por el ARN de la
secuencia real.
--event-source streamARN \
--batch-size 1 \
--starting-position TRIM_HORIZON
3. Ahora, vamos a probar el disparador. Escriba el siguiente comando para agregar un elemento a
BarkTable:
La funcin Lambda procesa solamente los elementos nuevos que se agregan a BarkTable. Si
actualiza o elimina un elemento de la tabla, la funcin no hace nada.
Note
prcticas recomendadas
Una funcin AWS Lambda se ejecuta dentro de un contenedor, a saber, un entorno de ejecucin aislado
de las dems funciones. Cuando se ejecuta una funcin por primera vez, AWS Lambda crea un nuevo
contenedor y comienza a ejecutar el cdigo de la funcin.
Una funcin Lambda posee un controlador que se ejecuta una vez en cada invocacin. El controlador
contiene la lgica empresarial principal de la funcin. Por ejemplo, la funcin Lambda que se muestra
en Paso 4: Crear y probar una funcin Lambda (p. 568) tiene un controlador que puede procesar los
registros de una secuencia de DynamoDB.
Tambin puede proporcionar cdigo de inicializacin que se ejecuta una sola vez despus de crear el
contenedor, pero antes de que AWS Lambda ejecute el controlador por primera vez. La funcin Lambda
que se muestra en Paso 4: Crear y probar una funcin Lambda (p. 568) incluye cdigo de inicializacin
que importa el SDK para JavaScript en Node.js y crea un cliente para Amazon SNS. Estos objetos
nicamente deben definirse una vez, fuera del controlador.
Despus de ejecutar la funcin, AWS Lambda puede optar por reutilizar el contenedor en invocaciones
posteriores de la funcin. En este caso, el controlador de la funcin podra volver a utilizar los recursos que
se han definido en el cdigo de inicializacin. Tenga en cuenta que no se puede controlar durante cunto
tiempo AWS Lambda conservar el contenedor ni si este se reutilizar o no.
Para los disparadores de DynamoDB que utilizan AWS Lambda, recomendamos lo siguiente:
Las instancias de los clientes de servicios de AWS deben crearse en el cdigo de inicializacin, no en el
controlador. Esto permitir que AWS Lambda reutilice las conexiones existentes mientras dure la vida til
del contenedor.
En general, no es necesario administrar de forma explcita las conexiones ni implementar la agrupacin
de conexiones, porque AWS Lambda lo hace automticamente.
Para obtener ms informacin, consulte Best Practices for Working with AWS Lambda Functions en la
AWS Lambda Developer Guide.
Temas
Casos de uso de DAX (p. 574)
Notas de uso (p. 574)
Conceptos (p. 575)
Componentes de los clsteres de DAX (p. 578)
Creacin de un clster de DAX (p. 582)
Modelos de consistencia de DAX y DynamoDB (p. 589)
Uso del cliente de DAX en una aplicacin (p. 595)
Administracin de clsteres de DAX (p. 617)
Control de acceso a DAX (p. 623)
Referencia de la API de DAX (p. 634)
Amazon DynamoDB est diseado para facilitar el escalado y mejorar el desempeo. En la mayora
de los casos, los tiempos de respuesta de DynamoDB pueden medirse en milisegundos con cifras de
un solo dgito. No obstante, existen determinados casos de uso que requieren tiempos de respuesta
en microsegundos. Para estos casos de uso, DynamoDB Accelerator (DAX) proporciona tiempos de
respuesta ms breves de acceso a datos de consistencia final.
DAX es un servicio de almacenamiento en cach compatible con DynamoDB que permite beneficiarse
de un rpido desempeo en memoria para las aplicaciones ms exigentes. DAX aborda tres escenarios
principales:
1. Como cach en memoria, DAX reduce los tiempos de respuesta de las cargas de trabajo de lectura
consistente final en un orden de magnitud, de cifras en milisegundos de un solo dgito a microsegundos.
2. DAX reduce la complejidad operativa y de las aplicaciones proporcionando un servicio administrado
que es compatible mediante un API con Amazon DynamoDB y, por consiguiente, solo requiere unos
mnimos cambios funcionales para poder usarlo con una aplicacin existente.
3. Para las cargas de trabajo intensas o en rfagas, DAX ofrece mayor desempeo y un posibles ahorros
en costos, porque disminuye la necesidad de sobreprovisionar las unidades de capacidad de lectura.
Esto resulta especialmente beneficioso para las aplicaciones que requieren lecturas reiteradas de claves
individuales.
Las aplicaciones que requieren realizar lecturas con la mxima rapidez de respuesta posible. Algunos
ejemplos de ello son las aplicaciones de puja en tiempo real, juegos de azar u operaciones comerciales
con valores. DAX proporciona un rpido desempeo en memoria para estos casos de uso.
Las aplicaciones que leen una pequea cantidad de elementos con ms frecuencia que otros. Por
ejemplo, tomemos un sistema de comercio electrnico (e-commerce) que durante un da promociona un
producto popular a menos precio. Durante esta promocin, la demanda de ese producto (y de sus datos
en DynamoDB) experimentara un aumento drstico en comparacin con todos los dems productos.
Para mitigar los efectos de una clave "caliente" y de una distribucin desigual de los datos, podra
delegar la actividad de lectura en una cach de DAX hasta que finalizase el da de promocin.
Las aplicaciones con gran intensidad de lectura sujetas a requisitos de costos. Con DynamoDB, se
provisiona la cantidad de lecturas por segundo que la aplicacin requiere. Si la actividad de lectura
aumenta, puede incrementar el desempeo de lectura provisionado de la tabla (lo que supone un costo
adicional). Si lo prefiere, puede delegar la actividad de la aplicacin en un clster de DAX y reducir la
cantidad de unidades de capacidad de lectura que, de no hacerlo, tendra que adquirir.
Las aplicaciones que requieren realizar lecturas reiteradas de un conjunto de datos voluminoso. Una
aplicacin de este tipo podra desviar recursos de base de datos de otras aplicaciones. Por ejemplo,
un anlisis de los datos meteorolgicos regionales tardara tiempo en ejecutarse y podra consumir
temporalmente toda la capacidad de lectura de una tabla de DynamoDB. Esto tendra un efecto negativo
en otras aplicaciones que necesitasen obtener acceso a los mismos datos. En cambio, con DAX, el
anlisis de los datos meteorolgicos podra llevarse a cabo usando datos almacenados en cach.
Las aplicaciones que requieran lecturas de consistencia alta (o que no toleran las lecturas consistentes
finales).
Las aplicaciones que no requieren tiempos de respuesta en microsegundo para las lecturas o que
necesitan delegar la actividad de lectura reiterada de tablas subyacentes.
Las aplicaciones con gran intensidad de escrituras o sin gran actividad de lectura.
Las aplicaciones que ya utilizan otra solucin de almacenamiento en cach distinta con DynamoDB y
que utilizan su propia lgica del lado del cliente para trabajar con dicha solucin.
Notas de uso
DAX est disponible en las siguientes regiones de AWS:
US East (N. Virginia)
EE.UU. Oeste (Norte de California)
EE.UU. Oeste (Oregn)
UE (Irlanda)
Asia Pacfico (Tokio)
Conceptos
DAX se ha diseado para ejecutarse dentro de un entorno de Amazon Virtual Private Cloud (Amazon
VPC). El servicio Amazon VPC define una red virtual que se parece mucho a un centro de datos
tradicional. Con una Amazon VPC, puede controlar el rango de direcciones IP, las subredes, las tablas de
ruteo, las gateways de red y los ajustes de seguridad. Puede lanzar un clster de DAX en la red virtual y
controlar el acceso al clster mediante grupos de seguridad de Amazon VPC.
Note
Si cre la cuenta de AWS despus del 04/12/2013, ya dispone de una VPC predeterminada en
cada regin de AWS. Las VPC predeterminadas estn listas para usarse; puede comenzar de
inmediato a usarlas sin tener que realizar ningn paso de configuracin adicional.
Para obtener ms informacin, consulte Your Default VPC and Subnets en la Gua del usuario de
Amazon VPC.
Para crear un clster de DAX, se usa la Consola de administracin de AWS. A menos que especifique otra
cosa, el clster de DAX se ejecutar dentro de la VPC predeterminada.
Para ejecutar la aplicacin, lance una instancia Amazon EC2 en la Amazon VPC y, a continuacin,
implemente la aplicacin (con el cliente de DAX) en la instancia EC2. En tiempo de ejecucin, el cliente de
DAX dirige todas las solicitudes de API de DynamoDB de la aplicacin al clster de DAX. Si DAX puede
procesar una de estas solicitudes de API directamente, lo hace; en caso contrario, transmite la solicitud a
DynamoDB. Por ltimo, el clster de DAX devuelve los resultados a la aplicacin.
La aplicacin puede obtener acceso a DAX especificando el punto de enlace del clster de DAX. El
software del cliente de DAX utiliza el punto de enlace del clster para realizar el ruteo y el balanceo de
carga inteligente, para que las solicitudes entrantes se distribuyan de manera uniforme entre todos los
nodos del clster.
Operaciones de lectura
DAX puede responder a las siguientes llamadas al API:
GetItem
BatchGetItem
Query
Scan
Si la solicitud especifica lecturas consistentes finales (el comportamiento predeterminado), intenta leer el
elemento en DAX:
Si el elemento est disponible en DAX (un acierto de cach), DAX devuelve el elemento a la aplicacin
sin obtener acceso a DynamoDB.
Si el elemento no est disponible en DAX (un error de cach), DAX transmite la solicitud a DynamoDB.
Cuando recibe la respuesta de DynamoDB, DAX devuelve los resultados a la aplicacin, pero tambin
los escribe en la cach en el nodo principal.
Note
Si el clster contiene rplicas de lectura, DAX las mantiene automticamente sincronizadas con el
nodo principal. Para obtener ms informacin, consulte Clsteres (p. 578).
Operaciones de escritura
Las siguientes operaciones del API de DAX se consideran de "escritura indirecta" (write-through):
BatchWriteItem
UpdateItem
DeleteItem
PutItem
Con estas operaciones, los datos se escriben primero en la tabla de DynamoDB y, a continuacin, en el
clster de DAX. La operacin solo se lleva a cabo correctamente si los datos se escriben correctamente en
ambos casos: en la tabla y en DAX.
Otras operaciones
DAX no reconoce ninguna operacin de DynamoDB de administracin de tablas (tales como
CreateTable, UpdateTable, etc.). Si la aplicacin tiene que realizar estas operaciones, deber obtener
acceso a DynamoDB directamente, sin usar DAX.
Cach de elementos
DAX mantiene una cach de elementos para almacenar los resultados de las operaciones GetItem y
BatchGetItem. Los elementos de la cach representan datos con consistencia final de DynamoDB y se
almacenan segn sus valores de clave principal.
Cuando una aplicacin enva una solicitud GetItem o BatchGetItem, DAX intenta leer los elementos
directamente en la cach de elementos, para lo cual utiliza los valores de clave especificados. Si encuentra
los elementos (aciertos de cach), DAX los devuelve a la aplicacin de forma inmediata. Si los elementos
no se encuentran (error de cach), DAX enva la solicitud a DynamoDB. DynamoDB procesa las solicitudes
usando lecturas consistentes finales y devuelve los elementos a DAX. DAX los almacena en la cach los
elementos y, a continuacin, los devuelve a la aplicacin.
La cach de elementos tiene un ajuste de tiempo de vida (TTL, por sus siglas en ingls), cuyo valor
predeterminado es de 5minutos. DAX asigna una marca temporal a cada elemento que escribe en la
cach de elementos. Un elemento vence cuando ha permanecido en la cach ms tiempo del indicado
en el ajuste de TTL. Si emite una solicitud GetItem para un elemento vencido, se considera un error de
cach, en cuyo caso DAX enva la solicitud GetItem a DynamoDB.
Note
Puede especificar el ajuste de TTL de la cach de elementos al crear un clster de DAX nuevo.
Para obtener ms informacin, consulte Administracin de clsteres de DAX (p. 617).)
DAX tambin mantiene una lista de elementos menos usados recientemente (LRU, por sus siglas en
ingls) para la cach de elementos. La lista LRU controla cundo se escribi un elemento por primera vez
en la cach y cundo se ley por ltima vez en ella. Si la cach de elementos se llena, DAX expulsar los
elementos ms antiguos (aunque todava no hayan vencido) para dejar espacio a los nuevos. El algoritmo
LRU siempre est habilitado para la cach de elementos y no es configurable por el usuario.
Cach de consultas
DAX tambin mantiene una cach de consultas para almacenar los resultados de las operaciones Query
y Scan. Los elementos de esta cach representan los conjuntos de resultados de las consultas y los
exmenes de las tablas de DynamoDB. Estos conjuntos de resultados se almacenan por los valores de
sus parmetros.
Cuando una aplicacin enva una solicitud Query o Scan, DAX intenta leer un conjunto de resultados
coincidente en la cach de consultas, para lo cual utiliza los valores de los parmetros especificados.
Si encuentra el conjunto de resultados (acierto de cach), DAX lo devuelve a la aplicacin de forma
inmediata. Si el conjunto de resultados no se encuentra (error de cach), DAX enva la solicitud a
DynamoDB. DynamoDB procesa las solicitudes usando lecturas consistentes finales y devuelve el conjunto
de resultados a DAX. DAX lo almacena en la cach los elementos y, a continuacin, lo devuelve a la
aplicacin.
Note
Puede especificar el ajuste de TTL de la cach de consultas al crear un clster de DAX nuevo.
Para obtener ms informacin, consulte Administracin de clsteres de DAX (p. 617).)
DAX tambin mantiene una lista de elementos menos usados recientemente (LRU) para la cach de
consultas. La lista LRU controla cundo se escribi un conjunto de resultados por primera vez en la cach
y cundo se ley por ltima vez en ella. Si la cach de consultas se llena, DAX expulsar los conjuntos de
resultados ms antiguos (aunque todava no hayan vencido) para dejar espacio a los nuevos. El algoritmo
LRU siempre est habilitado para la cach de consultas y no es configurable por el usuario.
Temas
Nodos (p. 578)
Clsteres (p. 578)
Regiones y zonas de disponibilidad (p. 579)
Grupos de parmetros (p. 580)
Security Groups (p. 580)
ARN del clster (p. 580)
Punto de enlace de clster (p. 580)
Puntos de enlace de nodos (p. 580)
Grupos de subredes (p. 581)
Eventos (p. 581)
Maintenance Window (p. 581)
Nodos
Un nodo es el elemento bsico ms pequeo de un clster de DAX. Cada nodo ejecuta una instancia del
software DAX y mantiene una nica rplica de los datos almacenados en cach.
Agregando ms nodos al clster. Con ello aumentar el desempeo de lectura general del clster.
Utilizando un tipo de nodo mayor. Los tipos nodos mayores proporcionan ms capacidad y pueden
aumentar el desempeo. (Tenga en cuenta que debe crear un nuevo clster con el nuevo tipo de nodo.)
dax.r3.large
dax.r3.xlarge
dax.r3.2xlarge
dax.r3.4xlarge
dax.r3.8xlarge
Todos los nodos contenidos en un clster son del mismo tipo y ejecutan el mismo software de
almacenamiento en cach de DAX.
Clsteres
Un clster es una agrupacin lgica de uno o varios nodos que DAX administra como una unidad. Uno de
los nodos del clster se designa como nodo principal y los dems (si los hay), son las rplicas de lectura.
Cuando se producen cambios en los datos almacenados en cach en el nodo principal, DAX propaga los
cambios a todos los nodos de rplica de lectura.
Sin embargo, al contrario que el nodo principal, las rplicas de lectura no escriben en DynamoDB.
Escalabilidad. Si tiene gran cantidad de clientes de aplicacin que deben obtener acceso a DAX
simultneamente, puede agregar ms rplicas para escalar la lectura. DAX distribuir la carga de forma
uniforme entre todos los nodos del clster. (Otra forma de aumentar el desempeo es utilizar tipos de
nodos de cach mayores).
Alta disponibilidad. En el caso de que se produzca un error en el nodo principal, DAX automticamente
realiza una conmutacin por error a una rplica de lectura y la designa como nuevo nodo principal. Si se
produce un error en un nodo de rplica, los dems nodos del clster de DAX continan atendiendo las
solicitudes hasta que se consigue recuperar el nodo defectuoso. Para disfrutar de la mxima tolerancia
a errores, debe implementar rplicas de lectura en zonas de disponibilidad distintas. Esta configuracin
garantiza que el clster de DAX contine funcionando aunque una zona de disponibilidad completa deje
de estar disponible.
Un clster de DAX admite hasta diez nodos por clster (el nodo principal y un mximo de nueve rplicas de
lectura).
Important
Un clster de DAX se pueden implementar con un nico nodo. Aunque esta configuracin podra
ser aceptable para las cargas de trabajo de desarrollo o pruebas, un clster de un solo nodo no
es tolerante a errores y no recomendamos su uso en produccin. Si este nodo nico sufriera
cualquier error, ya sea de software o de hardware, el clster podra dejar de estar disponible o
podran perderse los datos almacenados en cach.
Para su uso en produccin, se recomienda encarecidamente utilizar DAX con al menos tres nodos
(el nodo principal y al menos dos rplicas de lectura) y colocarlos en zonas de disponibilidad
diferentes.
Cada regin se ha diseado para que est totalmente aislada de las dems. Dentro de cada regin hay
varias zonas de disponibilidad. Al lanzar los nodos en zonas de disponibilidad diferentes, puede lograr la
mxima tolerancia a errores.
Important
No coloque todos los nodos del clster en la misma zona de disponibilidad. En una configuracin
as, el clster de DAX dejar de estar disponible en caso de que se produzca un error en la zona
de disponibilidad.
Para su uso en produccin, se recomienda encarecidamente utilizar DAX con al menos tres nodos
(el nodo principal y al menos dos rplicas de lectura) y colocarlos en zonas de disponibilidad
diferentes.
Grupos de parmetros
Los grupos de parmetros se utilizan para administrar los ajustes de tiempo de ejecucin de los clsteres
de DAX. DAX tiene varios parmetros que puede utilizar para optimizar el desempeo (por ejemplo, puede
definir una poltica de TTL para los datos almacenados en cach). Un grupo de parmetros es un conjunto
de parmetros con nombre que se puede aplicar a un clster, a fin de garantizar que todos los nodos de
ese clster estn configurados exactamente de la misma forma.
Security Groups
Un clster de DAX se ejecuta en un entorno de Amazon VPC, que es una red privada virtual en la nube
dedicada a la cuenta de AWS que est aislada de las dems redes Amazon VPC. Un grupo de seguridad
acta como firewall virtual de la VPC y le permite controlar el trfico de red entrante y saliente.
Al lanzar un clster en la VPC, puede agregar una regla de entrada al grupo de seguridad para que permita
el trfico procedente de la red. La regla de entrada especifica el protocolo (TCP) y el nmero de puerto
(8111) del clster. Despus de agregar esta regla de entrada al grupo de seguridad, las aplicaciones que
se ejecutan dentro de la VPC podrn obtener acceso al clster de DAX.
arn:aws:dax:region:accountID:cache/clusterName
El ARN del clster se utiliza en las polticas de IAM para definir los permisos para realizar las acciones del
API de DAX. Para obtener ms informacin, consulte Control de acceso a DAX (p. 623).
myDAXcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111
myDAXcluster-a.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111
La aplicacin puede obtener acceso directamente a un nodo utilizando su punto de enlace; sin embargo,
recomendamos tratar el clster de DAX como una sola unidad y obtener acceso a l mediante el punto de
enlace de clster. El punto de enlace de clster asla la aplicacin para que no tenga que mantener una
lista de nodos ni actualizarla cada vez que se agreguen o eliminen nodos del clster.
Grupos de subredes
El acceso a los nodos del clster de DAX est restringido a las aplicaciones que se ejecutan en instancias
Amazon EC2 en un entorno de Amazon Virtual Private Cloud (Amazon VPC). Puede utilizar grupos de
subredes para conceder acceso al clster desde las instancias Amazon EC2 que se ejecutan en subredes
concretas. Un grupo de subredes es una coleccin de subredes (que suelen ser privadas) que puede
designar para los clsteres que se ejecutan en un entorno de Amazon Virtual Private Cloud (VPC).
Al crear un clster de DAX, debe especificar un grupo de subredes. DAX utiliza dicho grupo de subredes
para seleccionar una subred y direcciones IP perteneciente a ella, y asocirselas a los nodos.
Eventos
DAX registra los eventos significativos que tienen lugar en los clsteres, tales como los errores al agregar
un nodo, las adiciones de nodos correctas o los cambios en los grupos de seguridad. Puede monitorizar
los eventos clave para conocer el estado actual de los clsteres y, segn el evento, adoptar medidas
correctivas. Puede obtener acceso a estos eventos desde la Consola de administracin de AWS o
utilizando la accin DescribeEvents del API de administracin de DAX.
Tambin puede solicitar que las notificaciones se enven a un tema de Amazon SNS concreto, para saber
de inmediato si se ha producido un evento en el clster de DAX.
Maintenance Window
Cada clster tiene un periodo de mantenimiento semanal durante el que se aplican los cambios del
sistema. Si no especifica un periodo de mantenimiento preferido al crear o modificar un clster de cach,
DAX asigna un periodo de mantenimiento de 60minutos un da de la semana seleccionado al azar.
La ventana de mantenimiento debe corresponder al momento de mnimo uso y, por tanto, podra ser
preciso modificarla cada cierto tiempo. Puede especificar un intervalo de tiempo de hasta 24horas durante
las cuales deban llevarse a cabo todas las actividades de mantenimiento que solicite.
Una vez que haya creado el clster de DAX, podr obtener acceso a l desde una instancia Amazon
EC2 que se ejecute en la misma Amazon VPC. A partir de ese momento, podr utilizar el clster de DAX
con un programa de aplicacin. (Para obtener ms informacin, consulte Uso del cliente de DAX en una
aplicacin (p. 595).)
Temas
Creacin de un rol de servicio de DAX (p. 582)
AWS CLI (p. 583)
Consola de administracin de AWS (p. 587)
Si utiliza la Consola de administracin de AWS, el flujo de trabajo para crear un clster comprueba si ya
existe un rol de servicio de DAX. Si no encuentra ninguno, la consola crea un nuevo rol de servicio por
usted. Para obtener ms informacin, consulte Paso 2: Crear un clster de DAX (p. 588) en Consola de
administracin de AWS (p. 587).
Si utiliza la AWS CLI, tendr que especificar un rol de servicio de DAX creado previamente. De lo contrario,
deber crear un nuevo rol de servicio de antemano. Para obtener ms informacin, consulte Paso 1: Crear
un rol de servicio para DAX (p. 584) en AWS CLI (p. 583).
De lo contrario, deber agregar los siguientes permisos a la poltica de IAM para que el usuario de IAM
pueda crear el rol de servicio:
iam:CreateRole
iam:CreatePolicy
iam:AttachRolePolicy
iam:PassRole
para crear una nueva poltica de administrador y adjuntrsela a un rol existente. Por este motivo,
usted (el administrador de su clster de DAX) debe agregar explcitamente estos permisos a la
poltica.
Solucin de problemas
Si la poltica de usuario no incluye los permisos iam:CreateRole, iam:CreatePolicy e
iam:AttachPolicy, se producirn mensajes de error. En la tabla siguiente se muestran estos mensajes
y se indica cmo corregir los problemas.
Para obtener ms informacin sobre las polticas de IAM que se requieren para administrar clsteres de
DAX, consulte Control de acceso a DAX (p. 623).
AWS CLI
Temas
Paso 1: Crear un rol de servicio para DAX (p. 584)
Paso 2: Crear un grupo de subredes (p. 585)
Paso 3: Crear un clster de DAX (p. 586)
Paso 4: Configure las reglas de entrada del grupo de seguridad (p. 586)
En esta seccin se describe cmo crear un clster de DAX mediante la AWS Command Line Interface
(AWS CLI). Si an no lo ha hecho, tendr que instalar y configurar la AWS CLI. Para ello, vaya a la AWS
Command Line Interface Gua del usuario y siga estas instrucciones:
Important
Para administrar clsteres de DAX con la AWS CLI, instale o actualice a la versin 1.11.110 o
superior.
Note
En todos los ejemplos relativos a la AWS CLI se utilizan la regin us-west-2 e identificadores de
cuenta ficticios.
En este paso, se crea una poltica de IAM y, a continuacin, se adjunta a un rol de IAM. Esto le permitir
asignar el rol a un clster de DAX de tal forma que pueda llevar a cabo operaciones de DynamoDB en su
nombre.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "dax.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:us-west-2:accountID:*"
]
}
]
}
Sustituya accountID por el ID de la cuenta de AWS. Para localizar el ID de cuenta de AWS, vaya a la
parte superior derecha de la consola de administracin de AWS y elija su ID de inicio de sesin. El ID
de su cuenta de AWS aparece en el men desplegable. En el ARN, accountID debe ser un nmero
de doce dgitos. No utilice guiones ni ningn otro signo de puntuacin.
En el resultado, tome nota del ARN de la poltica que ha creado. Por ejemplo:
arn:aws:iam::123456789012:policy/DAXServicePolicy
5. Adjunte la poltica al rol de servicio:
Sustituya arn por el ARN real del rol del paso anterior.
Si ya ha creado un grupo de subredes para la VPC predeterminada, puede omitir este paso.
DAX se ha diseado para ejecutarse dentro de un entorno de Amazon Virtual Private Cloud (Amazon
VPC). Si cre la cuenta de AWS despus del 04/12/2013, ya dispone de una VPC predeterminada en cada
regin de AWS. Para obtener ms informacin, consulte Your Default VPC and Subnets en la Gua del
usuario de Amazon VPC.
Durante el proceso de creacin de un clster de DAX, debe especificar un grupo de subredes. Un grupo de
subredes es una coleccin de una o varias subredes de la VPC. Al crear un clster de DAX, los nodos se
implementan en las subredes del grupo de subredes.
vpc-12345678
2. Determine los identificadores de las subredes asociadas a la VPC predeterminada:
En el resultado, tome nota de los identificadores de las subredes. Por ejemplo: subnet-11111111
3. Cree el grupo de subredes. Asegrese de especificar al menos un ID de subred en el parmetro --
subnet-ids:
--subnet-group-name my-subnet-group \
--subnet-ids subnet-11111111 subnet-22222222 subnet-33333333 subnet-44444444
En el resultado, tome nota del ARN del rol de servicio. Por ejemplo:
arn:aws:iam::123456789012:role/DaxServiceRole
2. Ahora ya est preparado para crear el clster de DAX:
Todos los nodos del clster sern de tipo dax.r3.large (--node-type). Habr tres nodos (--
replication-factor), un nodo principal y dos rplicas.
La creacin del clster tardar varios minutos. Cuando el clster est listo, su estado cambiar a
available.
Mientras tanto, puede continuar con Paso 4: Configure las reglas de entrada del grupo de
seguridad (p. 586) y seguir las instrucciones que se facilitan.
Note
Si ha lanzado el clster de DAX con un grupo de seguridad distinto (que no sea default), tendr
que llevar a cabo este procedimiento para ese grupo.
1. Para determinar el identificador del grupo de seguridad predeterminado, escriba el siguiente comando:
Sustituya vpcID por el ID de la VPC real (de Paso 2: Crear un grupo de subredes (p. 585)).
En el resultado, tome nota del identificador del grupo de seguridad. Por ejemplo: sg-01234567
2. Ahora, haga lo siguiente:
Temas
Paso 1: Crear un grupo de subredes (p. 587)
Paso 2: Crear un clster de DAX (p. 588)
Paso 3: Configure las reglas de entrada del grupo de seguridad (p. 589)
Si ya ha creado un grupo de subredes para la VPC predeterminada, puede omitir este paso.
DAX se ha diseado para ejecutarse dentro de un entorno de Amazon Virtual Private Cloud (Amazon
VPC). Si cre la cuenta de AWS despus del 04/12/2013, ya dispone de una VPC predeterminada en cada
regin de AWS. Para obtener ms informacin, consulte Your Default VPC and Subnets en la Gua del
usuario de Amazon VPC.
Durante el proceso de creacin de un clster de DAX, debe especificar un grupo de subredes. Un grupo de
subredes es una coleccin de una o varias subredes de la VPC. Al crear un clster de DAX, los nodos se
implementan en las subredes del grupo de subredes.
Cuando est conforme con los ajustes, haga clic en Create subnet group.
IAM role name: escriba un nombre para un rol de IAM. Por ejemplo: DAXServiceRole. La
consola crear un nuevo rol de IAM y el clster de DAX lo asumir en tiempo de ejecucin.
IAM policy name: escriba un nombre para una poltica de IAM. Por ejemplo: DAXServicePolicy.
La consola crear una nueva poltica de IAM y se la adjuntar al rol de IAM.
IAM role policy: elija Read/Write. Esto permitir que el clster de DAX lleve a cabo operaciones
de lectura y escritura en DynamoDB.
Target DynamoDB table: elija All tables.
f. Subnet group: elija el grupo de subredes que ha creado en Paso 1: Crear un grupo de
subredes (p. 587).
g. Security Groups: elija default.
5. Cuando la configuracin sea la que desea, elija Launch cluster.
Note
La creacin del clster tardar varios minutos. Cuando el clster est listo, su estado cambiar a
Available.
Mientras tanto, puede continuar con Paso 3: Configure las reglas de entrada del grupo de
seguridad (p. 589) y seguir las instrucciones que se facilitan.
Si ha lanzado el clster de DAX con un grupo de seguridad distinto (que no sea default), tendr
que llevar a cabo este procedimiento para ese grupo.
En muchos casos de uso, la forma de usar DAX en la aplicacin afectar a la consistencia de datos en el
clster de DAX, as como a la consistencia de datos entre DAX y DynamoDB.
Temas
Consistencia entre los nodos de los clsteres de DAX (p. 589)
Comportamiento de la cach de elementos de DAX (p. 590)
Comportamiento de la cach de consultas de DAX (p. 592)
Lecturas de consistencia alta (p. 592)
Almacenamiento en cach negativo (p. 593)
Estrategias de escritura (p. 593)
Mientras el clster de DAX se est ejecutando, replica los datos entre todos los nodos del clster (siempre
y cuando haya provisionado ms de uno). Tomemos una aplicacin que realiza correctamente una
operacin UpdateItem mediante DAX. Esto hace que la cach de elementos del nodo principal se
modifique con el nuevo valor; a continuacin, este valor se replica en todos los dems nodos del clster.
Esta replicacin presenta consistencia final y suele tardar menos de un segundo en llevarse a cabo.
En esta situacin, es posible que dos clientes lean la misma clave del mismo clster de DAX pero
reciban valores distintos, segn a qu nodo haya obtenido acceso cada cliente. Todos los nodos sern
consistentes cuando la actualizacin haya terminado de replicarse en todos los nodos del clster. Observe
que este comportamiento se asemeja al carcter consistente final de DynamoDB.
Si va a crear una aplicacin que utiliza DAX, dicha aplicacin deber disearse de forma que tolere los
datos de consistencia final.
Consistencia de lectura
De forma predeterminada, con Amazon DynamoDB la operacin GetItem lleva a cabo una lectura
consistente final. Si utiliza GetItem con el cliente de DynamoDB e inmediatamente despus intenta leer
el mismo elemento, es posible que los datos aparezcan igual que antes de la actualizacin. Esto se debe
al retraso de propagacin entre todas las ubicaciones de almacenamiento de DynamoDB. Normalmente,
puesto que la consistencia se logra en cuestin de segundos, si reintenta la lectura, probablemente ver el
elemento actualizado.
Cuando se utiliza GetItem con el cliente de DAX, la operacin se lleva a cabo como se indica a
continuacin:
1. El cliente de DAX emite una solicitud GetItem. DAX intenta leer el elemento solicitado en la cach
de elementos. Si el elemento est presente en la cach (acierto de cach), DAX se lo devuelve a la
aplicacin.
2. Si el elemento no est disponible (error de cach), DAX realiza una operacin GetItem de consistencia
final en DynamoDB.
3. DynamoDB devuelve el elemento solicitado y DAX lo almacena en la cach de elementos.
4. DAX devuelve el elemento a la aplicacin.
5. (No se muestra) Si el clster de DAX contiene ms de un nodo, el elemento se replica en todos los
dems nodos del clster.
Este elemento permanecer en la cach de elementos de DAX, de conformidad con el ajuste de tiempo de
vida (TTL, Time To Live) y el algoritmo de elementos menos usados recientemente (LRU, Least Recently
Used) de la cach (consulte Conceptos (p. 575)). Sin embargo, durante este periodo, DAX no volver a
leer el elemento en DynamoDB. Si otra persona actualiza el elemento mediante un cliente de DynamoDB
eludiendo DAX por completo, entonces una solicitud GetItem realizada con el cliente de DAX dar un
resultado distinto que si esa misma solicitud GetItem se lleva a cabo mediante el cliente de DynamoDB.
Si esto sucede, DAX y DynamoDB contendrn valores inconsistentes de la misma clave hasta que venza
el TTL del elemento de DAX.
Si una aplicacin modifica los datos de una tabla de DynamoDB subyacente eludiendo DAX, la aplicacin
tendr que prever y tolerar las inconsistencias de datos que surjan.
Note
Consistencia de escritura
DAX es una cach de escritura indirecta (write-through). Esto simplifica el proceso de mantener la
consistencia entre la cach de elementos de DAX y las tablas de DynamoDB subyacentes.
El cliente de DAX admite las mismas operaciones de API de escritura que DynamoDB (PutItem,
UpdateItem, DeleteItem y BatchWriteItem). Cuando se utilizan estas operaciones con el cliente de
DAX, los elementos se modifican tanto en DAX como en DynamoDB. DAX actualizar los elementos en la
cach de elementos, con independencia del valor de TTL que tengan.
Por ejemplo, supongamos que emite una solicitud GetItem del cliente de DAX para leer un elemento de la
tabla ProductCatalog. La clave de particin es Id y no hay clave de ordenacin. Recuperamos el elemento
cuyo valor de Id es 101; el valor de QuantityOnHand de ese elemento es 42. DAX almacena el elemento
en su cach de elementos con un TTL concreto; en este ejemplo, vamos a suponer que el TTL es de
diez minutos. Tres minutos ms tarde, otra aplicacin utiliza el cliente de DAX para actualizar el mismo
elemento, de forma que su valor de QuantityOnHand pasa a ser 41. Suponiendo que el elemento no se
vuelva a actualizar, todas las lecturas posteriores del mismo elemento que tengan lugar en los prximos
diez minutos devolvern el valor de QuantityOnHand almacenado en cach (41).
Si una escritura no se puede realizar en DynamoDB por cualquier motivo, incluida la limitacin controlada,
el elemento no se almacenar en cach en DAX y se devolver al solicitante la excepcin correspondiente
al error. De este modo se garantiza que los datos no se escriban en la cach de DAX a no ser que antes
se hayan escrito correctamente en DynamoDB.
Note
Cada escritura en DAX altera el estado de la cach de elementos; sin embargo, las escrituras en
ella no afectan a la cach de consultas. La cach de elementos y la cach de consultas de DAX
se utilizan con fines diferentes y funcionan de manera independiente una de la otra.
Consistencia de consulta-actualizacin-consulta
Las actualizaciones de la cach de elementos o de la tabla de DynamoDB subyacente no invalidan ni
modifican los resultados almacenados en la cach de consultas.
Tomemos, por ejemplo, la siguiente situacin en la que una aplicacin utiliza una tabla denominada
DocumentRevisions cuya clave de particin es DocId y cuya clave de ordenacin es RevisionNumber.
1. Un cliente emite una operacin Query para consultar el DocId 101 de todos los elementos cuyo valor
de RevisionNumber sea mayor o igual que 5. DAX almacena el conjunto de resultados en la cach de
consultas y se lo devuelve al usuario.
2. El cliente emite una solicitud PutItem para DocId 101 cuyo valor de RevisionNumber sea 20.
3. El cliente emite la misma operacin Query que se describe en el paso1 (DocId 101 y RevisionNumber
>= 5).
La aplicacin debe tener en cuenta el valor de TTL de la cach de consultas y el tiempo durante el cual la
aplicacin puede tolerar resultados inconsistentes entre las cachs de consultas y de elementos.
estrechamente acoplado a DynamoDB. Debido a esto, todas las lecturas posteriores de DAX tendran
que ser lecturas consistentes finales y las lecturas de consistencia alta tendran que pasarse a travs de
DynamoDB.
Por ejemplo, supongamos que una aplicacin enva una solicitud GetItem a un clster de DAX, pero
que no hay ningn elemento coincidente en la cach de elementos de DAX. DAX leer el elemento
correspondiente en la tabla de DynamoDB subyacente. Si el elemento tampoco est presente en
DynamoDB, entonces DAX almacenar un elemento vaco en su cach de elementos y, a continuacin,
devolver este elemento vaco a la aplicacin. Ahora, supongamos que la aplicacin enva otra solicitud
GetItem para obtener el mismo elemento. DAX encontrar el elemento vaco en la cach de elementos y
se lo devolver de inmediato a la aplicacin. No consultar DynamoDB en absoluto.
Una entrada de cach negativos se conserva en la cach de elementos de DAX hasta que vence el TTL
del elemento, se invoca el algoritmo LRU o el elemento se modifica mediante PutItem, UpdateItem o
DeleteItem.
La cach de consultas de DAX administra los resultados de cach negativos de forma similar. Si una
aplicacin realiza una operacin Query o Scan y la cach de consultas de DAX no contiene un resultado
en cach, entonces DAX enva la solicitud a DynamoDB. Si no hay elementos coincidentes en el conjunto
de resultados, DAX almacena un conjunto de resultados vaco en la cach de consultas y devuelve el
conjunto de resultados vaco a la aplicacin. Las solicitudes Query o Scan producirn el mismo conjunto
de resultados (vaco), hasta que venza su TTL.
Estrategias de escritura
El comportamiento de escritura indirecta (write-through) de DAX es adecuado para muchos patrones de
aplicaciones. No obstante, existen algunos patrones de aplicacin en los que este modelo de escritura
indirecta podra no ser el adecuado.
En las aplicaciones que son sensibles a la latencia, la escritura a travs de DAX genera un salto de red
ms, de modo que la escritura en DAX es algo ms lenta que si se realiza directamente en DynamoDB. Si
la aplicacin es sensible a la latencia de escritura, puede reducir esa latencia escribiendo directamente en
DynamoDB. (Para obtener ms informacin, consulteEscritura directa (p. 594).)
Para las aplicaciones con gran intensidad de escrituras (como las que llevan a cabo la carga de datos
masivos), no sera deseable escribir todos los datos a travs de DAX, puesto que la aplicacin solo leer
un pequeo porcentaje de ellos. Cuando se escriben grandes cantidades de datos a travs de DAX, debe
invocar el algoritmo LRU con el fin de dejar espacio en la cach para los nuevos elementos que hay que
leer. Esto reduce la eficacia de DAX como cach de lectura.
Al escribir un elemento en DAX, el estado de la cach de elementos se modifica para dar cabida al nuevo
elemento. Por ejemplo, DAX podra tener que expulsar datos antiguos de la cach de elementos con el fin
de dejar espacio para el nuevo elemento. El nuevo elemento permanecer en la cach de elementos, de
conformidad con el algoritmo LRU y el ajuste de TTL de esta ltima. Mientras el elemento persista en la
cach de elementos, DAX no volver a leerlo en DynamoDB.
Escritura indirecta
La cach de elementos de DAX implementa una poltica de escritura indirecta (consulte Procesamiento
de escrituras en DAX (p. 591)). Cuando se escribe un elemento, DAX se asegura de que el elemento
almacenado en cach est sincronizado con el elemento presente en DynamoDB. Esto resulta til para las
aplicaciones que tienen que volver a leer un elemento inmediatamente despus de escribirlo. Sin embargo,
si otras aplicaciones escriben directamente en una tabla de DynamoDB, el elemento contenido en la cach
de elementos de DAX dejar de estar sincronizada con DynamoDB.
Por ejemplo, tomemos dos usuarios (Alice y Bob) que estn utilizando la tabla ProductCatalog. Alice
obtiene acceso a la tabla mediante DAX, pero Bob elude DAX y obtiene acceso a la tabla directamente en
DynamoDB.
En este caso, Alice y Bob obtienen representaciones distintas del mismo elemento ProductCatalog. Esto
continuar siendo as hasta que DAX expulse el elemento de la cach de elementos o hasta que otro
usuario lo vuelva a actualizar mediante DAX.
Escritura directa
Si la aplicacin tiene que escribir grandes cantidades de datos (por ejemplo, en una carga de datos
masivos), puede ser ms lgico eludir DAX y escribir los datos directamente en DynamoDB. Esta
estrategia de escritura directa (write-around) reduce la latencia; sin embargo, la cach de elementos no se
mantendr sincronizada con los datos de DynamoDB.
Si decide utilizar una estrategia de escritura directa, recuerde que DAX rellenar su cach de elementos
cada vez que las aplicaciones utilicen el cliente de DAX para leer los datos. Esto puede ser beneficioso
en algunos casos, ya que garantiza que solo se almacenen en cach los datos que se leen con mayor
frecuencia (en lugar de los datos que se escriben con mayor frecuencia).
Tomemos un usuario (Charlie) que desea trabajar con la tabla GameScores mediante DAX. La clave de
particin de GameScores es UserId, por lo que todas las puntuaciones de Charlie tendran el mismo
UserId.
1. Charlie desea recuperar todas sus puntuaciones, por lo que enva una solicitud Query a DAX.
Suponiendo que esta consulta no se haya emitido antes, DAX se la reenva a DynamoDB para
procesarla, almacena los resultados en la cach de consultas de DAX y, por ltimo, devuelve los
resultados a Charlie. El conjunto de resultados seguir disponible en la cach de consultas hasta que se
expulse.
2. Ahora, supongamos que Charlie juega a Blasters Meteor y logra una puntuacin mxima. Charlie enva
una solicitud UpdateItem a DynamoDB para modificar un elemento en la tabla GameScores.
3. Por ltimo, Charlie decida volver a ejecutar la operacin Query anterior para recuperar todos sus
datos de GameScores. Charlie no ve su puntuacin mxima en Meteor Blasters en los resultados.
Esto se debe a que los resultados de la consulta proceden de la cach de consultas, no de la cach de
elementos. Las dos cachs son independientes entre s, de modo que un cambio en una de ellas no
afecta a la otra.
DAX no actualiza los conjuntos de resultados de la cach de consultas con los datos ms recientes de
DynamoDB. Cada conjunto de resultados de la cach de consultas estaba actualizado en el momento
de ejecutar la operacin Query o Scan. Por lo tanto, los resultados que Charlie obtiene con la operacin
Query no reflejan su operacin PutItem. Esto seguir siendo as hasta que DAX expulse el conjunto de
resultados de la cach de consultas.
En esta seccin se muestra cmo lanzar una instancia Amazon EC2 en la Amazon VPC predeterminada,
conectarse a la instancia y ejecutar una aplicacin de ejemplo.
En esta seccin tambin se ofrece informacin sobre cmo modificar la aplicacin existente para que
pueda sacar partido del clster de DAX.
Note
http://dax-sdk.s3-website-us-west-2.amazonaws.com
En este momento, los clientes de DAX estn disponibles para Java y Node.js.
Note
Para completar este tutorial, debe disponer de un clster de DAX en ejecucin en la VPC
predeterminada. Si todava no ha creado un clster de DAX, consulte Creacin de un clster de
DAX (p. 582) para obtener instrucciones.
En la parte superior de la lista de AMI, vaya a Amazon Linux AMI y elija Select.
Elija Launch.
3. En la ventana Select an existing key pair or create a new key pair, proceda del modo siguiente:
Si no dispone de un par de claves de Amazon EC2, elija Create a new key pair y siga las
instrucciones. Se le pedir que descargue un archivo de clave privada (archivo .pem); lo necesitar
ms adelante cuando inicie sesin en la instancia Amazon EC2.
Si ya dispone de un par de claves de Amazon EC2, vaya a Select a key pair y eljalo en la lista.
Tenga en cuenta que deber tener ya el archivo de clave privada (archivo .pem) a su disposicin
para poder iniciar sesin en la instancia Amazon EC2.
4. Cuando haya configurado el par de claves, elija Launch Instances.
5. En el panel de navegacin de la consola, elija EC2 Dashboard y, a continuacin, seleccione la
instancia que ha lanzado. En el panel inferior, en la pestaa Description, busque el Public DNS de
su instancia. Por ejemplo: ec2-11-22-33-44.us-west-2.compute.amazonaws.com. Anote
el nombre de DNS pblico, pues lo necesitar en el paso siguiente (Paso3: Configurar la instancia
Amazon EC2 (p. 598)).
Note
La instancia Amazon EC2 tardar unos minutos en estar disponible. Mientras tanto, puede
continuar con Paso2: Crear un usuario y una poltica de IAM (p. 597) y seguir las instrucciones
que se facilitan.
5. En la pgina Permissions, elija Attach existing policies directly y despus Create policy.
6. En la pgina Create Policy, seleccione Create Your Own Policy.
7. En la pgina Review Policy, especifique la informacin siguiente:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dax:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
Deber especificar el archivo de clave privada (archivo .pem) y el nombre de DNS pblico de la
instancia. (Consulte Paso 1: Lanzar una instancia Amazon EC2 (p. 596)).
aws configure
En esta seccin se describe el cliente DAX para Java. Si prefiere utilizar Node.js, omita esta
seccin y vaya a Paso4b: (Node.js) Ejecutar el ejemplo de aplicacin (p. 607).
Para ayudarle a probar la funcionalidad de DAX, hemos proporcionado un programa de Java que puede
ejecutar en la instancia Amazon EC2. El programa consta de tres archivos de origen:
2. Descargue el archivo del AWS SDK for Java (archivo .zip) y, a continuacin, extrigalo:
wget http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip
unzip aws-java-sdk.zip
wget http://dax-sdk.s3-website-us-west-2.amazonaws.com/java/DaxJavaClient-latest.jar
export SDKVERSION=sdkVersion
export CLASSPATH=.:./DaxJavaClient-latest.jar:aws-java-sdk-$SDKVERSION/lib/aws-java-
sdk-$SDKVERSION.jar:aws-java-sdk-$SDKVERSION/third-party/lib/*
Sustituya sdkVersion por el nmero de versin real del AWS SDK para Java. Por ejemplo:
1.11.112
5. Descargue el cdigo fuente del programa de ejemplo (archivo .zip):
wget http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/TryDax.zip
unzip TryDax.zip
javac TryDax*.java
7. Ejecute el programa:
java TryDax
Tome nota de la informacin de tiempo; es decir, del nmero de milisegundos necesarios para realizar
las pruebas de GetItem, Query y Scan.
8. En el paso anterior, hemos ejecutado el programa en el punto de enlace de DynamoDB. Ahora, vamos
a ejecutarlo de nuevo, pero esta vez las operaciones GetItem, Query y Scan se procesarn en el
clster de DAX.
Para determinar el punto de enlace del clster de DAX, elija una de las opciones siguientes:
Using the DynamoDB console: elija su clster de DAX. El punto de enlace del clster se muestra en
la consola. Por ejemplo:
mycluster.frfx8h.clustercfg.dax.amazonaws.com:8111
El puerto y la direccin del punto de enlace del clster se muestran en el resultado. Por ejemplo:
{
"Port": 8111,
"Address":"mycluster.frfx8h.clustercfg.dax.amazonaws.com"
}
Ahora, vuelva a ejecutar el programa, pero, esta vez, especifique el punto de enlace del clster como
parmetro en la lnea de comandos:
Fjese en el resto del resultado y tome nota de la informacin sobre tiempos. Los tiempos transcurridos
para las operaciones GetItem, Query y Scan deberan ser significativamente menores con DAX que
con DynamoDB.
Para obtener ms informacin sobre este programa, consulte las siguientes secciones:
TryDax.java
El archivo TryDax.java contiene el mtodo main. Si ejecuta el programa sin parmetros de lnea
de comandos, se crea un cliente de DynamoDB que se utiliza para todas las operaciones del API. Si
especifica el punto de enlace de un clster de DAX en la lnea de comandos, el programa crea tambin un
cliente de DAX y lo utiliza para las operaciones GetItem, Query y Scan.
Utilizar el cliente de DAX en lugar del cliente de DynamoDB (consulte Paso4a: (Java) Ejecutar el
ejemplo de aplicacin (p. 599)).
Elegir otro nombre para la tabla de prueba.
Cambiar los parmetros de helper.writeData para modificar el nmero de elementos que se
escriben. El segundo parmetro es el nmero de claves de particin y el tercero, el nmero de claves
de ordenacin. De forma predeterminada, el programa entre 1 y 10 valores de clave de particin y entre
1 y 10 valores de clave de ordenacin, lo que equivale a un total de 100elementos escritos en la tabla.
(Para obtener ms informacin, consulte TryDaxHelper.java (p. 603))
Modificar el nmero de pruebas de GetItem, Query y Scan y sus parmetros.
Marcar como comentarios las lneas que contienen helper.createTable y helper.deleteTable,
sin no desea crear y eliminar la tabla cada vez que ejecute el programa.
Note
Para ejecutar este programa, debe incluir el cliente java de DAX y AWS SDK para Java en el
classpath. Consulte Paso4a: (Java) Ejecutar el ejemplo de aplicacin (p. 599) para ver un
ejemplo de cmo establecer la variable CLASSPATH.
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
System.out.println("Creating table...");
helper.createTable(tableName, ddbClient);
System.out.println("Populating table...");
helper.writeData(tableName, ddbClient, 10, 10);
// GetItem
tests.getItemTest(tableName, testClient, 1, 10, 5);
// Query
tests.queryTest(tableName, testClient, 5, 2, 9, 5);
// Scan
tests.scanTest(tableName, testClient, 5);
helper.deleteTable(tableName, ddbClient);
}
TryDaxHelper.java
El archivo TryDaxHelper.java contiene mtodos de utilidad.
Note
Para ejecutar este programa, debe incluir el cliente java de DAX y AWS SDK para Java en el
classpath. Consulte Paso4a: (Java) Ejecutar el ejemplo de aplicacin (p. 599) para ver un
ejemplo de cmo establecer la variable CLASSPATH.
import java.util.Arrays;
import com.amazon.dax.client.dynamodbv2.AmazonDaxClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
import com.amazonaws.util.EC2MetadataUtils;
DynamoDB getDynamoDBClient() {
System.out.println("Creating a DynamoDB client");
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(region)
.build();
return new DynamoDB(client);
}
table = client.createTable(tableName,
Arrays.asList(
new KeySchemaElement("pk", KeyType.HASH), // Partition key
new KeySchemaElement("sk", KeyType.RANGE)), // Sort key
Arrays.asList(
new AttributeDefinition("pk", ScalarAttributeType.N),
new AttributeDefinition("sk", ScalarAttributeType.N)),
new ProvisionedThroughput(10L, 10L));
table.waitForActive();
System.out.println("Successfully created table. Table status: " +
table.getDescription().getTableStatus());
} catch (Exception e) {
System.err.println("Unable to create table: ");
e.printStackTrace();
}
}
try {
for (Integer ipk = 1; ipk <= pkmax; ipk++) {
System.out.println(("Writing " + skmax + " items for partition key: " +
ipk));
for (Integer isk = 1; isk <= skmax; isk++) {
table.putItem(new Item()
.withPrimaryKey("pk", ipk, "sk", isk)
.withString("someData", someData));
}
}
} catch (Exception e) {
System.err.println("Unable to write item:");
e.printStackTrace();
}
}
} catch (Exception e) {
System.err.println("Unable to delete table: ");
e.printStackTrace();
}
}
TryDaxTests.java
El archivo TryDaxTests.java contiene mtodos que llevan a cabo operaciones de lectura en una tabla
de prueba de DynamoDB. Estos mtodos no tienen en cuenta cmo obtienen acceso a los datos (mediante
el cliente de DAX o de DynamoDB), por lo que no es necesario modificar la lgica de la aplicacin.
Note
Para ejecutar este programa, debe incluir el cliente java de DAX y AWS SDK para Java en el
classpath. Consulte Paso4a: (Java) Ejecutar el ejemplo de aplicacin (p. 599) para ver un
ejemplo de cmo establecer la variable CLASSPATH.
import java.util.HashMap;
import java.util.Iterator;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.QueryOutcome;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec;
void getItemTest(String tableName, DynamoDB client, int pk, int sk, int iterations) {
long startTime, endTime;
System.out.println("GetItem test - partition key " + pk + " and sort keys 1-" +
sk);
Table table = client.getTable(tableName);
try {
for (Integer ipk = 1; ipk <= pk; ipk++) {
for (Integer isk = 1; isk <= sk; isk++) {
table.getItem("pk", ipk, "sk", isk);
}
}
} catch (Exception e) {
System.err.println("Unable to get item:");
e.printStackTrace();
}
endTime = System.nanoTime();
printTime(startTime, endTime, pk * sk);
}
}
void queryTest(String tableName, DynamoDB client, int pk, int sk1, int sk2, int
iterations) {
long startTime, endTime;
System.out.println("Query test - partition key " + pk + " and sort keys between " +
sk1 + " and " + sk2);
Table table = client.getTable(tableName);
try {
Iterator<Item> iter = items.iterator();
while (iter.hasNext()) {
iter.next();
}
} catch (Exception e) {
System.err.println("Unable to query table:");
e.printStackTrace();
}
endTime = System.nanoTime();
printTime(startTime, endTime, iterations);
}
}
e.printStackTrace();
}
endTime = System.nanoTime();
printTime(startTime, endTime, iterations);
}
}
En esta seccin se describe el cliente DAX para Node.js. Si prefiere utilizar Java, omita esta
seccin y vaya a Paso4a: (Java) Ejecutar el ejemplo de aplicacin (p. 599).
Para ayudarle a probar la funcionalidad de DAX, hemos proporcionado algunos programas de Node.jse
que puede ejecutar en la instancia de Amazon EC2.
b. Active nvm:
. ~/.nvm/nvm.sh
wget http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/TryDax.zip
unzip TryDax.zip
node 01-create-table.js
node 02-write-data.js
El primer programa crea una tabla de DynamoDB denominada TryDaxTable. El segundo programa
escribe datos en la tabla.
5. Ejecute los siguientes programas de Node.js:
node 03-getitem-test.js
node 04-query-test.js
node 05-scan-test.js
Tome nota de la informacin de tiempo; es decir, del nmero de milisegundos necesarios para realizar
las pruebas de GetItem, Query y Scan.
6. En el paso anterior, hemos ejecutado los programas en el punto de enlace de DynamoDB. Ahora,
vamos a ejecutarlos de nuevo, pero esta vez las operaciones GetItem, Query y Scan se procesarn
en el clster de DAX.
Para determinar el punto de enlace del clster de DAX, elija una de las opciones siguientes:
Using the DynamoDB console: elija su clster de DAX. El punto de enlace del clster se muestra en
la consola. Por ejemplo:
mycluster.frfx8h.clustercfg.dax.amazonaws.com:8111
El puerto y la direccin del punto de enlace del clster se muestran en el resultado. Por ejemplo:
{
"Port": 8111,
"Address":"mycluster.frfx8h.clustercfg.dax.amazonaws.com"
}
Ahora, vuelva a ejecutar los programas, pero, esta vez, especifique el punto de enlace del clster
como parmetro en la lnea de comandos:
Fjese en el resto del resultado y tome nota de la informacin sobre tiempos. Los tiempos transcurridos
para las operaciones GetItem, Query y Scan deberan ser significativamente menores con DAX que
con DynamoDB.
API Version 2012-08-10
608
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin
node 06-delete-table
Para obtener ms informacin sobre estos programas, consulte las siguientes secciones:
01-create-table.js
El programa 01-create-table.js crea una tabla (TryDaxTable). Los dems programas de Node.js en
esta seccin dependern de esta tabla.
AWS.config.update({
region: region
});
var params = {
TableName : tableName,
KeySchema: [
{ AttributeName: "pk", KeyType: "HASH"}, //Partition key
{ AttributeName: "sk", KeyType: "RANGE" } //Sort key
],
AttributeDefinitions: [
{ AttributeName: "pk", AttributeType: "N" },
{ AttributeName: "sk", AttributeType: "N" }
],
ProvisionedThroughput: {
ReadCapacityUnits: 10,
WriteCapacityUnits: 10
}
};
02-write-data.js
El programa 02-write-data.js escribe datos de prueba en TryDaxTable.
AWS.config.update({
region: region
});
//
//put item
}
}
03-getitem-test.js
El programa 03-getitem-test.js escribe realiza operaciones GetItem en TryDaxTable.
AWS.config.update({
region: region
});
if (process.argv.length > 2) {
var dax = new AmazonDaxClient({endpoints: [process.argv[2]], region: region})
daxClient = new AWS.DynamoDB.DocumentClient({service: dax });
}
var pk = 1;
var sk = 10;
var iterations = 5;
var params = {
TableName: tableName,
Key:{
"pk": ipk,
"sk": isk
}
};
04-query-test.js
El programa 04-query-test.js escribe realiza operaciones Query en TryDaxTable.
AWS.config.update({
region: region
});
if (process.argv.length > 2) {
var dax = new AmazonDaxClient({endpoints: [process.argv[2]], region: region})
daxClient = new AWS.DynamoDB.DocumentClient({service: dax });
}
var tableName = "TryDaxTable";
var pk = 5;
var sk1 = 2;
var sk2 = 9;
var iterations = 5;
var params = {
TableName: tableName,
KeyConditionExpression: "pk = :pkval and sk between :skval1 and :skval2",
ExpressionAttributeValues: {
":pkval":pk,
":skval1":sk1,
":skval2":sk2
}
};
05-scan-test.js
El programa 05-scan-test.js escribe realiza operaciones Scan en TryDaxTable.
AWS.config.update({
region: region
});
if (process.argv.length > 2) {
var dax = new AmazonDaxClient({endpoints: [process.argv[2]], region: region})
client = new AWS.DynamoDB.DocumentClient({service: dax });
}
var iterations = 5;
var params = {
TableName: tableName
};
06-delete-table.js
El programa 06-delete-table.js elimina TryDaxTable. Ejecute este programa despus de que haya
terminado las pruebas.
AWS.config.update({
region: region
});
var params = {
TableName : tableName
};
Supongamos que tiene una tabla de DynamoDB denominada Music. La clave de particin de la tabla es
Artist y la de ordenacin, SongTitle. El siguiente programa lee un elemento directamente desde la tabla
Music:
import java.util.HashMap;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
try {
System.out.println("Attempting to read the item...");
GetItemResult result = client.getItem(request);
System.out.println("GetItem succeeded: " + result);
} catch (Exception e) {
System.err.println("Unable to read item");
System.err.println(e.getMessage());
}
}
}
import java.util.HashMap;
import com.amazon.dax.client.dynamodbv2.AmazonDaxClient;
import com.amazon.dax.client.dynamodbv2.ClientConfig;
import com.amazon.dax.client.dynamodbv2.ClusterDaxClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
.withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDaxClient client = new ClusterDaxClient(daxConfig);
/*
** ...
** Remaining code omitted (it is identical)
** ...
*/
}
}
La interfaz de documentos tambin se pueden utilizar con el cliente de bajo nivel de DAX, tal y como se
muestra a continuacin:
import com.amazon.dax.client.dynamodbv2.AmazonDaxClient;
import com.amazon.dax.client.dynamodbv2.ClientConfig;
import com.amazon.dax.client.dynamodbv2.ClusterDaxClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
.withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDaxClient client = new ClusterDaxClient(daxConfig);
try {
System.out.println("Attempting to read the item...");
System.out.println(table.getItem(
"Artist", "No One You Know",
"SongTitle", "Scared of My Shadow"));
System.out.println("GetItem succeeded: " + outcome);
} catch (Exception e) {
System.err.println("Unable to read item");
System.err.println(e.getMessage());
}
}
}
El programa siguiente ilustra cmo utilizar ClusterDaxAsyncClient con Future de Java para
implementar una solucin que no genere ningn bloqueo.
import java.util.HashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.amazon.dax.client.dynamodbv2.ClientConfig;
import com.amazon.dax.client.dynamodbv2.ClusterDaxAsyncClient;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.handlers.AsyncHandler;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsync;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
// Java Futures
Future<GetItemResult> call = client.getItemAsync(request);
while (!call.isDone()) {
// Do other processing while you're waiting for the response
System.out.println("Doing something else for a few seconds...");
Thread.sleep(3000);
}
// The results should be ready by now
try {
call.get();
// Async callbacks
call = client.getItemAsync(request, new AsyncHandler<GetItemRequest, GetItemResult>() {
@Override
public void onSuccess(GetItemRequest request, GetItemResult getItemResult) {
System.out.println("Result: " + getItemResult);
}
@Override
public void onError(Exception e) {
System.out.println("Unable to read item");
System.err.println(e.getMessage());
// Callers can also test if exception is an instance of
// AmazonServiceException or AmazonClientException and cast
// it to get additional information
}
});
call.get();
}
}
Temas
Permisos de IAM para administrar clsteres de DAX (p. 617)
Personalizacin de los ajustes de un clster de DAX (p. 619)
Configuracin de los ajustes de TTL (p. 620)
Compatibilidad con el etiquetado en DAX (p. 621)
Integracin con AWS CloudTrail (p. 622)
Eliminacin de un clster de DAX (p. 622)
La explicacin siguiente se centra en el control de acceso a los API de administracin de DAX (consulte
Amazon DynamoDB Accelerator en la Amazon DynamoDB API Reference).
Note
Para obtener informacin ms detallada sobre la administracin de permisos de IAM, consulte los
enlaces siguientes.
El alcance de las acciones de los API de administracin de DAX no se puede limitar a un recurso concreto.
El componente Resource debe establecerse en "*". Tenga en cuenta que esto difiere de las operaciones
del API del plano de datos de DAX, tales como GetItem, Query o Scan. Las operaciones del plano de
datos se exponen a travs del cliente de DAX y su alcance s se puede limitar a recursos concretos.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dax:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
]
}
]
}
Supongamos que el objetivo de esta poltica es permitir las llamadas al API de administracin de DAX para
el clster DAXCluster01 exclusivamente.
Este comando producir un error con la excepcin "Not Authorized", porque el alcance de la llamada al
API DescribeClusters subyacente no puede limitarse a un clster especfico. Aunque sintcticamente
la poltica es vlida, el comando no se ejecuta, porque el componente Resource debe establecerse en
"*". Sin embargo, si el usuario ejecuta un programa que enva llamadas del plano de datos de DAX (por
ejemplo, GetItem o Query) a DAXCluster01, estas llamadas s se llevarn a cabo correctamente. Esto se
debe a que el alcance de los API de plano de datos de DAX se puede limitar a recursos concretos (en este
caso, a DAXCluster01).
Si desea escribir una nica poltica de IAM que abarque todos los supuestos (tanto los API de
administracin como los API de plano de datos de DAX), le sugerimos que incluya dos instrucciones
diferenciadas en el documento de polticas. Una de las instrucciones deber abordar los API de plano de
datos de DAX y la otra, los API de administracin de DAX.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DAXDataAPIs",
"Action": [
"dax:GetItem",
"dax:BatchGetItem",
"dax:Query",
"dax:Scan",
"dax:PutItem",
"dax:UpdateItem",
"dax:DeleteItem",
"dax:BatchWriteItem",
"dax:DefineAttributeList",
"dax:DefineAttributeListId",
"dax:DefineKeySchema",
"dax:Endpoints"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
]},
{
"Sid": "DAXManagementAPIs",
"Action": [
"dax:CreateParameterGroup",
"dax:CreateSubnetGroup",
"dax:DecreaseReplicationFactor",
"dax:DeleteCluster",
"dax:DeleteParameterGroup",
"dax:DeleteSubnetGroup",
"dax:DescribeClusters",
"dax:DescribeDefaultParameters",
"dax:DescribeEvents",
"dax:DescribeParameterGroups",
"dax:DescribeParameters",
"dax:DescribeSubnetGroups",
"dax:IncreaseReplicationFactor",
"dax:ListTags",
"dax:RebootNode",
"dax:TagResource",
"dax:UntagResource",
"dax:UpdateCluster",
"dax:UpdateParameterGroup",
"dax:UpdateSubnetGroup"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
No puede cambiar estos ajustes en un clster de DAX mientras se encuentre en ejecucin. Sin embargo,
para los nuevos clsteres, puede personalizar los ajustes en el momento de su creacin. Para ello, cancele
la seleccin de Use default settings en la Consola de administracin de AWS para modificar los siguientes
ajustes:
Network and Security: permite ejecutar nodos de clsteres de DAX individuales en distintas zonas
de disponibilidad de la regin de AWS actual. Si elige No Preference, los nodos se distribuirn
automticamente entre las zonas de disponibilidad.
Parameter Group: conjunto de parmetros con nombre que se aplican a todos los nodos del clster.
Puede utilizar un grupo de parmetros para especificar el comportamiento de la cach con respecto al
tiempo de vida (TTL).
Maintenance Window: periodo semanal durante el cual se aplicarn los parches y las actualizaciones
de software a los nodos del clster. Puede elegir el da y la hora de comienzo, as como la duracin
del tiempo de mantenimiento. Si elige No Preference, el tiempo de mantenimiento se selecciona al
azar dentro de un bloque de 8horas por regin. (Para obtener ms informacin, consulte Maintenance
Window (p. 581).)
Cuando se produce un evento de mantenimiento, DAX puede notificrselo mediante Amazon Simple
Notification Service (Amazon SNS). Para configurar las notificaciones, elija una opcin en el selector Topic
for SNS notification. Puede crear un tema de Amazon SNS nuevo o elegir uno disponible. Para obtener
ms informacin sobre cmo configurar un tema de Amazon SNS y suscribirse a l, consulte Getting
Started with Amazon Simple Notification Service en la Gua para desarrolladores de Amazon Simple
Notification Service.
Escalado de lectura
Con el escalado de lectura, puede mejorar el desempeo agregando ms rplicas de lectura al clster. Un
nico clster de DAX admite hasta 9rplicas de lectura, que puede agregar o eliminar mientras el clster
se est ejecutando.
En los siguientes ejemplos de la AWS CLI se muestra cmo incrementar o reducir el nmero de nodos.
El argumento --new-replication-factor especifica el nmero total de nodos del clster; uno de los
nodos es el principal y los dems, las rplicas de lectura.
Note
El estado del clster cambia a modifying cuando se modifica el factor de replicacin. Cuando el
estado cambia a available, el clster est preparado para usarlo de nuevo.
Tipos de nodos
Si tiene un gran conjunto de datos con los que trabajar, seguramente la aplicacin se beneficiar si usa
los tipos de nodos mayores. Los nodos mayores pueden permitir que el clster almacene ms datos en
memoria, lo que reduce los errores de cach y mejorar el desempeo de la aplicacin en general. Tenga
en cuenta que todos los nodos de un clster de DAX deben ser del mismo tipo.
No puede modificar los tipos de los nodos mientras un clster de DAX est en ejecucin. En lugar de
ello, deber crear un nuevo clster con el tipo de nodo deseado. Para ver una lista de los tipos de nodos
admitidos, consulte Nodos (p. 578).
Puede crear un clster de DAX nuevo desde la Consola de administracin de AWS o la AWS CLI. En este
ltimo caso, use el parmetro --node-type para especificar el tipo de nodo.
Para obtener ms informacin, consulte Cach de elementos (p. 577) y Cach de consultas (p. 577)
El tiempo de vida (TTL) predeterminado de cada una de estas cachs es de 5minutos. Si desea utilizar
otros ajustes de TTL, puede lanzar un clster de DAX con un grupo de parmetros personalizados.
Para hacer esto en la Consola de administracin de AWS, elija DAX | Parameter groups en el panel de
navegacin.
Tambin puede llevar a cabo estas tareas utilizando la AWS CLI. En el siguiente ejemplo se muestra cmo
lanzar un nuevo clster de DAX con un grupo de parmetros personalizados. En este ejemplo, el TTL de la
cach de elementos se establece en 10minutos y el de la cach de consultas, en 3minutos.
A partir de ahora, puede lanzar un nuevo clster de DAX con este grupo de parmetros:
Note
No se puede modificar un grupo de parmetros que se encuentre en uso en una instancia de DAX
en ejecucin.
AWS CLI
Cuando se utiliza la AWS CLI para administrar etiquetas de los clsteres de DAX, es preciso determinar
previamente el nombre de recurso de Amazon (ARN) del clster. En el siguiente ejemplo se muestra cmo
determinar el ARN de un clster denominado MyDAXCluster:
Puede eliminar un clster de DAX mediante la Consola de administracin de AWS o la AWS CLI. A
continuacin se muestra un ejemplo:
Se recomienda encarecidamente conocer ambos modelos de seguridad para poder implementar las
medidas de seguridad adecuadas en las aplicaciones que utilizan DAX.
En esta seccin, se describen los mecanismos de control de acceso proporcionados por DAX y se facilitan
ejemplos de polticas de IAM que puede adaptar a sus necesidades.
Con DynamoDB, puede crear polticas de IAM que limiten las acciones que el usuario puede llevar a cabo
con los recursos de DynamoDB individuales. Por ejemplo, puede crear un rol de usuario que nicamente
permita al usuario realizar acciones de solo lectura en una tabla de DynamoDB determinada. Para obtener
ms informacin, consulte Autenticacin y control de acceso de Amazon DynamoDB. En comparacin, el
modelo de seguridad de DAX se centra en la seguridad de los clsteres y en la capacidad de estos para
llevar a cabo las acciones del API de DynamoDB en nombre de usted.
Warning
Si est utilizando los roles y las polticas de IAM para restringir el acceso a los datos de las tablas
de DynamoDB, el uso de DAX puede alterar las polticas. Por ejemplo, un usuario podra tener
acceso a una tabla de DynamoDB mediante DAX aunque no tuviese acceso explcito a ella si el
acceso se llevase a cabo directamente a travs de DynamoDB. Para obtener ms informacin,
consulte Autenticacin y control de acceso de Amazon DynamoDB.
DAX no aplica la separacin de nivel de usuario de los datos en DynamoDB. En lugar de ello, los
usuarios heredan los permisos de la poltica de IAM del clster de DAX cuando obtienen acceso
a ese clster. Por lo tanto, al obtener acceso a las tablas de DynamoDB a travs de DAX, los
nicos controles que surten efecto son los permisos de la poltica de IAM del clster de DAX. No
se reconoce ningn otro permiso.
Si requiere aislamiento, recomendamos crear clsteres de DAX adicionales y que defina en
consecuencia el alcance la poltica IAM para cada clster. Por ejemplo, podra crear varios
clsteres de DAX y permitir que cada uno de ellos obtenga acceso a una sola tabla.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "dax.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Esta relacin de confianza permite que un clster de DAX asumaDAXServiceRoley lleve a cabo llamadas
al API de DynamoDB en nombre de usted.
Las acciones del API de DynamoDB permitidas se describen en un documento de poltica de IAM que se
adjunta aDAXServiceRole. A continuacin se muestra el ejemplo de documento de poltica:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DaxAccessPolicy",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/Books"
]
}
]
}
Esta poltica permite que DAX lleve a cabo todas las acciones del API de DynamoDB en una tabla de
DynamoDB denominada Books, que se encuentra en la regin us-west-2 y es propiedad del ID de cuenta
de AWS123456789012.
Por ejemplo, supongamos que desea conceder acceso a DAXCluster01 a una usuaria de IAM cuyo
nombre es Alice. En primer lugar, creara la poltica de IAM (AliceAccessPolicy) que define los clsteres
de DAX y las acciones del API de DAX a los que la destinataria puede obtener acceso. Posteriormente, le
concedera acceso adjuntando esta poltica a la usuaria Alice.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dax:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
]
}
]
}
El documento de poltica permite obtener acceso al clster de DAX, pero no concede ningn permiso de
DynamoDB. Los permisos de DynamoDB los concede el rol de servicio de DAX.
Para la usuaria Alice, primero habra que crear AliceAccessPolicy con el documento de poltica que se
muestra ms arriba. Posteriormente, se adjuntara la poltica a Alice.
Note
En lugar de adjuntar la poltica a un usuario de IAM, podra adjuntrsela a un rol de IAM. De ese
modo, todos los usuarios que asuman ese rol tendran los permisos definidos en la poltica.
La poltica de usuario, combinada con el rol de servicio de DAX, determinan los recursos de DynamoDB y
las acciones del API a los que el destinatario puede obtener acceso a travs de DAX.
Es posible permitir el acceso directo a una tabla de DynamoDB, pero impedir el acceso indirecto a travs
de un clster de DAX. Para el acceso directo a DynamoDB, los privilegios de BobUserRole se determinan
mediante BobAccessPolicy (que se adjunta al rol).
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Cuando este documento se adjunte a BobAccessPolicy, permitir que BobUserRole obtenga acceso al
punto de enlace de DynamoDB y lleve a cabo operaciones de solo lectura en la tablaBooks.
DAX no aparece en esta poltica, por lo que el acceso a travs de DAX se denegar.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Tampoco en este caso aparece DAX en la poltica, por lo que el acceso a travs de DAX se denegar.
Para permitir el acceso a un clster de DAX, debe incluir las acciones especficas de DAX en una poltica
de IAM.
Las siguientes acciones especficas de DAX se corresponden con sus homlogas de nombres parecidos
del API de DynamoDB:
dax:GetItem
dax:BatchGetItem
dax:Query
dax:Scan
dax:PutItem
dax:UpdateItem
dax:DeleteItem
dax:BatchWriteItem
Adems, existen otras cuatro acciones especficas de DAX que no se corresponden con ningn API de
DynamoDB:
dax:DefineAttributeList
dax:DefineAttributeListId
dax:DefineKeySchema
dax:Endpoints
Debe especificar las cuatro acciones en cualquier poltica de IAM que permita el acceso a un clster
de DAX. Estas acciones son especficas del protocolo de transporte de datos de bajo nivel de DAX. La
aplicacin no tiene que ocuparse de estas acciones, puesto que nicamente se usan en las polticas de
IAM.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DAXAccessStmt",
"Effect": "Allow",
"Action": [
"dax:GetItem",
"dax:BatchGetItem",
"dax:Query",
"dax:Scan",
"dax:DefineAttributeList",
"dax:DefineAttributeListId",
"dax:DefineKeySchema",
"dax:Endpoints"
],
"Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
},
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
La poltica contiene una instruccin para el acceso a DAX (DAXAccessStmt) y otra para el
acceso a DynamoDB (DynamoDBAccessStmt). Estas instrucciones permitiran que Bob enve
solicitudesGetItem,BatchGetItem,Query yScana DAXCluster01.
Sin embargo, el rolo de servicio de DAXCluster01 tambin requerira acceso de solo lectura a la tabla
Books en DynamoDB. La siguiente poltica de IAM, adjunta a DAXServiceRole, permitira cumplir este
requisito:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
En el caso de Bob, la poltica de IAM paraBobUserRoletendra que permitir las acciones de lectura y
escritura de DynamoDB en la tablaBooksy, adems, admitir las acciones de solo lectura a travs de
DAXCluster01.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DAXAccessStmt",
"Effect": "Allow",
"Action": [
"dax:GetItem",
"dax:BatchGetItem",
"dax:Query",
"dax:Scan",
"dax:DefineKeySchema",
"dax:DefineAttributeList",
"dax:DefineAttributeListId",
"dax:Endpoints"
],
"Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
},
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem",
"dynamodb:DescribeTable"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Adems, DAXServiceRole requerira una poltica de IAM que permitiese que DAXCluster01 realizase
acciones de solo lectura en la tabla Books:
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:DescribeTable"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DAXAccessStmt",
"Effect": "Allow",
"Action": [
"dax:GetItem",
"dax:BatchGetItem",
"dax:Query",
"dax:Scan",
"dax:PutItem",
"dax:UpdateItem",
"dax:DeleteItem",
"dax:BatchWriteItem",
"dax:DefineKeySchema",
"dax:DefineAttributeList",
"dax:DefineAttributeListId",
"dax:Endpoints"
],
"Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
},
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem",
"dynamodb:DescribeTable"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Adems, DAXServiceRole requerira una poltica de IAM que permitiese que DAXCluster01 realizase
acciones de lectura y escritura en la tabla Books:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem",
"dynamodb:DescribeTable"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Si est utilizando los roles y las polticas de IAM para restringir el acceso a los datos y las tablas de
DynamoDB, el uso de DAX puede alterar las polticas. En la poltica siguiente, Bob tiene acceso a una
tabla de DynamoDB a travs de DAX, aunque no tiene acceso explcito directo a esa misma tabla en
DynamoDB.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DAXAccessStmt",
"Effect": "Allow",
"Action": [
"dax:GetItem",
"dax:BatchGetItem",
"dax:Query",
"dax:Scan",
"dax:PutItem",
"dax:UpdateItem",
"dax:DeleteItem",
"dax:BatchWriteItem",
"dax:DefineKeySchema",
"dax:DefineAttributeList",
"dax:DefineAttributeListId",
"dax:Endpoints"
],
"Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
}
]
}
Tenga en cuenta que, en esta poltica de acceso, no hay permisos para obtener acceso a DynamoDB
directamente.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccessStmt",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem",
"dynamodb:DescribeTable"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Como se muestra en este ejemplo, cuando se configura el control de acceso para la poltica de acceso
de usuario y la poltica de acceso de clster de DAX, es preciso comprender perfectamente todos los
permisos de acceso que se conceden, con el fin de asegurarse de cumplir el principio de mnimos
privilegios. Asimismo, debe asegurarse de que, al conceder a un usuario acceso a un clster de DAX, no
se alteren las polticas de control de acceso establecidas previamente.
Se necesitan credenciales para obtener acceso a Amazon DynamoDB. Estas credenciales deben tener
los permisos necesarios para obtener acceso a los recursos de AWS, como Amazon DynamoDB table
o una instancia Amazon Elastic Compute Cloud (Amazon EC2). En las secciones siguientes, se incluye
informacin detallada sobre cmo usar AWS Identity and Access Management (IAM) y DynamoDB para
proteger el acceso a sus recursos.
Autenticacin
Puede tener acceso a AWS como cualquiera de los siguientes tipos de identidades:
Usuario raz de la cuenta de AWS: cuando se inscribe en AWS, proporciona una direccin de correo
electrnico y la contrasea asociada a su cuenta de AWS. Esto constituye su usuario raz de la cuenta
de AWS, cuyas credenciales permiten el acceso completo a todos sus recursos de AWS.
Important
Por motivos de seguridad, le recomendamos que utilice el usuario raz solo para crear un
administrador, que es un usuario de IAM con permisos completos sobre su cuenta de AWS.
Podr utilizar luego este administrador para crear otros usuarios y roles de IAM con permisos
limitados. Para obtener ms informacin, consulte IAM Best Practices y Creating an Admin User
and Group en la Gua del usuario de IAM.
Usuario de IAM: un usuario de IAM es simplemente una identidad dentro de su cuenta de AWS que tiene
permisos personalizados especficos (por ejemplo, permisos para crear a table in DynamoDB). Puede
utilizar un nombre de usuario de IAM y una contrasea para iniciar sesin en pginas web seguras de
AWS, como la de Consola de administracin de AWS, los foros de discusin de AWS o el AWS Support
Center.
Adems de un nombre de usuario y una contrasea, tambin puede generar claves de acceso para
cada usuario. Puede utilizar estas claves cuando obtenga acceso a los servicios de AWS mediante
programacin, ya sea a travs de uno de los varios SDK o mediante la AWS Command Line Interface
(CLI). El SDK y las herramientas de CLI usan claves de acceso para firmar criptogrficamente su
solicitud. Si no utiliza las herramientas de AWS, debe firmar usted mismo la solicitud. DynamoDB
supports Signature Version 4, un protocolo para autenticar solicitudes de API de entrada. Para obtener
ms informacin sobre las solicitudes de autenticacin, consulte Signature Version 4 Signing Process en
la AWS General Reference.
Rol de IAM: un rol de IAM es otra identidad de IAM que puede crear en la cuenta y que tiene permisos
especficos. Es similar a un usuario de IAM, pero no est asociado a una determinada persona. Un rol
de IAM le permite obtener claves de acceso temporal que se pueden utilizar para tener acceso a los
servicios y recursos de AWS. Los roles de IAM con credenciales temporales son tiles en las siguientes
situaciones:
Acceso de usuarios federados: en lugar de crear un usuario de IAM, puede usar identidades de
usuario preexistentes de AWS Directory Service, el directorio de usuarios de la empresa o un
proveedor de identidad web. Esto se conoce como usuarios federados. AWS asigna un rol a un
usuario federado cuando se solicita acceso a travs de un proveedor de identidad. Para obtener ms
informacin acerca de los usuarios federados, consulte Usuarios federados y roles en la Gua del
usuario de IAM.
Acceso entre cuentas: puede utilizar un rol IAM en su cuenta para conceder permisos a otra cuenta de
AWS para tener acceso a los recursos de su cuenta. Para ver un ejemplo, consulte Tutorial: Delegate
Access Across AWS Accounts Using IAM Roles en la Gua del usuario de IAM.
Acceso a servicios de AWS: puede utilizar una funcin de IAM de su cuenta para conceder permisos
a un servicio de AWS para tener acceso a los recursos de su cuenta. Por ejemplo, puede crear
un rol que permita a Amazon Redshift tener acceso a un bucket de Amazon S3 en su nombre y, a
continuacin, cargar los datos de ese bucket en un clster de Amazon Redshift. Para obtener ms
informacin, consulte Creating a Role to Delegate Permissions to an AWS Service en la Gua del
usuario de IAM.
Aplicaciones que se ejecutan en Amazon EC2: puede usar un rol de IAM para administrar
credenciales temporales para aplicaciones que se ejecutan en una instancia EC2 y realizan solicitudes
API de AWS. Es preferible hacerlo de este modo a almacenar claves de acceso en la instancia EC2.
Para asignar un rol de AWS a una instancia EC2 y ponerla a disposicin de todas las aplicaciones,
cree un perfil de instancia asociado a la misma. Un perfil de instancia contiene la funcin y permite a
los programas que se encuentran en ejecucin en la instancia EC2 obtener credenciales temporales.
Para obtener ms informacin, consulte Using Roles for Applications on Amazon EC2 en la Gua del
usuario de IAM.
Control de acceso
Puede tener credenciales vlidas para autenticar las solicitudes, pero a menos que tenga permisos
no podr crear ni tener acceso a los recursos de Amazon DynamoDB. Por ejemplo, debe disponer de
permisos para crear una table de Amazon DynamoDB.
En las secciones siguientes se describe cmo administrar los permisos para Amazon DynamoDB. Le
recomendamos que lea primero la informacin general.
Cuando concede permisos, decide quin debe obtener los permisos, para qu recursos se obtienen
permisos y qu acciones especficas desea permitir en esos recursos.
Temas
Recursos y operaciones de Amazon DynamoDB (p. 637)
Titularidad de los recursos (p. 638)
Administracin del acceso a los recursos (p. 638)
Especificar elementos de poltica: acciones, efectos y entidades principales (p. 639)
Especificacin de condiciones en una poltica (p. 640)
Estos recursos principales y secundarios tienen asociado un Nombre de recursos de Amazon (ARN) nico,
tal y como se muestra en la siguiente tabla:
Tabla arn:aws:dynamodb:region:account-id:table/table-name
ndice arn:aws:dynamodb:region:account-id:table/table-name/
index/index-name
De streaming arn:aws:dynamodb:region:account-id:table/table-name/
stream/stream-label
DynamoDB proporciona un conjunto de operaciones para trabajar con recursos de DynamoDB. Para
obtener una lista de las operaciones disponibles, consulte Amazon DynamoDB Actions.
Si utiliza las credenciales de la cuenta raz de su cuenta de AWS para crear a table, su cuenta de AWS
es la propietaria del recurso (en DynamoDB, el recurso es a table).
Si crea un usuario de IAM en su cuenta de AWS y concede permisos para crear una a table para este
usuario, el usuario puede crear una a table. Sin embargo, su cuenta de AWS, a la que pertenece el
usuario, es la propietaria del recurso de table.
Si crea un rol de IAM en su cuenta de AWS con permisos para crear a table, cualquier persona que
pueda asumir el rol podr crear un recurso de a table. La cuenta de AWS, a la que pertenece el usuario,
es la propietaria del recurso de table.
Las polticas asociadas a una identidad de IAM se denominan polticas basadas en identidad (polticas de
IAM) y las polticas asociadas a un recurso se denominan polticas basadas en recursos. DynamoDB solo
admite polticas basadas en identidad (polticas de IAM).
Temas
Polticas basadas en identidad (polticas de IAM) (p. 638)
Polticas basadas en recursos (p. 639)
Asociar una poltica de permisos a un usuario o grupo de una cuenta para conceder a un usuario
permisos para crear un recurso de Amazon DynamoDB, como una a table, puede asociar una poltica de
permisos a un usuario o a un grupo al que pertenezca el usuario.
Asociar una poltica de permisos a un rol (conceder permisos entre cuentas): puede asociar una poltica
de permisos basada en identidad a un rol de IAM para conceder permisos entre cuentas. Por ejemplo, el
administrador de la cuenta A puede crear un rol para conceder permisos entre cuentas a otra cuenta de
AWS (por ejemplo, la cuenta B) o un servicio de AWS como se indica a continuacin:
1. El administrador de la cuenta A crea un rol de IAM y asocia una poltica de permisos a dicho rol, que
concede permisos sobre los recursos de la cuenta A.
2. El administrador de la cuenta A asocia una poltica de confianza al rol que identifica la cuenta B como
la entidad principal que puede asumir el rol.
3. A continuacin, el administrador de la cuenta B puede delegar permisos para asumir el rol a cualquier
usuario de la cuenta B. De este modo, los usuarios de la cuenta B podrn crear recursos y tener
acceso a ellos en la cuenta A. La entidad principal de la poltica de confianza tambin puede ser la
entidad principal de un servicio de AWS si desea conceder permisos para asumir el rol a un servicio
de AWS.
Para obtener ms informacin sobre el uso de IAM para delegar permisos, consulte Access
Management en la Gua del usuario de IAM.
A continuacin, se muestra un ejemplo de poltica que concede permisos para una accin de DynamoDB
(dynamodb:ListTables). El carcter de comodn (*) en el valor de Resource indica que puede utilizar
esta accin para obtener los nombres de todas las tablas que son propiedad de la cuenta de AWS en la
regin de AWS actual.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListTables",
"Effect": "Allow",
"Action": [
"dynamodb:ListTables"
],
"Resource": "*"
}
]
}
Para obtener ms informacin acerca del uso de polticas basadas en identidad con DynamoDB, consulte
Uso de polticas basadas en identidad (polticas de IAM) en Amazon DynamoDB (p. 640). Para obtener
ms informacin acerca de los usuarios, grupos, roles y permisos, consulte Identities (Users, Groups, and
Roles) en la Gua del usuario de IAM.
Recurso: use un nombre de recurso de Amazon (ARN) para identificar el recurso al que se
aplica la poltica. Para obtener ms informacin, consulte Recursos y operaciones de Amazon
DynamoDB (p. 637).
Accin: use palabras de clave de accin para identificar las operaciones del recurso que desea permitir o
denegar. Por ejemplo, puede utilizar dynamodb:Query para allows the user permissions to perform the
DynamoDB Query operation.
Efecto: especifique el efecto (permitir o denegar) cuando el usuario solicite la accin especfica. Si no
concede acceso de forma explcita (permitir) a un recurso, el acceso se deniega implcitamente. Tambin
puede denegar explcitamente el acceso a un recurso para asegurarse de que un usuario no pueda
obtener acceso a l, aunque otra poltica le conceda acceso.
Entidad principal: en las polticas basadas en identidad (polticas de IAM), el usuario al que se asocia
esta poltica es la entidad principal implcita. Para las polticas basadas en recursos, debe especificar el
usuario, la cuenta, el servicio u otra entidad que desee que reciba permisos (se aplica solo a las polticas
basadas en recursos). Polticas basadas en recursos de DynamoDB doesn't support.
Para obtener ms informacin sobre la sintaxis y descripciones de las polticas de IAM consulte AWS IAM
Policy Reference en la gua Gua del usuario de IAM.
Para ver una lista con todas las operaciones de API de Amazon DynamoDB y los recursos a los
que se aplican, consulte Permisos del API de DynamoDB: referencia de acciones, recursos y
condiciones (p. 648).
Para expresar condiciones, se usan claves de condicin predefinidas. Hay claves de condicin que se
aplican a todo AWS y claves especficas de DynamoDB que puede utilizar cuando corresponda. Para ver
una lista completa de claves generales de AWS, consulte Available Keys for Conditions en la Gua del
usuario de IAM. Para obtener una lista completa de las claves especficas de DynamoDB, consulte Uso de
condiciones de polticas de IAM para control de acceso preciso (p. 652).
Le recomendamos que consulte primero los temas de introduccin en los que se explican
los conceptos bsicos y las opciones disponibles para administrar el acceso a sus recursos
de Amazon DynamoDB. Para obtener ms informacin, consulte Informacin general de la
administracin de permisos de acceso a sus recursos de Amazon DynamoDB (p. 637).
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DescribeQueryScanBooksTable",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:Query",
"dynamodb:Scan"
],
"Resource": "arn:aws:dynamodb:us-west-2:account-id:table/Books"
}
]
}
La poltica contiene una instruccin que concede permisos para tres acciones de DynamoDB
(dynamodb:DescribeTable, dynamodb:Query y dynamodb:Scan) en una tabla de la regin us-
west-2, propiedad de la cuenta de AWS especificada por account-id. El nombre de recurso de Amazon
(ARN) del valor de Resource especifica la tabla a la que se aplican los permisos.
Si crea una poltica de IAM que sea ms restrictiva que el mnimo de permisos necesarios, la consola
no funcionar del modo esperado para los usuarios con esa poltica de IAM. Para asegurarse de
que esos usuarios puedan seguir usando la consola de DynamoDB, adjunte tambin la poltica
administrada AmazonDynamoDBReadOnlyAccess al usuario, segn se explica en Polticas administradas
(predefinidas) de AWS para Amazon DynamoDB (p. 641).
No es necesario que conceda permisos mnimos para la consola a los usuarios que solo realizan llamadas
a la CLI de AWS o al API de Amazon DynamoDB.
Las siguientes polticas administradas de AWS, que puede adjuntar a los usuarios de su cuenta, son
especficas de DynamoDB y se agrupan segn los escenarios de caso de uso:
Note
Para consultar estas polticas de permisos, inicie sesin en la consola de IAM y busque las
polticas especficas.
Tambin puede crear sus propias polticas de IAM personalizadas para conceder permisos para acciones y
recursos de DynamoDB. Puede asociar estas polticas personalizadas a los usuarios o grupos de IAM que
requieran esos permisos.
Todos los ejemplos utilizan la regin us-west-2 y contienen identificadores de cuenta ficticios.
Ejemplos
Ejemplo 1: Permiso para que un usuario realice cualquier accin de DynamoDB en una tabla (p. 642)
Ejemplo 2: Permiso para obtener acceso de solo lectura a los elementos de una tabla (p. 643)
Ejemplo 3: Permiso para realizar las operaciones Put, Update y Delete en una tabla
determinada (p. 643)
Ejemplo 4: Permiso para obtener acceso a una tabla concreta y a todos sus ndices (p. 644)
Ejemplo 5: Configuracin de polticas de permisos para entornos de pruebas y produccin
independientes (p. 644)
Ejemplo 6: Cmo evitar que un usuario adquiera ofertas de capacidad reservada (p. 646)
Ejemplo 7: Permiso de acceso de lectura para una secuencia de DynamoDB solamente (no para la
tabla) (p. 646)
Ejemplo 8: Permiso para que una funcin AWS Lambda procese registros de secuencias de
DynamoDB (p. 647)
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllAPIActionsOnBooks",
"Effect": "Allow",
"Action": "dynamodb:*",
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
Note
Si sustituye el nombre de la tabla en el ARN del recurso (Books) por un carcter comodn (*),
permitir que se realice cualquier accin de DynamoDB en todas las tablas de la cuenta. Es
importante estudiar con atencin las implicaciones para la seguridad que podra acarrear una
decisin de este tipo.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyAPIActionsOnBooks",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PutUpdateDeleteOnBooks",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccessAllIndexesOnBooks",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/Books",
"arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
]
}
]
}
Supongamos, adems, que tiene dos desarrolladores, Bob y Alice, que estn realizando las pruebas de
la tabla ProductCatalog. En lugar de crear una cuenta de AWS para cada desarrollador, estos pueden
compartir la misma cuenta de pruebas. En esta cuenta, puede crear una copia de la misma tabla para
cada desarrollador; por ejemplo, Alice_ProductCatalog y Bob_ProductCatalog. En este caso,
puede crear a los usuarios de IAM Alice y Bob en la cuenta de AWS que cre para el entorno de pruebas.
A continuacin, puede conceder permisos a estos usuarios para que lleven a cabo acciones de DynamoDB
en las tablas de su propiedad.
Para conceder permisos a estos usuarios, puede realizar uno de los siguientes procedimientos:
Cree una poltica independiente para cada usuario y, a continuacin, adjunte cada poltica a su usuario
por separado. Por ejemplo, puede adjuntar la siguiente poltica al usuario Alice para concederle acceso a
todas las acciones de DynamoDB en la tabla Alice_ProductCatalog:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllAPIActionsOnAliceTable",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/
Alice_ProductCatalog"
}
]
}
Despus, puede crear una poltica distinta con un recurso diferente (la tabla Bob_ProductCatalog)
para el usuario Bob.
En vez de adjuntar polticas a cada usuario, puede usar variables de polticas de IAM para escribir
una sola poltica y adjuntrsela a un grupo. Debe crear un grupo y, en el caso de este ejemplo,
agregar a ese grupo a los dos usuarios, Alice y Bob. A continuacin, se muestra un ejemplo en
el que se conceden permisos para llevar a cabo todas las acciones de DynamoDB en la tabla
${aws:username}_ProductCatalog. Al evaluar la poltica, la variable ${aws:username} se
reemplaza por el nombre de usuario del solicitante. Por ejemplo, si Alice enva una solicitud para que
se agregue un elemento, la accin solamente se permite si Alice est agregando elementos a la tabla
Alice_ProductCatalog.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllAPIActionsOnUserSpecificTable",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/
${aws:username}_ProductCatalog"
},
{
"Sid": "AdditionalPrivileges",
"Effect": "Allow",
"Action": [
"dynamodb:ListTables",
"dynamodb:DescribeTable",
"cloudwatch:*",
"sns:*"
],
"Resource": "*"
}
]
}
Note
Tenga en cuenta que, en lugar de identificar una tabla especfica como un recurso, puede utilizar un
carcter comodn (*) para conceder permisos en todas las tablas cuyo nombre lleve antepuesto el nombre
del usuario de IAM que realiza la solicitud, tal y como se muestra a continuacin:
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"
DynamoDB ofrece las siguientes operaciones de API para controlar el acceso a la administracin de la
capacidad reservada:
La Consola de administracin de AWS utiliza estas operaciones de API para mostrar informacin sobre la
capacidad reservada y realizar adquisiciones. No puede llamar a estas operaciones desde un programa
de aplicacin, ya que solo se encuentran accesibles desde la consola. Sin embargo, s puede permitir o
denegar el acceso a estas operaciones en una poltica de permisos de IAM.
La siguiente poltica permite a los usuarios consultar las ofertas y las adquisiciones actuales de capacidad
reservada mediante la Consola de administracin de AWS, pero no permite llevar a cabo nuevas
adquisiciones.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowReservedCapacityDescriptions",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeReservedCapacity",
"dynamodb:DescribeReservedCapacityOfferings"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
},
{
"Sid": "DenyReservedCapacityPurchases",
"Effect": "Deny",
"Action": "dynamodb:PurchaseReservedCapacityOfferings",
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
}
]
}
En algunos casos, es posible que desee impedir que una aplicacin lea datos desde una tabla de
DynamoDB, pero al mismo tiempo desee permitir que se pueda obtener acceso a la secuencia de esa
tabla. Por ejemplo, puede configurar AWS Lambda para que sondee la secuencia e invoque una funcin
Lambda cuando se detecten actualizaciones de elementos y, a continuacin, realice un procesamiento
adicional.
Existen las siguientes acciones disponibles para controlar el acceso a Flujos de DynamoDB:
dynamodb:DescribeStream
dynamodb:GetRecords
dynamodb:GetShardIterator
dynamodb:ListStreams
En el ejemplo siguiente se crea una poltica que concede a los usuarios permisos para obtener acceso a
las secuencias de una tabla denominada GameScores. El carcter comodn (*) que aparece al final del
ARN permite obtener todos los identificadores de secuencia asociados a esa tabla.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccessGameScoresStreamOnly",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeStream",
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:ListStreams"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
}
]
}
Observe que esta poltica permite obtener acceso a las secuencias de la tabla GameScores, pero no a la
tabla en s.
Para conceder permisos a Lambda, se utiliza la poltica de permisos asociada al rol de IAM (rol de
ejecucin) de la funcin Lambda. Este rol se especifica al crear dicha funcin.
Por ejemplo, puede asociar la siguiente poltica de permisos al rol de ejecucin con el fin de conceder
permisos Lambda para realizar las acciones de Flujos de DynamoDB indicadas.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowLambdaFunctionInvocation",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"*"
]
},
{
"Sid": "AllAPIAccessForDynamoDBStreams",
"Effect": "Allow",
"Action": [
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:DescribeStream",
"dynamodb:ListStreams"
],
"Resource": "*"
}
]
}
Para obtener ms informacin, consulte AWS Lambda Permission Model en la AWS Lambda Developer
Guide.
Puede utilizar claves de condiciones generales de AWS en sus polticas de DynamoDB para expresar
condiciones. Para ver una lista completa de claves generales de AWS, consulte la seccin Available Keys
de la gua Gua del usuario de IAM.
Adems de las claves de condicin que afectan a AWS en su conjunto, DynamoDB tiene sus propias
claves que puede utilizar en las condiciones. Para obtener ms informacin, consulte Uso de condiciones
de polticas de IAM para control de acceso preciso (p. 652).
Note
Para especificar una accin, use el prefijo dynamodb: seguido del nombre de operacin de la API
(por ejemplo, dynamodb:CreateTable).
BatchGetItem
Acciones: dynamodb:BatchGetItem
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
BatchWriteItem
Acciones: dynamodb:BatchWriteItem
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
CreateTable
Acciones: dynamodb:CreateTable
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
DeleteItem
Acciones: dynamodb:DeleteItem
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
DeleteTable
Acciones: dynamodb:DeleteTable
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
DescribeReservedCapacity
Acciones: dynamodb:DeleteTable
Recurso:
arn:aws:dynamodb:region:account-id:*
DescribeReservedCapacityOfferings
Acciones: dynamodb:DescribeReservedCapacityOfferings
Recurso:
arn:aws:dynamodb:region:account-id:*
DescribeStream
Acciones: dynamodb:DescribeStream
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name/stream/stream-label
o bien
arn:aws:dynamodb:region:account-id:table/table-name/stream/*
DescribeTable
Acciones: dynamodb:DescribeTable
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
GetItem
Acciones: dynamodb:GetItem
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
GetRecords
Acciones: dynamodb:GetRecords
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name/stream/stream-label
o bien
arn:aws:dynamodb:region:account-id:table/table-name/stream/*
GetShardIterator
Acciones: dynamodb:GetShardIterator
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name/stream/stream-label
o bien
arn:aws:dynamodb:region:account-id:table/table-name/stream/*
ListStreams
Acciones: dynamodb:ListStreams
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name/stream/*
o bien
arn:aws:dynamodb:region:account-id:table/*/stream/*
ListTables
Acciones: dynamodb:ListTables
Recurso:
PurchaseReservedCapacityOfferings
Acciones: dynamodb:PurchaseReservedCapacityOfferings
Recurso:
arn:aws:dynamodb:region:account-id:*
PutItem
Acciones: dynamodb:PutItem
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
consulta
Acciones: dynamodb:Query
Recurso:
o bien:
arn:aws:dynamodb:region:account-id:table/table-name
arn:aws:dynamodb:region:account-id:table/table-name/index/index-name
o bien:
arn:aws:dynamodb:region:account-id:table/table-name/index/*
Scan
Acciones: dynamodb:Scan
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien:
arn:aws:dynamodb:region:account-id:table/table-name
arn:aws:dynamodb:region:account-id:table/table-name/index/index-name
o bien:
arn:aws:dynamodb:region:account-id:table/table-name/index/*
UpdateItem
Acciones: dynamodb:UpdateItem
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
UpdateTable
Acciones: dynamodb:UpdateTable
Recurso:
arn:aws:dynamodb:region:account-id:table/table-name
o bien
arn:aws:dynamodb:region:account-id:table/*
Temas relacionados
Control de acceso (p. 636)
Uso de condiciones de polticas de IAM para control de acceso preciso (p. 652)
Informacin general
En DynamoDB, existe la opcin de especificar condiciones al conceder permisos mediante una poltica de
IAM (consulte Control de acceso (p. 636)). Por ejemplo, puede hacer lo siguiente:
Conceder permisos para que los usuarios puedan obtener acceso de solo lectura a determinados
elementos y atributos de una tabla o un ndice secundario.
Conceder permisos para que los usuarios puedan obtener acceso de solo escritura a determinados
atributos de una tabla, segn la identidad del usuario en cuestin.
En DynamoDB, puede utilizar las claves de condicin para especificar las condiciones en una poltica de
IAM, tal y como se muestra en el caso de uso en la siguiente seccin.
Note
Algunos servicios de AWS tambin admiten las condiciones basados en etiquetas, pero
DynamoDB no las admite.
Conceder permisos en una tabla, pero restringir el acceso a elementos especficos de esa tabla segn
los valores de determinadas claves principales. Un ejemplo de ello sera una aplicacin de una red social
de juegos en la cual los datos de juegos guardados de todos los usuarios se almacenan en una nica
tabla, pero ningn usuario puede obtener acceso a los elementos de datos que no son de su propiedad,
como se muestra en la siguiente ilustracin:
Ocultar la informacin de tal forma que nicamente un subconjunto de atributos se encuentre visible
para el usuario. Un ejemplo de ello sera una aplicacin que muestra datos de vuelos en los aeropuertos
cercanos a la ubicacin donde se encuentra el usuario. Se muestran los nombres de las compaas
areas, los horarios de llegada y salida y los nmeros de los vuelos. Sin embargo, se ocultan otros
atributos como el nombre de los pilotos o el nmero de pasajeros, como se muestra en la siguiente
ilustracin:
Para implementar este tipo de control de acceso preciso, hay que escribir una poltica de permisos de
IAM que especifique las condiciones para obtener acceso a las credenciales de seguridad y los permisos
asociados. A continuacin, se aplica la poltica de IAM a los usuarios, los grupos o los roles creados
mediante la consola de IAM. La poltica de IAM puede restringir el acceso a elementos individuales de una
tabla, a los atributos de estos elementos o a ambas cosas al mismo tiempo.
Si lo desea, puede usar las identidades web federadas para controlar el acceso de los usuarios cuya
autenticacin se lleva a cabo mediante Login with Amazon, Facebook o Google. Para obtener ms
informacin, consulte Uso de identidades web federadas (p. 663).
El componente Condition de IAM se utiliza para implementar una poltica de control de acceso precisa.
Puede agregar un componente Condition a una poltica de permisos para permitir o denegar el acceso a
los elementos y atributos de las tablas e ndices de DynamoDB en funcin de sus requisitos empresariales
concretos.
Por ejemplo, tomemos una aplicacin de juegos para mviles que permite a los usuarios seleccionar
un juego entre diversas opciones y jugar a l. La aplicacin utiliza una tabla de DynamoDB
denominadaGameScores para llevar la cuenta de las puntuaciones altas y otros datos de los usuarios.
Cada elemento de la tabla se identifica de forma exclusiva con un identificador de usuario y el nombre
del juego que ha utilizado el usuario. La tabla GameScores tiene una clave principal compuesta de una
clave de particin (UserId) y de una clave de ordenacin (GameTitle). Cada usuario solo tiene acceso
a los datos de juego asociados a su propio identificador de usuario. Para poder jugar, el usuario debe
pertenecer a un rol de IAM denominado GameRole, que tiene adjunta una poltica de seguridad.
Para administrar los permisos de los usuarios en esta aplicacin, podra escribir una poltica de permisos
como la siguiente:
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAccessToOnlyItemsMatchingUserID",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${www.amazon.com:user_id}"
],
"dynamodb:Attributes": [
"UserId",
"GameTitle",
"Wins",
"Losses",
"TopScore",
"TopScoreDateTime"
]
},
"StringEqualsIfExists": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES"
}
}
}
]
}
dynamodb:LeadingKeys: esta clave de condicin permite a los usuarios obtener acceso solo a los
elementos cuyo valor de clave de particin coincide con su identificador de usuario. Este identificador,
${www.amazon.com:user_id}, es una variable de sustitucin. Para obtener ms informacin sobre
las variables de sustitucin, consulte Uso de identidades web federadas (p. 663).
dynamodb:Attributes: esta clave de condicin limita el acceso a los atributos concretos, de tal
forma que solamente las acciones enumeradas en la poltica de permisos pueden devolver valores para
estos atributos. Adems, la clusula StringEqualsIfExists garantiza que la aplicacin proporcione
siempre una lista de atributos especficos que admiten acciones e impide que aplicacin pueda solicitar
todos los atributos.
Al evaluar una poltica de IAM, el resultado siempre es true (verdadero, se permite el acceso) o false (falso,
se deniega el acceso). Si cualquier parte del componente Condition es false, la poltica completa se
evala en false y se deniega el acceso.
Important
Si utiliza dynamodb:Attributes, debe especificar los nombres de todos los atributos de clave
principal y clave de ndice de la tabla y tambin de todos los ndices secundarios enumerados en
la poltica. De lo contrario, DynamoDB no podr utilizar estos atributos de clave para realizar la
accin solicitada.
Los documentos de polticas de IAM solamente pueden contener los siguientes caracteres Unicode:
tabulador horizontal (U+0009), salto de lnea (U+000A), retorno de carro (U+000D) y caracteres
comprendidos entre U+0020 y U+00FF.
En la siguiente tabla se muestran las claves de condicin especficas del servicio DynamoDB que se
aplican a DynamoDB
ALL_ATTRIBUTES
ALL_PROJECTED_ATTRIBUTES
SPECIFIC_ATTRIBUTES
COUNT
AttributesToGet
ALL_OLD
UPDATED_OLD
ALL_NEW
UPDATED_NEW
NONE
TOTAL
NONE
Cada uno de los ejemplos de la seccin siguiente establece la clusula Effect en Allow y
especifica solamente las acciones, los recursos y los parmetros que se permiten. nicamente se
permite el acceso a aquello que se indica explcitamente en la poltica de IAM.
En algunos casos, se pueden modificar estas polticas de tal forma que se basen en la
denegacin (en cuyo caso, se establecera la clusula Effect en Deny y se invertira toda
la lgica de la poltica). Sin embargo, recomendamos evitar el uso de polticas basadas en la
denegacin con DynamoDB, ya que son difciles de escribir correctamente en comparacin con
las polticas basadas el permiso. Adems, cualquier cambio futuro del API de DynamoDB (o de
las entradas al API existente) podran dejar sin efectividad una poltica basada en la denegacin.
Todos los ejemplos utilizan la regin us-west-2 y contienen identificadores de cuenta ficticios.
La lista de acciones no incluye permisos para Scan, porque Scan devuelve todos los elementos,
sean cuales sean sus claves principales.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FullAccessToUserItems",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${www.amazon.com:user_id}"
]
}
}
}
]
}
Note
Cuando utiliza variables de polticas, debe especificar de forma explcita la versin 2012-10-17
en la poltica. La versin predeterminada del lenguaje de la poltica de acceso, 2008-10-17, no
admite variables de polticas.
Para implementar el acceso de solo lectura, puede eliminar todas las acciones que permitan modificar los
datos. En la siguiente poltica, solo se incluyen en la condicin las acciones que proporcionan acceso de
solo lectura.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyAccessToUserItems",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${www.amazon.com:user_id}"
]
}
}
}
]
}
Important
Si utiliza dynamodb:Attributes, debe especificar los nombres de todos los atributos de clave
principal y clave de ndice, tanto de la tabla como de todos los ndices secundarios enumerados
en la poltica. De lo contrario, DynamoDB no podr utilizar estos atributos de clave para realizar la
accin solicitada.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LimitAccessToSpecificAttributes",
"Effect": "Allow",
"Action": [
"dynamodb:UpdateItem",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:BatchGetItem",
"dynamodb:Scan"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:Attributes": [
"UserId",
"TopScore"
]
},
"StringEqualsIfExists": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES",
"dynamodb:ReturnValues": [
"NONE",
"UPDATED_OLD",
"UPDATED_NEW"
]
}
}
}
]
}
Note
La poltica adopta un enfoque de lista blanca que permite obtener acceso a los atributos que se
nombran explcitamente. En lugar de ello, puede escribir una poltica equivalente que deniegue el
acceso a los dems atributos (es decir, que utilice un enfoque de lista negra). No recomendamos
el enfoque de lista negra porque los usuarios podran averiguar cules son los nombres de los
atributos contenidos en ella; bastara con que emitiesen solicitudes repetidamente con todos los
nombres de atributos posibles hasta encontrar aquel al que no se les permite obtener acceso.
Para evitar esta situacin, siga el principio de mnimo privilegio que se explica en Wikipedia
en la direccin http://en.wikipedia.org/wiki/Principle_of_least_privilege y aplique un enfoque de
lista blanca para enumerar todos los valores permitidos, en lugar de especificar los atributos
denegados.
Esta poltica no permite PutItem, DeleteItem ni BatchWriteItem porque estas acciones siempre
sustituyen el elemento anterior en su totalidad y esto permitira a los usuarios eliminar valores de atributos
anteriores a los que no se les permite obtener acceso.
condicin StringNotLike impide que una aplicacin actualice los atributos especificados con la clave de
condicin dynamodb:Attributes.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PreventUpdatesOnCertainAttributes",
"Effect": "Allow",
"Action": [
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
"Condition": {
"ForAllValues:StringNotLike": {
"dynamodb:Attributes": [
"FreeGamesAvailable",
"BossLevelUnlocked"
]
},
"StringEquals": {
"dynamodb:ReturnValues": [
"NONE",
"UPDATED_OLD",
"UPDATED_NEW"
]
}
}
}
]
}
La accin UpdateItem, al igual que otras acciones de escritura, requiere acceso de lectura a los
elementos para que pueda devolver valores antes y despus de la actualizacin. En la poltica, se
limita la accin para obtener acceso exclusivamente a los atributos que est permitido actualizar
especificando la clave de condicin dynamodb:ReturnValues. La clave de condicin restringe el valor
de ReturnValues en la solicitud porque solo permite especificar NONE, UPDATED_OLD o UPDATED_NEW
y no incluye ALL_OLD ni ALL_NEW.
Las acciones PutItem y DeleteItem sustituyen un elemento completo y, por consiguiente, permiten
que las aplicaciones modifiquen cualquier atributo. As pues, para limitar una aplicacin de modo que
nicamente pueda actualizar determinados atributos, no debe conceder permisos para estos API.
Para exigir a la aplicacin que especifique una lista de atributos en la consulta, la poltica especifica
tambin la clave de condicin dynamodb:Select de modo que requiere que el parmetro Select
de la accin Query de DynamoDB sea SPECIFIC_ATTRIBUTES. La lista de atributos se limita a unos
elementos concretos que se obtienen utilizando la clave de condicin dynamodb:Attributes.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "QueryOnlyProjectedIndexAttributes",
"Effect": "Allow",
"Action": [
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/
TopScoreDateTimeIndex"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:Attributes": [
"TopScoreDateTime",
"GameTitle",
"Wins",
"Losses",
"Attempts"
]
},
"StringEquals": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES"
}
}
}
]
}
La siguiente poltica de permisos es similar, pero la consulta debe solicitar todos los atributos que se han
proyectado en el ndice.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "QueryAllIndexAttributes",
"Effect": "Allow",
"Action": [
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/
TopScoreDateTimeIndex"
],
"Condition": {
"StringEquals": {
"dynamodb:Select": "ALL_PROJECTED_ATTRIBUTES"
}
}
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LimitAccessToCertainAttributesAndKeyValues",
"Effect": "Allow",
"Action": [
"dynamodb:UpdateItem",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:BatchGetItem"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/
TopScoreDateTimeIndex"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${graph.facebook.com:id}"
],
"dynamodb:Attributes": [
"attribute-A",
"attribute-B"
]
},
"StringEqualsIfExists": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES",
"dynamodb:ReturnValues": [
"NONE",
"UPDATED_OLD",
"UPDATED_NEW"
]
}
}
}
]
}
Las acciones de escritura permitidas por la poltica (UpdateItem) solo pueden modificar attribute-A
o attribute-B.
Dado que la poltica permite UpdateItem, una aplicacin puede insertar nuevos elementos
y los atributos ocultos sern null en los nuevos elementos. Si estos atributos se proyectan en
TopScoreDateTimeIndex, la poltica presentar el beneficio agregado de impedir las consultas que
generen operaciones de recuperacin (fetch) en la tabla.
Las aplicaciones no pueden leer ningn atributo que no figure en dynamodb:Attributes. Con esta
poltica en vigor, una aplicacin debe establecer el parmetro Select en SPECIFIC_ATTRIBUTES
en las solicitudes de lectura y solamente se pueden solicitar los atributos que pertenecen a la lista
blanca. En las solicitudes de escritura, la aplicacin no puede establecer ReturnValues en ALL_OLD ni
ALL_NEW ni puede llevar a cabo operaciones de escritura condicionales basadas en otros atributos que
no sean estos.
Temas relacionados
Control de acceso (p. 636)
Permisos del API de DynamoDB: referencia de acciones, recursos y condiciones (p. 648)
Web Identity Federation Playground es un sitio web interactivo donde encontrar instrucciones sobre el
proceso de autenticacin mediante Login with Amazon, Facebook o Google, obtencin de credenciales
de seguridad temporales y su uso para realizar una solicitud a AWS.
El artculo Web Identity Federation using the AWS SDK for .NET del blog AWS .NET Development
describe paso a paso cmo utilizar las identidades web federadas con Facebook e incluye fragmentos
de cdigo C# que muestran cmo asumir un rol de IAM con identidad web y usar unas credenciales de
seguridad temporales para obtener acceso a un recurso de AWS.
El SDK para iOS de AWS y el SDK para Android de AWS contienen ejemplos de aplicaciones.
Estas aplicaciones incluyen cdigo que muestra cmo invocar a los proveedores de identidad y, a
continuacin, cmo utilizar la informacin de estos proveedores para recibir y utilizar credenciales de
seguridad temporales.
En el artculo Web Identity Federation with Mobile Applications se explican las identidades web
federadas y se muestra un ejemplo de cmo utilizarlas para obtener acceso a un recurso de AWS.
Nombre de la tabla Tipo de clave principal Nombre y tipo de clave Nombre y tipo de clave
de particin de ordenacin
Ahora, supongamos que una aplicacin de juegos para mviles utiliza la aplicacin, con lo cual esta tiene
que aceptar miles o incluso millones de usuarios. A esta escala, resulta muy complicado administrar
individualmente a los usuarios de la aplicacin y garantizar que cada uno de ellos nicamente pueda
obtener acceso a sus propios datos en la tabla GameScores. Afortunadamente, muchos usuarios ya tiene
cuentas de un proveedor de identidades tercero, como Facebook, Google o Login with Amazon. Por este
motivo, es lgico utilizar alguno de ellos para llevar a cabo las tareas de autenticacin.
Para hacer esto mediante las identidades web federadas, el desarrollador de la aplicacin debe registrar
esta ltima en un proveedor de identidades (como Login with Amazon) y obtener un identificador
de aplicacin exclusivo. A continuacin, el desarrollador debe crear un rol de IAM. En este ejemplo,
asignaremos a este rol el nombre de GameRole. El rol debe tener adjunto un documento de poltica de IAM
en el que se especifiquen las condiciones en virtud de las cuales la aplicacin podr obtener acceso a la
tabla GameScores.
Cuando un usuario desee jugar, iniciar sesin en esta cuenta de Login with Amazon desde la propia
aplicacin de juegos. A continuacin, la aplicacin llamar a AWS Security Token Service (AWS STS),
proporcionar el identificador de aplicacin de Login with Amazon y solicitar formar parte de GameRole.
AWS STS devolver credenciales temporales de AWS a la aplicacin y permitir que esta ltima obtenga
acceso a la tabla GameScores, de acuerdo con lo establecido en el documento de poltica GameRole.
3. La aplicacin llama a DynamoDB para obtener acceso a la tabla GameScores. Dado que la aplicacin
ha asumido el rol GameRole, est sujeta a la poltica de seguridad asociada a ese rol. El documento de
poltica impide que la aplicacin obtenga acceso a datos que no pertenecen al usuario.
Una vez ms, esta es la poltica de seguridad de GameRole que se mostr en Uso de condiciones de
polticas de IAM para control de acceso preciso (p. 652):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAccessToOnlyItemsMatchingUserID",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${www.amazon.com:user_id}"
],
"dynamodb:Attributes": [
"UserId",
"GameTitle",
"Wins",
"Losses",
"TopScore",
"TopScoreDateTime"
]
},
"StringEqualsIfExists": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES"
}
}
}
]
}
La clusula Condition determina qu elementos de GameScores estn visibles para la aplicacin. Para
ello, compara el identificador de Login with Amazon con los valores de las claves de particin UserId de
GameScores. Solamente los elementos que pertenecen al usuario actual se pueden procesar utilizando
una de las acciones de DynamoDB que se enumeran en esta poltica; no se puede obtener acceso a
los dems elementos de la tabla. Adems, solo se puede obtener acceso a los atributos especficos
enumerados en la poltica.
1. Inicie sesin como desarrollador con un proveedor de identidades tercero. Los siguientes enlaces
externos proporcionan informacin sobre cmo inscribirse en los proveedores de identidad admitidos:
Durante el proceso de creacin de roles, deber adjuntar una poltica de IAM al rol. El documento de
poltica debe definir los recursos de DynamoDB que la aplicacin requiere y los permisos para obtener
acceso a ellos.
Para obtener ms informacin, consulte About Web Identity Federation en la Gua del usuario de IAM.
Note
Como alternativa a AWS Security Token Service, puede utilizar Amazon Cognito. Amazon Cognito
es el servicio preferido para administrar credenciales temporales de aplicaciones para mviles.
Para obtener ms informacin, consulte las pginas siguientes:
Cuando est conforme con los ajustes, haga clic en Create policy. Aparecer la poltica generada.
6. Haga clic en Attach policy instructions y siga los pasos necesarios para asociar la poltica generada a
un rol de IAM.
En tiempo de ejecucin, si la aplicacin utiliza identidades web federadas, deber seguir estos pasos:
Una vez que el proveedor de identidades ha autenticado al usuario, devuelve un token de identidad web
a la aplicacin. El formato de este token depende del proveedor, pero suele ser una cadena muy larga
de caracteres.
2. Obtenga credenciales temporales de seguridad de AWS. Para ello, la aplicacin enva una solicitud
AssumeRoleWithWebIdentity a AWS Security Token Service (AWS STS). Esta solicitud contiene:
El token de identidad web del paso anterior
El identificador de la aplicacin del proveedor de identidades
El nombre de recurso de Amazon (ARN) del rol de IAM que se ha creado para este proveedor de
identidades y esta aplicacin
AWS STS devuelve un conjunto de credenciales de seguridad de AWS que vencen transcurrido un
periodo determinado (el valor predeterminado son 3600segundos).
GET / HTTP/1.1
Host: sts.amazonaws.com
Content-Type: application/json; charset=utf-8
URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
&DurationSeconds=900&Action=AssumeRoleWithWebIdentity
&Version=2011-06-15&RoleSessionName=web-identity-federation
&RoleArn=arn:aws:iam::123456789012:role/GameRole
&WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters
omitted)
<AssumeRoleWithWebIdentityResponse
xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<AssumeRoleWithWebIdentityResult>
<SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</
SubjectFromWebIdentityToken>
<Credentials>
<SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters
omitted)</SessionToken>
<SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
<Expiration>2013-10-01T22:14:35Z</Expiration>
<AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
</Credentials>
<AssumedRoleUser>
<Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
<AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
</AssumedRoleUser>
</AssumeRoleWithWebIdentityResult>
<ResponseMetadata>
<RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
</ResponseMetadata>
</AssumeRoleWithWebIdentityResponse>
3. Obtenga acceso a los recursos de AWS. La respuesta de AWS STS contiene informacin que la
aplicacin requerir para poder obtener acceso a los recursos de DynamoDB:
API Version 2012-08-10
667
Amazon DynamoDB Developer Guide
Cmo escribir la aplicacin para
usar las identidades web federadas
${www.amazon.com:user_id} amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE
${graph.facebook.com:id} 123456789
${accounts.google.com:sub} 123456789012345678901
Para obtener ejemplos de polticas de IAM en las que se utilizan estas variables de poltica, consulte
Ejemplos de polticas: uso de condiciones para control de acceso preciso (p. 656).
Para obtener ms informacin acerca de cmo se generan las credenciales temporales de acceso en AWS
Security Token Service, consulte Requesting Temporary Security Credentials en la Gua del usuario de
IAM.
Monitorizacin de DynamoDB
El siguiente paso consiste en establecer un punto de referencia del desempeo normal de Amazon
DynamoDB en su entorno. Para ello, se mide el desempeo en distintos momentos y bajo distintas
condiciones de carga. A medida que monitorice Amazon DynamoDB, debe tener en cuenta el
almacenamiento de los datos histricos de monitorizacin. Estos datos almacenados le darn un punto de
referencia con el que comparar los datos de desempeo actuales, identificar los patrones de desempeo
normales y las anomalas de desempeo, as como desarrollar mtodos de resolucin de problemas.
Para establecer un punto de referencia debe, como mnimo, monitorizar los elementos siguientes:
Temas
Herramientas de monitorizacin (p. 670)
Monitorizacin con Amazon CloudWatch (p. 671)
Registro de operaciones de DynamoDB mediante AWS CloudTrail (p. 688)
Herramientas de monitorizacin
AWS proporciona herramientas que puede utilizar para monitorizar Amazon DynamoDB. Puede configurar
algunas de estas herramientas para que realicen la labor de monitorizacin automticamente; sin embargo,
otras requieren intervencin manual. Le recomendamos que automatice las tareas de monitorizacin en la
medida de lo posible.
Amazon CloudWatch Alarms: puede ver una nica mtrica durante el periodo que especifique y realizar
una o varias acciones segn el valor de la mtrica en relacin con un determinado umbral durante una
serie de periodos de tiempo. La accin es una notificacin que se enva a un tema de Amazon Simple
Notification Service (Amazon SNS) o a una poltica de Auto Scaling. Las alarmas de CloudWatch no
invocan acciones simplemente por tener un estado determinado. Es necesario que el estado haya
cambiado y se mantenga durante un nmero especificado de periodos. Para obtener ms informacin,
consulte Monitorizacin con Amazon CloudWatch (p. 671).
Amazon CloudWatch Logs: para monitorizar, almacenar y tener acceso a los archivos de registro de
AWS CloudTrail u otras fuentes. Para obtener ms informacin, consulte Monitorizar los archivos de
registro en la Gua del usuario de Amazon CloudWatch.
Amazon CloudWatch Events: seleccione los eventos y dirjalos a uno o varios flujos o funciones de
destino para realizar cambios, capturar informacin de estado y aplicar medidas correctivas. Para
obtener ms informacin, consulte Uso de eventos en la Gua del usuario de Amazon CloudWatch.
Monitorizacin de registros de AWS CloudTrail: compartir archivos de registro entre cuentas, monitorizar
archivos de registro de CloudTrail en tiempo real mediante su envo a CloudWatch Logs, escribir
aplicaciones de procesamiento de registros en Java y validar que sus archivos de registro no hayan
cambiado despus de que CloudTrail los entregue. Para obtener ms informacin, consulte Trabajar con
archivos de registro de CloudTrail en la AWS CloudTrail User Guide.
Temas
Mtricas y dimensiones de Amazon DynamoDB (p. 671)
Cmo utilizo las mtricas de Amazon DynamoDB? (p. 685)
Creacin de alarmas de CloudWatch para monitorizar Amazon DynamoDB (p. 686)
Las mtricas se agrupan en primer lugar por el espacio de nombres de servicio y, a continuacin, por las
diversas combinaciones de dimensiones dentro de cada espacio de nombres.
Mtricas de DynamoDB
Las siguientes mtricas estn disponibles desde Amazon DynamoDB. Tenga en cuenta que DynamoDB
solo enva mtricas a CloudWatch cuando tienen un valor distinto de cero. Por ejemplo, la mtrica
UserErrors se incrementa cuando una solicitud genera un cdigo de estado HTTP 400. Si no se
encuentran errores HTTP 400 durante un periodo de tiempo, CloudWatch no proporcionar mtricas para
UserErrors durante ese periodo.
Note
ConditionalCheckFailedRequests
ConsumedReadCapacityUnits
ConsumedWriteCapacityUnits
ReadThrottleEvents
ReturnedBytes
ReturnedItemCount
ReturnedRecordsCount
SuccessfulRequestLatency
SystemErrors
TimeToLiveDeletedItemCount
ThrottledRequests
UserErrors
WriteThrottleEvents
No todas las estadsticas, como Average o Sum, se aplican a cada mtrica. Sin embargo, todos estos
valores estn disponibles a travs de la consola de Amazon DynamoDB o mediante la consola de
CloudWatch, la AWS CLI o los SDK de AWS para todas las mtricas. En la tabla siguiente, cada mtrica
tiene una lista de estadsticas vlidas aplicable a dicha mtrica.
Mtrica Descripcin
unidades: Count
Dimensiones: TableName
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Mtrica Descripcin
Sum
unidades: Count
Estadsticas vlidas:
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Sum
unidades: Count
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Sum
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Sum
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
SampleCount
Sum
unidades: Bytes
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Sum
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Sum
unidades: Count
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
Sum
Mtrica Descripcin
unidades: Milliseconds
Estadsticas vlidas:
Minimum
Maximum
Average
SampleCount
unidades: Count
Estadsticas vlidas:
Sum
SampleCount
unidades: Count
Dimensiones: TableName
Estadsticas vlidas:
Sum
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Sum
SampleCount
Mtrica Descripcin
ProvisionedThroughputExceededException: consulte la
mtrica ThrottledRequests en esta seccin.
ConditionalCheckFailedException: consulte la mtrica
ConditionalCheckFailedRequests en esta seccin.
unidades: Count
Estadsticas vlidas:
Sum
SampleCount
Mtrica Descripcin
unidades: Count
Estadsticas vlidas:
Sum
SampleCount
Dimensin Descripcin
Operation Esta dimensin limita los datos a una de las siguientes operaciones
de DynamoDB:
PutItem
DeleteItem
UpdateItem
GetItem
BatchGetItem
Scan
Dimensin Descripcin
Query
BatchWriteItem
GetRecords
TableName Esta dimensin limita los datos a una tabla especfica. Este valor
puede ser cualquier nombre de tabla de la regin actual y de la
cuenta de AWS actual.
3. Pruebe la alarma.
Note
clculos de envo de alarmas en consecuencia. Puede evitar este proceso si crea alarmas en la
consola de DynamoDB. De este modo, las alarmas se actualizan automticamente.
3. Pruebe la alarma.
--unit Count \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:notify-on-system-errors
3. Pruebe la alarma.
Amazon DynamoDB
CreateTable
DeleteTable
DescribeTable
DescribeTimeToLive
ListTables
UpdateTable
UpdateTimeToLive
DescribeReservedCapacity
DescribeReservedCapacityOfferings
PurchaseReservedCapacityOfferings
Flujos de DynamoDB
DescribeStream
ListStreams
CreateCluster
CreateParameterGroup
CreateSubnetGroup
DecreaseReplicationFactor
DeleteCluster
DeleteParameterGroup
DeleteSubnetGroup
DescribeClusters
DescribeDefaultParameters
DescribeEvents
DescribeParameterGroups
DescribeParameters
DescribeSubnetGroups
IncreaseReplicationFactor
ListTags
RebootNode
TagResource
UntagResource
UpdateCluster
UpdateParameterGroup
UpdateSubnetGroup
Cada entrada de log contiene informacin sobre quin gener la solicitud. La informacin de identidad del
usuario que figura en el log le ayudar a determinar si la solicitud se hizo con credenciales de usuario de
IAM o raz, con credenciales de seguridad temporales para un rol o un usuario federado, o mediante otro
servicio de AWS. Para obtener ms informacin, consulte el campo userIdentity en Referencia de eventos
de CloudTrail.
Puede almacenar los archivos de log en su bucket todo el tiempo que desee, y tambin puede definir
reglas de ciclo de vida de Amazon S3 para archivar o eliminar archivos de log automticamente. De forma
predeterminada, los archivos de log se cifran mediante cifrado en el lado de servidor de Amazon S3 (SSE).
Puede hacer que CloudTrail publique notificaciones de Amazon SNS cuando se entreguen los nuevos
archivos de log si desea actuar rpidamente al recibir un archivo de log. Para obtener ms informacin,
consulte Configuring Amazon SNS Notifications.
Tambin puede agregar archivos log de DynamoDB desde varias regiones y varias cuentas de AWS en
un solo bucket de Amazon S3. Para obtener ms informacin, consulte Recibir archivos de registro de
CloudTrail de varias regiones.
accin, etctera. Las entradas de log no se muestran en ningn orden concreto. Es decir, no representan
un rastro del stack ordenado de las llamadas al API de bajo nivel de DynamoDB.
{"Records": [
{
"eventVersion": "1.03",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AKIAIOSFODNN7EXAMPLE:bob",
"arn": "arn:aws:sts::111122223333:assumed-role/users/bob",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2015-05-28T18:06:01Z"
},
"sessionIssuer": {
"type": "Role",
"principalId": "AKIAI44QH8DHBEXAMPLE",
"arn": "arn:aws:iam::444455556666:role/admin-role",
"accountId": "444455556666",
"userName": "bob"
}
}
},
"eventTime": "2015-05-01T07:24:55Z",
"eventSource": "dynamodb.amazonaws.com",
"eventName": "CreateTable",
"awsRegion": "us-west-2",
"sourceIPAddress": "192.0.2.0",
"userAgent": "console.aws.amazon.com",
"requestParameters": {
"provisionedThroughput": {
"writeCapacityUnits": 10,
"readCapacityUnits": 10
},
"tableName": "Music",
"keySchema": [
{
"attributeName": "Artist",
"keyType": "HASH"
},
{
"attributeName": "SongTitle",
"keyType": "RANGE"
}
],
"attributeDefinitions": [
{
"attributeType": "S",
"attributeName": "Artist"
},
{
"attributeType": "S",
"attributeName": "SongTitle"
}
]
},
"responseElements": {"tableDescription": {
"tableName": "Music",
"attributeDefinitions": [
{
"attributeType": "S",
"attributeName": "Artist"
},
{
"attributeType": "S",
"attributeName": "SongTitle"
}
],
"itemCount": 0,
"provisionedThroughput": {
"writeCapacityUnits": 10,
"numberOfDecreasesToday": 0,
"readCapacityUnits": 10
},
"creationDateTime": "May 1, 2015 7:24:55 AM",
"keySchema": [
{
"attributeName": "Artist",
"keyType": "HASH"
},
{
"attributeName": "SongTitle",
"keyType": "RANGE"
}
],
"tableStatus": "CREATING",
"tableSizeBytes": 0
}},
"requestID": "KAVGJR1Q0I5VHF8FS8V809EV7FVV4KQNSO5AEMVJF66Q9ASUAAJG",
"eventID": "a8b5f864-480b-43bf-bc22-9b6d77910a29",
"eventType": "AwsApiCall",
"apiVersion": "2012-08-10",
"recipientAccountId": "111122223333"
},
{
"eventVersion": "1.03",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AKIAIOSFODNN7EXAMPLE:bob",
"arn": "arn:aws:sts::111122223333:assumed-role/users/bob",
"accountId": "444455556666",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2015-05-28T18:06:01Z"
},
"sessionIssuer": {
"type": "Role",
"principalId": "AKIAI44QH8DHBEXAMPLE",
"arn": "arn:aws:iam::444455556666:role/admin-role",
"accountId": "444455556666",
"userName": "bob"
}
}
},
"eventTime": "2015-05-04T02:43:11Z",
"eventSource": "dynamodb.amazonaws.com",
"eventName": "DescribeTable",
"awsRegion": "us-west-2",
"sourceIPAddress": "192.0.2.0",
"userAgent": "console.aws.amazon.com",
"requestParameters": {"tableName": "Music"},
"responseElements": null,
"requestID": "DISTSH6DQRLCC74L48Q51LRBHFVV4KQNSO5AEMVJF66Q9ASUAAJG",
"eventID": "c07befa7-f402-4770-8c1b-1911601ed2af",
"eventType": "AwsApiCall",
"apiVersion": "2012-08-10",
"recipientAccountId": "111122223333"
},
{
"eventVersion": "1.03",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AKIAIOSFODNN7EXAMPLE:bob",
"arn": "arn:aws:sts::111122223333:assumed-role/users/bob",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2015-05-28T18:06:01Z"
},
"sessionIssuer": {
"type": "Role",
"principalId": "AKIAI44QH8DHBEXAMPLE",
"arn": "arn:aws:iam::444455556666:role/admin-role",
"accountId": "444455556666",
"userName": "bob"
}
}
},
"eventTime": "2015-05-04T02:14:52Z",
"eventSource": "dynamodb.amazonaws.com",
"eventName": "UpdateTable",
"awsRegion": "us-west-2",
"sourceIPAddress": "192.0.2.0",
"userAgent": "console.aws.amazon.com",
"requestParameters": {"provisionedThroughput": {
"writeCapacityUnits": 25,
"readCapacityUnits": 25
}},
"responseElements": {"tableDescription": {
"tableName": "Music",
"attributeDefinitions": [
{
"attributeType": "S",
"attributeName": "Artist"
},
{
"attributeType": "S",
"attributeName": "SongTitle"
}
],
"itemCount": 0,
"provisionedThroughput": {
"writeCapacityUnits": 10,
"numberOfDecreasesToday": 0,
"readCapacityUnits": 10,
"lastIncreaseDateTime": "May 3, 2015 11:34:14 PM"
},
"creationDateTime": "May 3, 2015 11:34:14 PM",
"keySchema": [
{
"attributeName": "Artist",
"keyType": "HASH"
},
{
"attributeName": "SongTitle",
"keyType": "RANGE"
}
],
"tableStatus": "UPDATING",
"tableSizeBytes": 0
}},
"requestID": "AALNP0J2L244N5O15PKISJ1KUFVV4KQNSO5AEMVJF66Q9ASUAAJG",
"eventID": "eb834e01-f168-435f-92c0-c36278378b6e",
"eventType": "AwsApiCall",
"apiVersion": "2012-08-10",
"recipientAccountId": "111122223333"
},
{
"eventVersion": "1.03",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AKIAIOSFODNN7EXAMPLE:bob",
"arn": "arn:aws:sts::111122223333:assumed-role/users/bob",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2015-05-28T18:06:01Z"
},
"sessionIssuer": {
"type": "Role",
"principalId": "AKIAI44QH8DHBEXAMPLE",
"arn": "arn:aws:iam::444455556666:role/admin-role",
"accountId": "444455556666",
"userName": "bob"
}
}
},
"eventTime": "2015-05-04T02:42:20Z",
"eventSource": "dynamodb.amazonaws.com",
"eventName": "ListTables",
"awsRegion": "us-west-2",
"sourceIPAddress": "192.0.2.0",
"userAgent": "console.aws.amazon.com",
"requestParameters": null,
"responseElements": null,
"requestID": "3BGHST5OVHLMTPUMAUTA1RF4M3VV4KQNSO5AEMVJF66Q9ASUAAJG",
"eventID": "bd5bf4b0-b8a5-4bec-9edf-83605bd5e54e",
"eventType": "AwsApiCall",
"apiVersion": "2012-08-10",
"recipientAccountId": "111122223333"
},
{
"eventVersion": "1.03",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AKIAIOSFODNN7EXAMPLE:bob",
"arn": "arn:aws:sts::111122223333:assumed-role/users/bob",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2015-05-28T18:06:01Z"
},
"sessionIssuer": {
"type": "Role",
"principalId": "AKIAI44QH8DHBEXAMPLE",
"arn": "arn:aws:iam::444455556666:role/admin-role",
"accountId": "444455556666",
"userName": "bob"
}
}
},
"eventTime": "2015-05-04T13:38:20Z",
"eventSource": "dynamodb.amazonaws.com",
"eventName": "DeleteTable",
"awsRegion": "us-west-2",
"sourceIPAddress": "192.0.2.0",
"userAgent": "console.aws.amazon.com",
"requestParameters": {"tableName": "Music"},
"responseElements": {"tableDescription": {
"tableName": "Music",
"itemCount": 0,
"provisionedThroughput": {
"writeCapacityUnits": 25,
"numberOfDecreasesToday": 0,
"readCapacityUnits": 25
},
"tableStatus": "DELETING",
"tableSizeBytes": 0
}},
"requestID": "4KBNVRGD25RG1KEO9UT4V3FQDJVV4KQNSO5AEMVJF66Q9ASUAAJG",
"eventID": "a954451c-c2fc-4561-8aea-7a30ba1fdf52",
"eventType": "AwsApiCall",
"apiVersion": "2012-08-10",
"recipientAccountId": "111122223333"
}
]}
Utilice esta seccin para encontrar con rapidez recomendaciones que le permitan maximizar el desempeo
y minimizar sus costos.
Diseo para distribuir de forma uniforme el acceso a los datos entre los elementos de las
tablas (p. 697)
Comprensin del comportamiento de las particiones (p. 699)
Utilice la capacidad de rfaga con moderacin (p. 703)
Distribuya la actividad de escritura al cargar los datos (p. 703)
Comprensin de los patrones de acceso en los datos de serie temporal (p. 704)
Almacene en la cach los elementos populares (p. 705)
Tenga en cuenta la uniformidad de las cargas de trabajo al ajustar el desempeo provisionado (p. 705)
Pruebe la aplicacin a gran escala (p. 706)
grandes valores de atributos de datos en un elemento, puede ser ms interesante utilizar una de estas
alternativas de diseo de aplicaciones.
Use tablas de uno a varios en lugar de atributos de tipo Set de gran tamao (p. 707)
Comprima los valores de atributos grandes (p. 708)
Almacene los valores de atributos grandes en Amazon S3 (p. 708)
Divida los atributos grandes entre varios elementos (p. 709)
Elija una clave que proporcione cargas de trabajo uniformes (p. 715)
Saque partido de los ndices dispersos (p. 716)
Utilice un ndice secundario global para realizar bsquedas rpidas (p. 716)
La clave principal identifica de manera exclusiva cada elemento de una tabla. La clave principal puede ser
simple (clave de particin) o compuesta (clave de particin y clave de ordenacin).
Al almacenar los datos, DynamoDB divide los elementos de una tabla en varias particiones y distribuye
los datos basndose sobre todo en el valor de la clave de particin. Por lo tanto, para lograr el mximo
desempeo de solicitudes que se ha provisionado para una tabla, es preciso distribuir la carga de trabajo
de manera uniforme entre los valores de clave de particin. Al hacerlo, las solicitudes se distribuyen entre
las particiones.
Por ejemplo, si una tabla cuenta con un nmero muy reducido de valores de clave de particin a los que
se obtiene acceso intensamente o, posiblemente, incluso un solo valor de clave de particin que se utiliza
de manera intensa, el trfico de solicitudes se concentra en una cantidad pequea de particiones o incluso
en una sola. Si la carga de trabajo es muy desigual, es decir, se centra de forma desproporcionada en
una o algunas particiones, las solicitudes no conseguirn alcanzar el nivel de desempeo provisionado
general. Para sacar el mximo partido del desempeo de DynamoDB, debe crear tablas cuya clave de
particin tenga gran cantidad de valores diferentes y asegurarse de que estos valores se soliciten de un
modo bastante uniforme y lo ms aleatorio posible.
Esto no significa que haya que obtener acceso a todos los valores de clave de particin para lograr el nivel
de desempeo; ni tampoco que el porcentaje de valores de clave de particin a los que se obtiene acceso
tenga que ser elevado. Sin embargo, s es preciso tener en cuenta que, cuando la carga de trabajo obtiene
acceso a ms valores de clave de particin diferentes, las correspondientes solicitudes se repartirn por
el espacio particionado de tal forma que se utilizar mejor el nivel de desempeo asignado. En general, el
desempeo se utiliza con ms eficiencia cuanto mayor sea la proporcin de valores de clave de particin a
los que se obtiene acceso en comparacin con el nmero total de valores de clave de particin de la tabla.
Si una sola tabla contiene tan solo un nmero muy reducido de valores de clave de particin, puede ser
conveniente distribuir las operaciones de escritura entre ms valores de clave de particin distintos. En
otras palabras, conviene estructurar los elementos de clave principal de tal forma que se evite un valor de
clave de particin "caliente" (muy solicitado) que ralentice el desempeo general.
Por ejemplo, tomemos una tabla con una clave principal compuesta. La clave de particin representa
la fecha de creacin del elemento, redondeada al da ms prximo. La clave de ordenacin es un
identificador de elemento. Un da determinado, por ejemplo el 2014-07-09, todos los elementos nuevos
se van a escribir en ese mismo valor de clave de particin.
Si la tabla completa cabe en una sola particin (teniendo en cuenta el crecimiento de los datos con
el paso del tiempo) y los requisitos de desempeo lectura y escritura de la aplicacin no rebasan las
capacidades de lectura y escritura de una sola particin, no debera aplicarse inesperadamente una
limitacin controlada que afectase a la aplicacin como consecuencia de las particiones.
Sin embargo, si prev escalar la tabla ms all de una nica particin, entonces debe disear la aplicacin
de tal forma que pueda utilizar una cantidad mayor del desempeo provisionado total de la tabla.
Para leer todos los elementos de un determinado da, tendra que obtener todos los elementos de cada
sufijo. Por ejemplo, primero se emitira una solicitud Query para obtener el valor de clave de particin
2014-07-09.1, a continuacin otra solicitud Query para obtener 2014-07-09.2 y as sucesivamente
hasta el valor 2014-07-09.200. Por ltimo, la aplicacin tendra que fusionar los resultados de todas las
solicitudes Query.
Siguiendo con nuestro ejemplo, supongamos que cada elemento tiene un identificador de pedido,
OrderId. Antes de que la aplicacin escriba el elemento en la tabla, puede calcular un sufijo de clave
de particin basndose en el identificador de pedido. El clculo debera dar como resultado un nmero
comprendido entre 1 y 200, lo que permite realizar una distribucin bastante uniforme para cualquier
conjunto de nombres (o identificadores de usuario).
Bastara con realizar un sencillo clculo, como el producto de los valores de punto de cdigo UTF-8 de
los caracteres del identificador del pedido, mdulo 200+1. El valor de clave de particin sera la fecha
concatenada con el resultado del clculo como sufijo. Con esta estrategia, las escrituras se distribuyen
de manera uniforme entre los valores de clave de particin y, por lo tanto, entre las particiones. Es fcil
realizar una operacin GetItem de un determinado elemento, ya que se puede calcular el valor de clave
de particin que se requiere para poder recuperar un valor de OrderId concreto.
Para leer todos los elementos de un da determinado, tambin en este caso habra que utilizar una solicitud
Query para cada una de las claves 2014-07-09.N (donde N es un valor comprendido entre 1 y 200) y
la aplicacin tendra que fusionar todos los resultados. Sin embargo, se evitara la existencia de un nico
valor de clave de particin "caliente" que acaparase toda la carga de trabajo.
Puede calcular el nmero de particiones que DynamoDB asignar inicialmente a la tabla y comparar este
clculo con los patrones de escala y acceso. Tambin puede calcular el nmero de particiones adicionales
que DynamoDB asignar en respuesta al aumento de los requisitos de almacenamiento o desempeo
provisionado. Estos clculos pueden ayudarle a determinar el mejor diseo de tabla para las necesidades
de la aplicacin.
Note
Los siguientes datos sobre tamaos de particiones y desempeo estn sujetas a cambios.
Una nica particin admite un mximo de 3000unidades de capacidad de lectura o 1000 unidades de
capacidad de escritura. Al crear una nueva tabla, el nmero inicial de particiones se expresa de la siguiente
manera:
Por ejemplo, supongamos que ha creado una tabla con 1000unidades de capacidad de lectura y
500unidades de capacidad de escritura. En este caso, el nmero inicial de particiones ser de:
Por lo tanto, una nica particin podra satisfacer todos los requisitos de desempeo provisionado de la
tabla.
Sin embargo, si hubiese creado la tabla con 1000unidades de capacidad de lectura y 1000unidades de
capacidad de escritura, entonces una nica particin no sera suficiente para la capacidad de desempeo
especificada:
En este caso, la tabla requerira dos particiones, cada una con 500unidades de capacidad de lectura y
500unidades de capacidad de escritura.
Si es necesario, DynamoDB puede asignar particiones adicionales a la tabla mediante una divisin de
una particin existente. Supongamos que una de las particiones de una tabla (P) supera su lmite de
almacenamiento (10 GB). En este caso, DynamoDB dividira la particin de la siguiente manera:
En el siguiente diagrama se muestra cmo DynamoDB lleva a cabo una divisin de particin. Los
cuadrados grandes representan las particiones y los pequeos, los elementos de datos de la tabla.
Durante una divisin de particin, DynamoDB distribuye de manera uniforme los datos de la particin
anterior entre las dos particiones nuevas (los datos de las dems particiones no se ven afectados). La
capacidad de desempeo provisionada de la particin anterior se distribuye uniformemente entre las dos
particiones nuevas (consulte Capacidad de desempeo por particin (p. 702)).
Tenga en cuenta DynamoDB lleva a cabo las divisiones de particin automticamente y en segundo plano.
La tabla permanece totalmente disponible para las actividades de lectura y escritura con los niveles de
desempeo especificados.
Por ejemplo, supongamos que ha creado una tabla nueva con 5000unidades de capacidad de
lectura y 2000unidades de capacidad de escritura. Con la informacin de Asignacin inicial de
particiones (p. 699), puede determinar que esta nueva tabla requerir cuatro particiones:
Cada una de las cuatro particiones puede dar cabida a 1250lecturas por segundo (5000unidades
de capacidad de lectura/4particiones) y 500escrituras por segundo (2000unidades de capacidad de
escritura/4particiones).
Ahora, supongamos que ha aumentado las unidades de capacidad de lectura de la tabla de 5000 a 8000.
Las cuatro particiones existentes no podran satisfacer este requisito. En respuesta (consulte Asignacin
posterior de particiones (p. 700)), DynamoDB duplicara el nmero de particiones a ocho (4 * 2 = 8).
Cada una de las particiones resultantes tendra cabida para 1000lecturas por segundo (8000unidades
de capacidad de lectura/8particiones) y 250escrituras por segundo (2000unidades de capacidad de
escritura/8particiones).
La tabla descrita en Un aumento de los ajustes de desempeo provisionado (p. 701) cuenta con ocho
particiones, de modo que su capacidad mxima sera de aproximadamente 80GB, tal y como se muestra a
continuacin:
8 partitions * 10 GB = 80 GB
9 partitions * 10 GB = 90 GB
En el diagrama siguiente se muestra una de las particiones originales llena hasta el lmite de su capacidad
y el esquema de particiones resultante despus de que DynamoDB la haya dividido. Los cuadrados
grandes representan las particiones y los pequeos, los elementos de datos de la tabla.
Podramos determinar la cantidad de capacidad de lectura y escritura por particin de la siguiente manera:
5,000 read capacity units / 4 partitions = 1,250 read capacity units per partition
2,000 write capacity units / 4 partitions = 500 write capacity units per partition
Ahora, supongamos que una de estas cuatro particiones se llena hasta el lmite de su capacidad.
DynamoDB la dividira, lo que dara lugar a cinco particiones asignadas a la tabla. La capacidad de lectura
y escritura por particin se distribuira de la siguiente manera:
1,250 read capacity units / 2 partitions = 625 read capacity units per child partition
500 write capacity units / 2 partitions = 250 write capacity units per child partition
Como resultado:
Tenga en cuenta que, a medida que el nmero de particiones de una tabla aumenta, cada particin tiene
menos unidades de capacidad de lectura y escritura disponibles. Sin embargo, el desempeo provisionado
total de la tabla sigue siendo el mismo.
UserID MessageID
U1 1
U1 2
U1 ...
UserID MessageID
U2 1
U2 2
U2 ...
El problema en este caso es que las solicitudes de escritura a DynamoDB no se distribuyen entre los
valores de clave de particin. Se toma un valor de clave de particin a la vez y se cargan todos sus
elementos, antes de pasar al siguiente valor de clave de particin y hacer lo mismo. En segundo plano,
DynamoDB particiona los datos de las tablas entre varios servidores. Para utilizar toda la capacidad de
desempeo que se ha provisionado para las tablas, es preciso distribuir la carga de trabajo entre los
valores de clave de particin. En este caso, al dirigir una cantidad desigual de carga a elementos que
tienen el mismo valor de clave de particin, es posible que no pueda utilizar plenamente los recursos
que DynamoDB ha provisionado para la tabla. Puede distribuir la carga de trabajo cargando primero un
elemento de cada valor de clave de particin. A continuacin, se repite el patrn para el siguiente conjunto
de valores de clave de ordenacin de todos los elementos, hasta que se han cargado todos los datos,
como se muestra en el ejemplo de secuencia de carga en la siguiente tabla:
UserID MessageID
U1 1
U2 1
U3 1
... ...
U1 2
U2 2
U3 2
... ...
Cada carga que se lleva a cabo en esta secuencia se utiliza un valor de clave de particin distinto, con lo
que se mantienen ocupados ms servidores de DynamoDB simultneamente y se mejora el desempeo.
Supongamos que disea una tabla para realizar el seguimiento del comportamiento de los clientes en
un sitio web; por ejemplo, saber en qu URL hacen clic. Puede disear la tabla con una clave principal
compuesta cuya clave de particin sea el identificador de cliente y cuya clave de ordenacin sea la fecha
y hora. En esta aplicacin, los datos de los clientes crecen de forma indefinida a lo largo del tiempo; sin
embargo, las aplicaciones pueden presentar patrones de acceso desiguales entre los elementos de la
tabla. Por ejemplo, puede que los datos de clientes ms recientes sean ms pertinentes, en cuyo caso la
aplicacin obtendr acceso a los ltimos elementos con ms frecuencia y, a medida que pase el tiempo,
cada vez los usar menos hasta que apenas se consulten. Si ya sabe que este patrn de acceso ser
el habitual, puede tenerlo en cuenta al disear el esquema de la tabla. En lugar de almacenar todos
los elementos en una nica tabla, podra utilizar varias de ellas para almacenar estos elementos. Por
ejemplo, podra crear tablas para almacenar los datos semanales o mensuales. Para la tabla en la que se
almacenan los datos del ltimo mes o la ltima semana, cuya tasa de acceso a los datos es alta, podra
solicitar ms desempeo; en cambio, para las tablas en las que se almacenan los datos ms antiguos,
podra reducir el desempeo y ahorrar recursos.
Puede ahorrar recursos almacenando los elementos "calientes" en una tabla con ajustes de desempeo
ms elevados y los elementos "fros" en otra tabla con ajustes de desempeo ms bajos. Para eliminar
los elementos antiguos, basta con eliminar las tablas. Si lo desea, puede realizar backups de estas tablas
en otras opciones de almacenamiento, como Amazon Simple Storage Service (Amazon S3). Eliminar una
tabla completa ofrece una eficiencia muy superior a eliminar los elementos de uno en uno; en este ltimo
caso, bsicamente se duplica el desempeo de escritura porque se llevan a cabo tantas operaciones de
eliminacin como de colocacin.
Continuamos con el ejemplo de ProductCatalog: cuando un cliente solicita un elemento de esta tabla, la
aplicacin consultara primero la cach para ver si contiene una copia del elemento. En caso afirmativo,
es un acierto de cach; de lo contrario, es un error de cach. Si se trata de un error de cach, la aplicacin
tendra que leer el elemento en DynamoDB y almacenar una copia de l en la cach. Con el paso
del tiempo, los errores de cach iran en disminucin a medida que la cach se llenase de elementos
ms populares; las aplicaciones no tendran que obtener acceso a DynamoDB en absoluto para estos
elementos.
Una solucin de almacenamiento en cach puede mitigar la actividad de lectura sesgada de elementos
populares. Adems, puesto que reduce la cantidad de actividad de lectura de la tabla, el almacenamiento
en cach puede ayudar a reducir los costos generales de uso de DynamoDB.
Para las aplicaciones que se han diseado para su uso con cargas de trabajo uniformes, la actividad de
asignacin de particiones de DynamoDB es imperceptible. En general, la capacidad de rfaga puede
absorber las desigualdades temporales en las cargas de trabajo, tal y como se describe en Utilice la
capacidad de rfaga con moderacin (p. 703). Sin embargo, si la aplicacin tiene que dar cabida
habitualmente a cargas de trabajo desiguales, debe disear la tabla teniendo en cuenta el comportamiento
de administracin de particiones de DynamoDB (consulte Comprensin del comportamiento de las
particiones (p. 699)) y tenerlo en cuenta cuando aumente o reduzca el desempeo provisionado de esa
tabla.
Por ejemplo, tomemos una situacin en la que tiene que cargar masivamente 20millones de elementos
en una tabla de DynamoDB. Supongamos que cada elemento tiene un tamao de 1KB, lo que supone
20GB de datos. Esta tarea de carga masiva requerir un total de 20millones de unidades de capacidad
de escritura. Para realizar esta carga de datos en 30minutos, sera preciso establecer el desempeo de
escritura provisionado de la tabla en 11000unidades de capacidad de escritura.
Despus de la carga de datos masivos, los requisitos de desempeo de escritura habituales podran
ser muy inferiores; por ejemplo, supongamos que las aplicaciones solo requieren 200escrituras por
segundo. Si reduce el desempeo provisionado de la tabla a este nivel, cada una de las 11particiones
tendr provisionadas unas 20unidades de capacidad de escritura por segundo. Este nivel de desempeo
provisionado por particin, combinado con el comportamiento de rfaga de DynamoDB, podra ser
suficiente para la aplicacin.
Sin embargo, si una aplicacin va a requerir un desempeo de escritura sostenido superior a las
20escrituras por segundo por particin, deber: (a) disear un esquema que requiera menos escrituras por
segundo por valor de clave de particin; o bien (b) disear la carga de datos masivos de tal forma que se
ejecute a un ritmo ms lento y as reducir el requisito de desempeo inicial. Por ejemplo, supongamos que
fuese aceptable ejecutar la importacin masiva en ms de 3horas, en lugar de en tan solo 30minutos. En
este caso, solo sera preciso provisionar 1900unidades de capacidad de escritura por segundo, en lugar
de 11000. En consecuencia, DynamoDB creara solo dos particiones para la tabla.
Supongamos que la aplicacin obtiene acceso a los datos de la tabla en todos los valores de clave de
particin, pero de manera desigual (porque obtiene acceso a nmero reducido de valores de clave de
particin con ms frecuencia que a otros). El desempeo de la aplicacin podra ser aceptable mientras
no hubiese gran cantidad de datos de la tabla. Sin embargo, a medida que la tabla se hace mayor, habr
ms particiones y menos desempeo por particin. Podra ocurrir que la aplicacin sufriese la limitacin
controlada cuando intentase usar el mismo patrn de uso desigual que antes funcionaba correctamente.
Para evitar problemas con claves "calientes" cuando la tabla crezca, asegrese de probar el diseo de
la aplicacin a gran escala. Estudie la proporcin entre almacenamiento y desempeo cuando la ejecuta
a gran escala y cmo asignar DynamoDB las particiones a la tabla. (Para obtener ms informacin,
consulte Comprensin del comportamiento de las particiones (p. 699).)
Si no le es posible generar gran cantidad de datos de prueba, puede crear una tabla con ajustes de
desempeo provisionado muy altos. Con ello se crear una tabla con muchas particiones. A continuacin,
puede usar UpdateTable para reducir los ajustes manteniendo la misma proporcin de almacenamiento y
desempeo que determin para ejecutar la aplicacin a gran escala. Ahora, la tabla presenta la proporcin
de desempeo por particin prevista para cuando la escala aumente. Pruebe la aplicacin con esta tabla
usando cargas de trabajo realistas.
Las tablas que almacenan datos de serie temporal pueden aumentar de forma ilimitada y provocar un
ralentizamiento del desempeo de las aplicaciones con el tiempo. Con los datos de serie temporal, las
aplicaciones suelen leer y escribir los elementos ms recientes en la tabla con mayor frecuencia que los
elementos ms antiguos. Si puede eliminar los datos de serie temporal antiguos de la tabla en tiempo real,
y archivarlos en otro lugar, mantendr una proporcin alta de desempeo por particin.
Para obtener las prcticas recomendadas para datos de serie temporal, Comprensin de los patrones de
acceso en los datos de serie temporal (p. 704).
Cuando utilice elementos en DynamoDB, es importante analizar cmo obtener el mejor desempeo,
reducir los costos de desempeo provisionado y evitar que se aplique la limitacin controlada
circunscribindose a las unidades de capacidad de lectura y escritura establecidas. Si los elementos
que se utilizan superan el tamao mximo por elemento, tal y como se describe en Lmites en
DynamoDB (p. 765), tendr que estudiar la manera de abordar esta situacin. En esta seccin se
proponen prcticas recomendadas para abordar estas cuestiones.
Las tablas Forum, Thread y Reply de la seccin Creacin de tablas y carga de ejemplos de datos (p. 291)
son buenos ejemplos de estas relaciones de uno a varios. Por ejemplo, la tabla Thread contiene un
elemento para cada conversacin del foro y en la tabla Reply se almacenan una o varias respuestas para
cada conversacin.
En lugar de almacenar las respuestas como elementos de una tabla independiente, podra almacenar las
conversaciones y las respuestas en la misma tabla. Para cada conversacin, podra almacenar todas las
respuestas en un atributo de tipo String Set; sin embargo, conservar los datos de las conversaciones y las
respuestas en tablas separadas aporta varios beneficios:
Si almacena las respuestas como elementos de una tabla, puede almacenar cualquier cantidad de
respuestas, porque una tabla de DynamoDB puede almacenar cualquier nmero de elementos.
Si almacena las respuestas como un valor de atributo en la tabla Thread, tendra que ajustarse al
tamao de elemento mximo, lo cual limitara el nmero de respuestas que se pueden almacenar.
(Consulte Lmites en DynamoDB (p. 765))
Al recuperar un elemento de la tabla Thread, se paga menos por el desempeo provisionado, porque
solo se recuperan los datos de la conversacin y no todas las respuestas de esa conversacin.
Las consultas permiten recuperar solo un subconjunto de elementos de una tabla. Si almacena las
respuestas en una tabla independiente, Reply, puede consultarla para recuperar solo un subconjunto de
respuestas; por ejemplo, las comprendidas en un intervalo de tiempo determinado.
Si almacena las respuestas como un valor de atributo de tipo Set, siempre tendr que recuperar todas
las respuestas, lo que consumira ms desempeo provisionado por datos que, posiblemente, no
necesite.
Cuando se agrega una nueva respuesta a una conversacin, se agrega un solo elemento a la tabla
Reply, de modo que se incurre en el costo de desempeo provisionado de ese elemento Reply
exclusivamente. Si las respuestas se almacenan en la tabla Thread, se incurre en el costo total de
escribir el elemento Thread completo, incluidas todas las respuestas, cada vez que se agrega una
respuesta de un usuario a una conversacin.
Por ejemplo, en la tabla Reply de la seccin Creacin de tablas y carga de ejemplos de datos (p. 291) se
almacenan los mensajes que escriben los usuarios del foro. Estas respuestas de los usuarios pueden ser
cadenas de texto muy largas, lo que las convierte en excelentes candidatos para la compresin.
Para obtener cdigo de muestra que ilustra cmo comprimir los mensajes largos en DynamoDB, consulte:
Ejemplo: Control de atributos de tipo Binary mediante el API de documentos de AWS SDK for
Java (p. 399)
Ejemplo: Control de atributos de tipo Binary mediante el API de bajo nivel del AWS SDK
para .NET (p. 422)
Por ejemplo, tomemos la tabla ProductCatalog de la seccin Creacin de tablas y carga de ejemplos de
datos (p. 291). En los elementos de la tabla ProductCatalog se almacena informacin sobre el precio del
elemento, su descripcin, los autores (en el caso de los libros) y las dimensiones (en el caso de otros
productos). Si desea almacenar una imagen de cada producto, estas imgenes podran ser grandes. Es
posible que sea ms prctico almacenar esas imgenes en Amazon S3, en lugar de en DynamoDB.
Dado que DynamoDB no admite transacciones cruzadas entre Amazon S3 y DynamoDB, la aplicacin
tendr que controlar los errores y ocuparse de limpiar los objetos hurfanos de Amazon S3.
Amazon S3 limita la longitud de los identificadores de objetos. Por consiguiente, es preciso organizar los
datos de tal forma que sean compatibles con esta y otras restricciones de Amazon S3. Para obtener ms
informacin, consulte la Gua para desarrolladores de Amazon Simple Storage Service.
Tomemos, por ejemplo, las tablas Forum, Thread y Reply descritas en la seccin Creacin de tablas y
carga de ejemplos de datos (p. 291). Los elementos de la tabla Reply contienen mensajes del foro que
han escrito los usuarios de este ltimo. Debido al lmite de tamao de elemento de 400 KB que aplica
DynamoDB, la longitud de cada respuesta tambin est limitada. Para las respuestas largas, en lugar de
almacenar un elemento en la tabla Reply, divida el mensaje de respuesta en porciones y, a continuacin,
escriba cada porcin en su propio elemento independiente de una nueva tabla ReplyChunks que tenga
una clave principal simple (clave de particin).
La clave principal de cada porcin sera una concatenacin de la clave principal del elemento de respuesta
"principal", un nmero de versin y un nmero de secuencia. El nmero de secuencia determina el orden
de las porciones. El nmero de versin garantiza que, si una respuesta larga se actualiza ms adelante,
la actualizacin se lleve a cabo de manera granular. Las porciones creadas antes de la actualizacin
tampoco se mezclarn con las que se han creado despus de esta.
Adems, es preciso actualizar el elemento de respuesta "principal" con el nmero de porciones, de forma
que cuando necesite recuperar todas las que componen una respuesta, sepa cuntas debe buscar.
Por ejemplo, a continuacin se muestra cmo podran aparecer estos elementos en las tablas Reply y
ReplyChunks:
Reply
"DynamoDB#Thread1"
"2012-03-15T20:42:54.023Z"
3 1
"DynamoDB#Thread2"
"2012-03-21T20:41:23.192Z"
"mensaje breve"
ReplyChunks
Id Message
"DynamoDB#Thread1#2012-03-15T20:42:54.023Z#1#1"
"primera parte del texto de mensaje largo..."
"DynamoDB#Thread1#2012-03-15T20:42:54.023Z#1#3"
"...tercera parte del texto de mensaje largo"
"DynamoDB#Thread1#2012-03-15T20:42:54.023Z#1#2"
"...segunda parte del texto de mensaje largo..."
Dado que DynamoDB no admite las transacciones cruzadas entre elementos, la aplicacin tendr que
controlar las situaciones de error al escribir varios elementos y las incoherencias entre elementos al leer
varios de ellos.
Si la aplicacin recupera gran cantidad de datos a la vez, puede generar cargas de trabajo no
uniformes, lo que podra provocar que se aplique inesperadamente la limitacin controlada. Esto sucede
especialmente cuando se recuperan elementos que comparten un valor de clave de particin.
Porcionar los elementos de datos grandes evita este problema mediante el uso de una tabla aparte con
una clave principal simple (clave de particin) de tal forma que cada porcin se reparta entre toda la tabla.
Otra solucin viable, aunque menos ptima, sera almacenar cada porcin en una tabla con una clave
compuesta cuya clave principal fuese la clave principal del elemento "principal". Con esta opcin de
diseo, una aplicacin que recuperase todas las porciones del mismo elemento "principal" generara una
carga de trabajo no uniforme, con una distribucin desigual de las E/S entre las particiones.
Una operacin Scan siempre examina la tabla o ndice secundario en su totalidad y, despus, filtra
los valores para obtener el resultado deseado, para lo cual se agrega el paso adicional de eliminar los
datos del conjunto de resultados. Si es posible, evite usar la operacin Scan en una tabla o un ndice
de gran tamao con un filtro que elimine muchos resultados. Adems, a medida que la tabla o el ndice
aumentan de tamao, la operacin Scan resulta ms lenta. La operacin Scan examina cada elemento
para comprobar si presenta los valores solicitados y permite utilizar el desempeo provisionado para una
tabla o un ndice grandes en una sola operacin. Para lograr tiempos de respuesta ms breves, disee
las tablas o los ndices de tal forma que las aplicaciones puedan utilizar Query en lugar de Scan. Para las
tablas, puede estudiar tambin la posibilidad de usar los API GetItem y BatchGetItem.
De forma alternativa, disee la aplicacin para usar operaciones Scan de tal forma que minimicen el
impacto en la tasa de solicitudes.
Esto representa un pico repentino de uso en comparacin con la capacidad de lectura configurada para
la tabla. Este uso de unidades de capacidad en un examen impide que otras solicitudes ms importantes
para la misma tabla utilicen las unidades de capacidad disponibles. En consecuencia, es probable que
obtenga una excepcin ProvisionedThroughputExceeded para esas solicitudes.
En el siguiente diagrama se ilustra el impacto de un pico repentino del uso de unidades de capacidad que
provocan las operaciones Query y Scan, as como su impacto en las dems solicitudes para la misma
tabla.
En lugar de utilizar una gran operacin Scan, puede utilizar las tcnicas siguientes para minimizar el
impacto de un examen en el desempeo provisionado de una tabla.
Dado que una operacin de examen lee una pgina completa (de forma predeterminada, 1 MB), puede
reducir el impacto de la operacin de examen estableciendo un tamao de pgina menor. La operacin
Scan proporciona el parmetro Limit que se puede utilizar para establecer el tamao de pgina de la
solicitud. Cada solicitud Query o Scan que tiene un tamao de pgina menor utiliza menos operaciones
de lectura y crea una "pausa" entre ellas. Por ejemplo, si cada elemento tiene 4 KB y el tamao de
pgina se establece en 40elementos, entonces una solicitud Query consumira solo 40operaciones
de lectura de consistencia alta o 20operaciones de lectura consistente final. Un mayor nmero de
operaciones Query o Scan permitira que las dems solicitudes esenciales se realizasen correctamente
sin que se aplicara la limitacin controlada.
Aislar las operaciones de examen
DynamoDB se ha diseado para facilitar la escalabilidad. En consecuencia, una aplicacin puede crear
tablas para fines distintos e, incluso, duplicar contenido entre varias de ellas. Si desea realizar exmenes
en una tabla que no recibe trfico "esencial". Algunas aplicaciones controlan esta carga rotando el trfico
cada hora entre dos tablas; una para el trfico esencial y otra para por hora girando el trfico entre dos
tablas: una para el trfico de vital importancia y otra de registro. Las dems aplicaciones pueden efectuar
este control realizando cada escritura en dos tablas: una tabla "esencial" y otra tabla "duplicada".
Es importante configurar la aplicacin de modo que repita las solicitudes que reciban un cdigo de
respuesta que indique que se ha superado el desempeo provisionado, o bien que aumente el desempeo
provisionado de la tabla mediante la operacin UpdateTable. Si la carga de trabajo presenta picos
temporales que pueden provocar que el desempeo supere ocasionalmente el nivel provisionado, repita
la solicitud con retardo exponencial. Para obtener ms informacin sobre cmo implementar el retardo
exponencial, consulte Reintentos de error y retardo exponencial (p. 200).
Aunque los exmenes en paralelo pueden ser beneficiosos, pueden suponer una demanda excesiva del
desempeo provisionado. Con los exmenes en paralelo, la aplicacin tendr varios procesos de trabajo
ejecutando operaciones Scan simultneamente, lo que puede consumir enseguida toda la capacidad de
lectura provisionada de la tabla. En ese caso, las dems aplicaciones que necesiten obtener acceso a la
tabla podran sufrir una limitacin controlada que se lo impida.
Un examen en paralelo puede ser la eleccin adecuada si se cumplen las siguientes condiciones:
Eleccin de TotalSegments
La configuracin ms idnea de TotalSegments depende de los datos concretos, de los ajustes
de desempeo provisionado de la tabla y de los requisitos de desempeo. Es probable que deba
experimentar para lograr los resultados deseados. Recomendamos comenzar por una proporcin sencilla;
por ejemplo, un segmento por cada 2GB de datos. Por ejemplo, en el caso de una tabla de 30GB, podra
establecer TotalSegments en 15 (30GB/2GB). En este caso, la aplicacin utilizara 15procesos de
trabajo, cada uno de los cuales examinara un segmento diferente.
Tambin puede elegir un valor de TotalSegments que se base en los recursos del cliente. Puede
establecer TotalSegments en cualquier nmero comprendido entre 1 y 1000000. DynamoDB permitir
examinar esa cantidad de segmentos. Si, por ejemplo, el cliente limita el nmero de subprocesos que se
pueden ejecutar de forma simultnea, puede aumentar gradualmente el valor de TotalSegments hasta
obtener el mejor desempeo de Scan con la aplicacin.
Tendr que monitorizar los exmenes en paralelo para optimizar la utilizacin del desempeo
provisionado, adems de asegurarse de que no privar de recursos a las dems aplicaciones. Aumente el
valor de TotalSegments si no se consume todo el desempeo provisionado, pero las solicitudes Scan
siguen siendo objeto de una limitacin controlada. Reduzca el valor de TotalSegments si las solicitudes
Scan consumen ms desempeo provisionado del que desea utilizar.
En esta seccin se explican algunas prcticas recomendadas relativas a los ndices secundarios locales.
Evite indexar las tablas que experimentan una intensa actividad de escritura, como las utilizadas en
aplicaciones de captura de datos. El costo de las operaciones de E/S precisas para mantener los ndices
puede ser elevado. Si tiene que indexar los datos de una tabla de este tipo, es preferible copiarlos en otra
tabla con los ndices necesarios y consultarlos en ella.
Si prev que en una tabla la actividad de escritura sea muy superior a la de lectura:
Puede ser conveniente proyectar menos atributos, para minimizar el tamao de los elementos que
se escriben en el ndice. No obstante, si estos elementos tienen un tamao inferior al de una unidad
de capacidad de escritura (1 KB), entonces no se lograr ningn ahorro en trminos de unidades de
capacidad de escritura. Por ejemplo, si el tamao de una entrada de ndice es de tan solo 200bytes,
DynamoDB la redondear a 1 KB. Es decir, siempre y cuando los elementos del ndice son pequeos,
puede proyectar ms atributos sin costo adicional.
Si sabe que algunos atributos de la tabla no se utilizarn casi nunca en las consultas, no hay ningn
motivo para proyectarlos. Si posteriormente actualiza un atributo que no est en el ndice, no incurrir
en el costo adicional de actualizar el ndice. Los atributos no proyectados se pueden recuperar en una
consulta, aunque esto supone un mayor costo de desempeo provisionado.
Especifique ALL solo si desea que las consultas devuelvan el elemento de la tabla completo, pero desea
ordenar la tabla por una clave de ordenacin distinta. Indexar todos los atributos eliminar la necesidad
de recuperaciones de tabla, si bien en la mayora de los casos duplicar los costos de almacenamiento y
actividad de escritura.
Si determinadas consultas solo se emiten de forma ocasional y no considera que sea necesario proyectar
todos los atributos solicitados, tenga en cuenta que estas consultas "ocasionales" a menudo se convierten
en consultas "esenciales". Al final, podra lamentar no haber proyectado los atributos en cuestin.
Los ndices dispersos pueden resultar beneficiosos para las consultas de atributos que no aparecen en la
mayora de los elementos de la tabla. Por ejemplo, supongamos que tenemos una tabla CustomerOrders
en la que estn almacenados todos los pedidos. Los atributos de clave de la tabla seran los siguientes:
Si nicamente desea realizar el seguimiento de los pedidos que estn abiertos, puede tener un atributo
denominado IsOpen. Si est a la espera de recibir un pedido, la aplicacin puede definir IsOpen
escribiendo una "X" (o cualquier otro valor) para ese elemento en la tabla. Cuando llegue el pedido, la
aplicacin puede eliminar el atributo IsOpen para indicar que el pedido se ha recibido.
Para realizar un seguimiento de los pedidos abiertos, puede crear un ndice para CustomerId (clave de
particin) e IsOpen (clave de ordenacin). Solo los pedidos de la tabla para los que IsOpen est definido
aparecern en el ndice. De este modo, la aplicacin podr consultar el ndice para encontrar de forma
rpida y eficiente los pedidos que siguen abiertos. Si tena miles de pedidos, por ejemplo, pero solo
algunos de ellos estn abiertos, la aplicacin puede consultar el ndice y devolver el valor de OrderId de
cada pedido abierto. La aplicacin realizar una cantidad significativamente menor de lecturas de las que
se necesitaran para examinar la tabla CustomerOrders completa.
En lugar de escribir un valor arbitrario en el atributo IsOpen, puede usar un atributo diferente que d lugar
a un orden til en el ndice. Para ello, puede crear el atributo OrderOpenDate, establecerlo en la fecha
de creacin del pedido (y, en cualquier caso, eliminar el atributo cuando el pedido se haya recibido) y,
adems, crear el ndice OpenOrders con el esquema CustomerId (clave de particin) y OrderOpenDate
(clave de ordenacin). De este modo, al consultar el ndice, los elementos se devolvern con un orden ms
til.
Cada vez que se agrega o actualiza un elemento de una tabla, DynamoDB actualiza todos los ndices
secundarios locales afectados. Si los atributos indexados se han definido en la tabla, los ndices
aumentarn con la tabla.
Al crear un ndice, es preciso plantearse cuntos datos se van a escribir en l y cuntos de estos datos
tendrn el mismo valor de clave de particin. Si prev que la suma de elementos de la tabla y del ndice
correspondientes a un valor de clave de particin determinado superen los 10 GB, debe estudiar si es
posible evitar crear el ndice.
Si no puede evitar crear el ndice, entonces tendr que prever el lmite de tamao de la coleccin de
elementos y adoptar medidas antes de superarlo. Para obtener estrategias sobre cmo mantenerse
dentro de los lmites y adoptar medidas correctivas, consulte Lmite de tamao de una coleccin de
elementos (p. 515).
En esta seccin se explican algunas prcticas recomendadas relativas a los ndices secundarios globales.
Esta misma instruccin es aplicable a los ndices secundarios globales. Elija claves de particin y de
ordenacin que tengan un elevado nmero de valores en relacin con el nmero de elementos del ndice.
Adems, recuerde que los ndices secundarios globales no aplican normas de exclusividad, por lo que es
importante conocer bien la cardinalidad de los atributos de clave. Por cardinalidad se entiende la cantidad
de valores diferentes que adopta un atributo concreto, en relacin con el nmero de elementos total.
Por ejemplo, supongamos que tenemos una tabla denominada Employee que contiene atributos tales
como Name, Title, Address, PhoneNumber, Salary y PayLevel. Ahora, supongamos que contamos con un
ndices secundario global denominado PayLevelIndex cuya clave de particin es PayLevel. En muchas
compaas tienen un nmero muy reducido (menor que diez) de cdigos de pago, aunque tengan cientos
de miles de empleados. Los beneficios que aportara un ndice de este tipo a una aplicacin seran
escasos o, incluso, inexistentes.
Otro problema que plantea PayLevelIndex es la distribucin desigual de valores diferentes. Por ejemplo,
es posible que solo haya algunos ejecutivos de nivel superior en la compaa, pero gran cantidad de
empleados por horas. Las consultas relativas a PayLevelIndex no seran eficientes, porque la actividad de
lectura no estara distribuida de manera uniforme entre las particiones.
Puede utilizar un ndices secundario global disperso para localizar con eficiencia elementos de una tabla
que poseen un atributo poco comn. Para ello, se saca partido del hecho de que los elementos de la tabla
que no contienen atributos de ndices secundario global no se indexan en absoluto. Por ejemplo, en la
tabla GameScores, algunos jugadores podran haber obtenido un logro concreto en un juego (por ejemplo,
"Champ"), que la mayora de los jugadores no han conseguido. En lugar de examinar la tabla GameScores
completa para buscar Champs, podra crear un ndices secundario global cuya claves fuesen Champ
(de particin) y UserId (de ordenacin). Esto facilitara la bsqueda de todos los campeones, porque se
consultara el ndice en lugar de examinar la tabla.
Una consulta de este tipo puede resultar sumamente eficiente, puesto que el nmero de elementos del
ndice ser muy inferior al nmero de elementos de la tabla. Adems, cuantos menos atributos de la tabla
se proyecten en el ndice, menos unidades de capacidad de lectura de este se consumirn.
Un caso de uso de un ndices secundario global con un esquema de claves duplicadas sera la realizacin
de bsquedas rpidas en los datos de una tabla con un desempeo provisionado mnimo. Si la tabla tiene
muchos atributos de gran tamao, cada consulta de la tabla podra consumir gran cantidad de capacidad
de lectura. Si la mayora de las consultas no requieren que se devuelvan todos los datos, puede crear un
ndices secundario global con el mnimo imprescindible de atributos proyectados o, incluso, ninguno de
ellos a excepcin de la clave de la tabla. Esto permite consultar un ndices secundario global mucho menor
y, si realmente se requieren los atributos adicionales, se podra consultar la tabla utilizando los mismos
valores de clave.
Puede crear varios ndices secundarios globales de conformidad con las caractersticas de la aplicacin.
Por ejemplo, supongamos que tenemos dos aplicaciones con caractersticas de lectura muy diferentes:
una aplicacin de alta prioridad que requiere el mximo nivel de desempeo de lectura y otra de baja
prioridad que puede tolerar la limitacin controlada ocasional de la actividad de lectura. Si ambas
aplicaciones leen la misma tabla, existe la posibilidad de que se interfieran entre s: una intensa carga de
lectura de la aplicacin de baja prioridad podra consumir toda la capacidad de lectura disponible para
la tabla, lo que, a su vez, provocara una limitacin controlada de la actividad de lectura de la aplicacin
de alta prioridad. Si crea dos ndices secundarios globales, uno con un ajuste de desempeo de lectura
provisionado alto y otro con un ajuste bajo, en la prctica estar independizando ambas cargas de trabajo
una de la otra, porque la actividad de lectura de cada aplicacin se redirigir a su propio ndice. Este
enfoque permite adaptar la cantidad de desempeo de lectura provisionado a las caractersticas de lectura
de cada aplicacin.
En algunas situaciones, es posible que sea conveniente restringir las aplicaciones que pueden realizar
lecturas en la tabla. Por ejemplo, es posible que disponga de una aplicacin que capture la actividad de
clics de un sitio web y realice escrituras frecuentes en una tabla de DynamoDB. Puede optar por aislar
esta tabla impidiendo el acceso de lectura por parte de la mayora de las aplicaciones. (Para obtener ms
informacin, consulte Uso de condiciones de polticas de IAM para control de acceso preciso (p. 652).) Sin
embargo, si tiene otras aplicaciones que deben realizar consultas ad-hoc de los datos, puede crear uno o
varios ndices secundarios globales para ello. Al crear cada ndice, es importante asegurarse de proyectar
solamente aquellos atributos que las aplicaciones necesitarn realmente. De este modo, las aplicaciones
podrn leer ms datos y, al mismo tiempo, consumir menos capacidad de lectura provisionada, en lugar de
tener que leer grandes elementos de la tabla. Esto puede suponer un importante ahorro en costos a largo
plazo.
Amazon DynamoDB se integra con otros servicios de AWS, lo que permite automatizar las tareas
repetitivas o crear aplicaciones que abarcan varios servicios. Por ejemplo:
Temas
Puntos de enlace de Amazon VPC para DynamoDB (p. 718)
Configuracin de las credenciales de AWS en los archivos mediante Amazon Cognito (p. 725)
Carga de datos de DynamoDB a Amazon Redshift (p. 726)
Procesamiento de datos de DynamoDB con Apache Hive en Amazon EMR (p. 727)
Exportacin e importacin de datos de DynamoDB mediante AWS Data Pipeline (p. 755)
Si cre la cuenta de AWS despus del 04/12/2013, ya dispone de una VPC predeterminada en
cada regin de AWS. Las VPC predeterminadas estn listas para usarse; puede comenzar de
inmediato a usarlas sin tener que realizar ningn paso de configuracin adicional.
Para obtener ms informacin, consulte Your Default VPC and Subnets en la Gua del usuario de
Amazon VPC.
Para obtener acceso a la red pblica de Internet, la VPC debe tener un puerto de enlace a Internet, es
decir, un router virtual que conecta su VPC a Internet. Esto permite a las aplicaciones que se ejecutan en
Amazon EC2 en su VPC obtener acceso a los recursos de Internet, como Amazon DynamoDB.
A muchos clientes les preocupa con razn la privacidad y la seguridad en el envo y recepcin de datos
a travs de la Internet pblica. Estas preocupaciones se pueden atajar con el uso de una red privada
virtual (VPN) para dirigir todo el trfico de la red de DynamoDB a travs de la infraestructura de red
corporativa propiedad del cliente. Sin embargo, este enfoque puede conllevar problemas de ancho de
banda y disponibilidad.
Estos problemas se pueden solventar con puntos de conexin de la VPC para DynamoDB. Un punto
de conexin de la VPC para DynamoDB permite que las instancias Amazon EC2 de la VPC utilicen
sus direcciones IP privadas para tener acceso a DynamoDB sin exponerse en la Internet pblica. Sus
instancias EC2 no tienen que ser direcciones IP pblicas, ni necesita un puerto de enlace a Internet, un
dispositivo NAT o una gateway privada virtual en su VPC. Para controlar el acceso a DynamoDB se utilizan
polticas de punto de enlace. El trfico entre su VPC y el servicio de AWS no sale de la red de Amazon.
Cuando crea un punto de conexin de la VPC para DynamoDB todas las solicitudes a un punto de enlace
de DynamoDB dentro de la regin (por ejemplo, dynamodb.us-west-2.amazonaws.com) se dirigen a un
punto de enlace de DynamoDB privado dentro de la red de Amazon. No necesita modificar las aplicaciones
que se ejecutan en instancias EC2 de su VPC: el nombre del punto de enlace sigue siendo el mismo, pero
el enrutamiento a DynamoDB permanece completamente dentro de la red de Amazon y no tiene acceso a
la Internet pblica.
En el siguiente diagrama se muestra cmo una instancia EC2 de una VPC, puede utilizar un punto de
conexin de la VPC para tener acceso a DynamoDB.
En esta seccin se explica cmo configurar y usar un punto de conexin de la VPC para DynamoDB.
En la parte superior de la lista de AMI, vaya a Amazon Linux AMI y elija Select.
Elija Launch.
3. En la ventana Select an existing key pair or create a new key pair, proceda del modo siguiente:
Si no dispone de un par de claves de Amazon EC2, elija Create a new key pair y siga las
instrucciones. Se le pedir que descargue un archivo de clave privada (archivo .pem); lo necesitar
ms adelante cuando inicie sesin en la instancia Amazon EC2.
Si ya dispone de un par de claves de Amazon EC2, vaya a Select a key pair y eljalo en la lista.
Tenga en cuenta que deber tener ya el archivo de clave privada (archivo .pem) a su disposicin
para poder iniciar sesin en la instancia Amazon EC2.
4. Cuando haya configurado el par de claves, elija Launch Instances.
5. Vuelva a la pgina de inicio de la consola de Amazon EC2 y elija la instancia que ha lanzado. En
el panel inferior, en la pestaa Description, busque el Public DNS de su instancia. Por ejemplo:
ec2-00-00-00-00.us-east-1.compute.amazonaws.com.
Anote el nombre de DNS pblico, pues lo necesitar en el paso siguiente de este tutorial (Paso2:
Configurar la instancia Amazon EC2 (p. 722)).
Note
La instancia Amazon EC2 tardar unos minutos en estar disponible. Antes de continuar con el
siguiente paso, asegrese de que Instance State tenga el valor running y de que se hayan
superado todas las comprobaciones de estado (Status Checks).
1. Tendr que autorizar el trfico SSH entrante en su instancia Amazon EC2. Para ello, crear un nuevo
grupo de seguridad de EC2 y, a continuacin, asignar el grupo de seguridad a la instancia EC2.
Security group name: escriba un nombre nico para su grupo de seguridad. Por ejemplo: my-
ssh-access
Description: escriba una breve descripcin del grupo de seguridad.
VPC: seleccione la VPC predeterminada.
En la seccin Security group rules, elija Add Rule y proceda del modo siguiente:
Type: elija SSH.
Source: elija My IP.
Deber especificar el archivo de clave privada (archivo .pem) y el nombre de DNS pblico de la
instancia. (Consulte Paso 1: Lanzar una instancia Amazon EC2 (p. 720)).
aws configure
Ahora est listo para crear un punto de conexin de la VPC para DynamoDB.
1. Antes de empezar, compruebe que puede comunicarse con DynamoDB mediante su punto de enlace
pblico:
La salida mostrar una lista de las tablas de DynamoDB que tiene actualmente. (Si no tiene tablas, la
lista estar vaca).
2. Compruebe que DynamoDB es un servicio disponible para la creacin de puntos de conexin de la
VPC en la regin de AWS. (El comando se muestra en negrita, seguido del resultado de ejemplo).
{
"ServiceNames": [
"com.amazonaws.us-east-1.s3",
"com.amazonaws.us-east-1.dynamodb"
]
}
En el resultado de ejemplo, DynamoDB es uno de los servicios disponibles, por lo que puede a
empezar crear un punto de conexin de la VPC para este servicio.
3. Determine el identificador de su VPC.
{
"Vpcs": [
{
"VpcId": "vpc-0bbc736e",
"InstanceTenancy": "default",
"State": "available",
"DhcpOptionsId": "dopt-8454b7e1",
"CidrBlock": "172.31.0.0/16",
"IsDefault": true
}
]
}
"VpcEndpoint": {
"PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":
\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}",
"VpcId": "vpc-0bbc736e",
"State": "available",
"ServiceName": "com.amazonaws.us-east-1.dynamodb",
"RouteTableIds": [],
"VpcEndpointId": "vpce-9b15e2f2",
"CreationTimestamp": "2017-07-26T22:00:14Z"
}
}
5. Compruebe que puede tener acceso a DynamoDB a travs del punto de conexin de la VPC:
Si lo desea, puede probar otros comandos de la AWS CLI para DynamoDB. Para obtener ms
informacin, consulte la AWS Command Line Interface Reference.
{
"VpcEndpoint": {
"PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":
\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}",
"VpcId": "vpc-0bbc736e",
"State": "available",
"ServiceName": "com.amazonaws.us-east-1.dynamodb",
"RouteTableIds": [],
"VpcEndpointId": "vpce-9b15e2f2",
"CreationTimestamp": "2017-07-26T22:00:14Z"
}
}
{
"Unsuccessful": []
}
La matriz vaca [] indica que la operacin se ha realizado correctamente (no hay solicitudes con
error).
Por ejemplo, si desea configurar los archivos de JavaScript de modo que utilicen un rol sin autenticar de
Amazon Cognito para obtener acceso al servicio web de DynamoDB:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-west-2:12345678-1ab2-123a-1234-
a12345ab12"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "unauthenticated"
}
}
}
]
}
3. Crear un rol de IAM que asume la poltica anterior. De este modo, Amazon Cognito se convierte en
una entidad de confianza que puede asumir el rol Cognito_DynamoPoolUnauth.
Note
7. Especifique las credenciales de Amazon Cognito en sus archivos. Modifique los valores de
IdentityPoolId y RoleArn en consecuencia.
Ahora, puede ejecutar sus programas de JavaScript en el servicio web de DynamoDB utilizando las
credenciales de Amazon Cognito. Para obtener ms informacin, consulte Setting Credentials in a Web
Browser en la AWS SDK for JavaScript Getting Started Guide.
En lo que respecta al desempeo provisionado, una operacin de copia desde una tabla de DynamoDB
consume capacidad de lectura de esa tabla. Despus de copiar los datos, las consultas SQL que se llevan
a cabo en Amazon Redshift no afectan a DynamoDB de ningn modo. El motivo es que las consultas se
ejecutan en una copia de los datos de DynamoDB y no en DynamoDB propiamente dicho.
API Version 2012-08-10
726
Amazon DynamoDB Developer Guide
Integracin con Amazon EMR
Para poder cargar datos desde una tabla de DynamoDB, antes debe crear una tabla de Amazon Redshift
que actuar como destino de los datos. Tenga en cuenta que, al hacerlo, estar copiando datos de un
entorno NoSQL en un entorno SQL y que hay reglas que no se aplican por igual en ambos. A continuacin
se muestran algunas de las diferencias que deben tenerse en cuenta:
Los nombres de las tablas de DynamoDB pueden contener un mximo de 255caracteres, incluidos
el punto (".") y el guion ("-"). Adems, distinguen entre maysculas y minsculas. Los nombres de las
tablas de Amazon Redshift estn limitados a 127caracteres, no pueden contener puntos ni guiones y
no distinguen entre maysculas y minsculas. Los nombres de las tablas tampoco pueden entrar en
conflicto con ninguna palabra reservada de Amazon Redshift.
DynamoDB no admite el concepto NULL de SQL. Debe especificar cmo debe interpretar Amazon
Redshift los valores de atributos vacos o en blanco de DynamoDB, para que los trate como NULL o
como campos vacos.
Los tipos de datos de DynamoDB no se corresponden directamente con los de Amazon Redshift. Debe
asegurarse de que cada columna de la tabla de Amazon Redshift sea del tipo y el tamao de datos
correctos para adaptarse a los datos de DynamoDB.
Para obtener instrucciones detalladas sobre cmo cargar datos de DynamoDB en Amazon Redshift,
consulte las secciones siguientes de la Amazon Redshift Database Developer Guide:
Temas
Informacin general (p. 728)
Informacin general
Amazon EMR es un servicio que facilita el procesamiento rpido y rentable de enormes volmenes
de datos. Para utilizar Amazon EMR, se lanza un clster administrado de instancias Amazon EC2
que ejecutan el marco de trabajo de cdigo abierto Hadoop. Hadoop es una aplicacin distribuida que
implementa el algoritmo de MapReduce, en virtud del cual se mapea una tarea a varios nodos del clster.
En paralelo con los dems nodos, cada nodo procesa el trabajo que se ha designado para l. Por ltimo,
las salidas se reducen a un solo nodo, que produce el resultado final.
Puede lanzar el clster de Amazon EMR de modo que sea persistente o transitorio:
Un clster persistente se ejecuta hasta que se cierra. Los clsteres persistentes son idneos para el
anlisis de datos, el almacenamiento de datos o cualquier otro uso interactivo.
Un clster transitorio se ejecuta el tiempo suficiente para procesar un flujo de trabajo y, a continuacin,
se cierra automticamente. Los clsteres transitorios son idneos para las tareas de procesamiento
peridicas, tales como la ejecucin de scripts.
Para obtener ms informacin sobre la arquitectura y administracin de Amazon EMR, consulte la Amazon
EMR Management Guide.
Cuando se lanza un clster de Amazon EMR, se especifica el nmero inicial y el tipo de instancias Amazon
EC2. Tambin se especifican otras aplicaciones distribuidas (adems de Hadoop) que se desea ejecutar
en el clster. Estas aplicaciones son, entre otras, Hue, Mahout, Pig o Spark.
Para obtener informacin sobre las aplicaciones para Amazon EMR, consulte la Amazon EMR Release
Guide.
Segn la configuracin del clster, puede que disponga de uno o varios de los tipos de nodos siguientes:
Nodo maestro: administra el clster coordinando la distribucin del ejecutable de MapReduce y de los
subconjuntos de datos sin procesar, hasta los grupos de instancias principal y de tareas. Tambin hace
un seguimiento del estado de cada tarea realizada y monitoriza la salud de los grupos de instancias.
Solo hay un nodo maestro en un clster.
Nodos principales: ejecutan tareas de MapReduce y almacenan datos utilizando el Hadoop Distributed
File System (HDFS).
Nodos de tareas (opcionales): ejecutan las tareas de MapReduce.
Hive es una aplicacin de data warehouse para Hadoop que permite procesar y analizar datos de
varios orgenes. Hive proporciona un lenguaje similar a SQL, HiveQL, que permite trabajar con datos
almacenados localmente en el clster de Amazon EMR o en un origen de datos externo (como Amazon
DynamoDB).
Temas
Antes de empezar (p. 729)
Paso 1: Crear un par de claves de Amazon EC2 (p. 729)
Paso 2: Lanzar un clster de Amazon EMR (p. 730)
Paso 3: Conectarse al nodo maestro (p. 730)
Paso 4: Cargar los datos en HDFS (p. 731)
Paso 5: Copiar los datos a DynamoDB (p. 733)
Paso 6: Consultar los datos en la tabla de DynamoDB (p. 734)
Paso 7: Limpieza (opcional) (p. 734)
Antes de empezar
Para este tutorial, necesitar lo siguiente:
Una cuenta de AWS. Si no dispone de una, consulte Inscripcin en AWS (p. 49).
Un cliente SSH (Secure Shell). El cliente SSH se utiliza para conectarse al nodo maestro del clster
de Amazon EMR y ejecutar comandos interactivos. Los clientes SSH estn disponibles de forma
predeterminada en la mayora de las instalaciones de Linux, Unix y Mac OS X. Los usuarios de Windows
pueden descartar e instalar el cliente PuTTY, que es compatible con SSH.
Paso siguiente
1. Inicie sesin en la Consola de administracin de AWS y abra la consola de Amazon EC2 en https://
console.aws.amazon.com/ec2/.
2. Elija una regin (por ejemplo, US West (Oregon)). Debe ser la misma regin en la que se encuentra
la tabla de DynamoDB.
3. En el panel de navegacin, seleccione Key Pairs.
4. Seleccione Create Key Pair.
5. En Key pair name, escriba un nombre para el par de claves (por ejemplo, mykeypair) y despus elija
Create.
6. Descargue el archivo de clave privada. El nombre de archivo terminar por .pem (por ejemplo,
mykeypair.pem). Mantenga este archivo de clave privada en un lugar seguro. Lo necesitar para
obtener acceso a cualquier clster de Amazon EMR que lance con este par de claves.
Important
Si lo pierde, no podr obtener conectarse al nodo maestro del clster de Amazon EMR.
Para obtener ms informacin acerca de pares de claves, consulte Amazon EC2 Key Pairs en la Gua
del usuario de Amazon EC2 para instancias de Linux.
Paso siguiente
a. En Cluster name, escriba el nombre del clster (por ejemplo, My EMR cluster).
b. En EC2 key pair, elija el par de claves que cre anteriormente.
Se tardan unos minutos en lanzar el clster. Puede utilizar la pgina Cluster Details de la consola de
Amazon EMR para monitorizar el progreso.
Si no hay un bucket de Amazon S3, la Consola de administracin de AWS lo crea. El nombre del bucket es
aws-logs-account-id-region, donde account-id es el nmero de cuenta de AWS y region es la
regin donde lanz el clster (por ejemplo, aws-logs-123456789012-us-west-2).
Note
Puede usar la consola de Amazon S3 para ver los archivos log. Para obtener ms informacin,
consulte View Log Files en la Amazon EMR Management Guide.
Puede usar este bucket para otros fines, adems de generar logs. Por ejemplo, puede utilizar el bucket
como ubicacin donde almacenar un script de Hive o como destino al exportar datos de Amazon
DynamoDB a Amazon S3.
Paso siguiente
1. En la consola de Amazon EMR, elija el nombre del clster para ver su estado.
2. En la pgina Cluster Details, busque el campo Master public DNS. Se trata del nombre de DNS
pblico del nodo maestro del clster de Amazon EMR.
3. A la derecha del nombre de DNS, elija el enlace SSH.
Segn cul sea su sistema operativo, elija la pestaa Windows o Mac/Linux. A continuacin, siga las
instrucciones para conectarse al nodo principal.
Despus de conectarse al nodo maestro mediante SSH o PuTTY, debe aparecer un smbolo del sistema
parecido al siguiente:
[hadoop@ip-192-0-2-0 ~]$
Paso siguiente
wget http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/
features.zip
unzip features.zip
head features.txt
1535908|Big Run|Stream|WV|38.6370428|-80.8595469|794
875609|Constable Hook|Cape|NJ|40.657881|-74.0990309|7
1217998|Gooseberry Island|Island|RI|41.4534361|-71.3253284|10
26603|Boone Moore Spring|Spring|AZ|34.0895692|-111.410065|3681
1506738|Missouri Flat|Flat|WA|46.7634987|-117.0346113|2605
1181348|Minnow Run|Stream|PA|40.0820178|-79.3800349|1558
1288759|Hunting Creek|Stream|TN|36.343969|-83.8029682|1024
533060|Big Charles Bayou|Bay|LA|29.6046517|-91.9828654|0
829689|Greenwood Creek|Stream|NE|41.596086|-103.0499296|3671
541692|Button Willow Island|Island|LA|31.9579389|-93.0648847|98
hive
LOAD DATA
LOCAL
INPATH './features.txt'
OVERWRITE
INTO TABLE hive_features;
7. Ahora, tenemos una tabla de Hive nativa que contiene los datos del archivo features.txt. Para
comprobarlo, escriba la siguiente instruccin de HiveQL:
El resultado debera ser una lista de estados y el nmero de accidentes geogrficos de cada uno de
ellos.
Paso siguiente
Seleccione Create.
4. En el smbolo del sistema de Hive, escriba la instruccin de HiveQL siguiente:
"dynamodb.column.mapping"="feature_id:Id,feature_name:Name,feature_class:Class,state_alpha:State,p
);
elev_in_ft
FROM hive_features;
Hive enviar un trabajo de MapReduce, que se procesar en el clster de Amazon EMR. El trabajo
puede tardar varios minutos en completarse.
6. Compruebe que los datos se han cargado en DynamoDB:
Paso siguiente
3. Los estados que tienen al menos tres accidentes geogrficos con ms de una milla de altitud
(5280pies/1609,34metros):
Paso siguiente
Sin embargo, cuando ya no necesite el clster, conviene terminarlo y eliminar todos los recursos
asociados. De este modo, evitar que se le cobre por los recursos que no necesita.
Podemos considerar que una tabla externa es un puntero que seala a un origen de datos administrado
y almacenado en otro lugar. En este caso, el origen de datos subyacente es una tabla de DynamoDB.
La tabla debe existir previamente. No se puede crear, actualizar ni eliminar una tabla de DynamoDB
desde Hive. La instruccin CREATE EXTERNAL TABLE se utiliza para crear la tabla externa. A partir de
ese momento, podr usar HiveQL para trabajar con los datos de DynamoDB, como si se encontrasen
almacenado localmente en Hive.
Note
Puede usar instrucciones INSERT para insertar datos en una tabal externa e instrucciones
SELECT para seleccionar datos en ella. Sin embargo, no se pueden usar instrucciones UPDATE ni
DELETE para manipular los datos de la tabla.
Cuando ya no necesite la tabla externa, puede eliminarla mediante la instruccin DROP TABLE. En este
caso, DROP TABLE solamente elimina la tabla externa en Hive. La operacin no afecta a la tabla de
DynamoDB subyacente ni a ninguno de los datos que contiene.
Temas
Sintaxis de CREATE EXTERNAL TABLE (p. 735)
Mapeos de tipos de datos (p. 736)
TBLPROPERTIES (
"dynamodb.table.name" = "dynamodb_table",
"dynamodb.column.mapping" =
"hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name..."
);
En la lnea 2 se especifican las columnas y los tipos de datos de hive_table. Debe definir columnas y tipos
de datos que se correspondan con los atributos de la tabla de DynamoDB.
La lnea 3 es la clusula STORED BY, en la que se especifica una clase que controla la administracin
de los datos entre Hive y la tabla de DynamoDB. Para DynamoDB, STORED BY debe establecerse en
'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'.
El nombre de la tabla de Hive no tiene que ser igual que el de la tabla de DynamoDB.
Los nombres de las columnas de la tabla de Hive no tienen que ser iguales que los de la tabla de
DynamoDB.
La tabla especificada en dynamodb.table.name debe existir previamente en DynamoDB.
En dynamodb.column.mapping:
Debe mapear los atributos del esquema de claves de la tabla de DynamoDB. Esto incluye la clave de
particin y la clave de ordenacin (si la hay).
No tiene que mapear los atributos que no son de clave de la tabla de DynamoDB. Sin embargo, no
aparecer ningn dato de esos atributos cuando consulte la tabla de Hive.
Si los tipos de datos de una columna de la tabla de Hive y de un atributo de DynamoDB son
incompatibles, aparecer NULL en esas columnas cuando consulte la tabla de Hive.
Note
Cadena STRING
Binary BINARY
Note
Map
List
Booleano
Null
Si desea mapear un atributo de DynamoDB del tipo Number, debe elegir un tipo de Hive apropiado:
El tipo BIGINT de Hive es para enteros de 8bytes con signo. Es igual que el tipo de datos long de
Java.
El tipo DOUBLE de hive es para nmeros de 8bits con coma flotante de doble precisin. Es igual que el
tipo double de Java.
Si tiene datos numricos almacenados en DynamoDB cuya precisin es superior a la del tipo de datos de
Hive que ha elegido, al obtener acceso a los datos de DynamoDB podra perderse precisin.
Si exporta datos del tipo Binary de DynamoDB a (Amazon S3) o HDFS, los datos se almacenarn como
una cadena codificada en Base64. Si importa datos de Amazon S3 o HDFS al tipo Binary de DynamoDB,
debe asegurarse de que estn codificados como una cadena Base64.
Por ejemplo, tomemos la tabla ddb_features (de Tutorial: Uso de Amazon DynamoDB y Apache
Hive (p. 728)). La siguiente consulta de Hive imprime las abreviaturas de los estados y el nmero de
cumbres de cada uno de ellos:
Hive no devuelve los resultados de forma inmediata. En lugar de ello, enva un trabajo de MapReduce,
que se procesa en el marco Hadoop. Hive espera hasta que se ha completado el trabajo para mostrar los
resultados de la consulta:
AK 2
AL 2
AR 2
AZ 3
CA 7
CO 2
CT 2
ID 1
KS 1
ME 2
MI 1
MT 3
NC 1
NE 1
NM 1
NY 2
OR 5
PA 1
TN 1
TX 1
UT 4
VA 1
VT 2
WA 2
WY 3
Time taken: 8.753 seconds, Fetched: 25 row(s)
Si necesita cancelar el trabajo antes de que finalice, puede pulsar las teclas Ctrl+C en cualquier
momento.
En estos ejemplos se utiliza la tabla ddb_features del tutorial (Paso 5: Copiar los datos a
DynamoDB (p. 733)).
Temas
Uso de funciones de agregacin (p. 738)
Uso de las clusulas GROUP BY y HAVING (p. 739)
Unin de dos tablas de DynamoDB (p. 739)
Unin de tablas de orgenes diferentes (p. 740)
SELECT MAX(elev_in_ft)
FROM ddb_features
WHERE state_alpha = 'CO';
En el siguiente ejemplo se devuelve una lista con las cinco mayores altitudes de aquellos estados que
tienen ms de cinco accidentes geogrficos contenidos en la tabla ddb_features.
Tomemos una tabla de DynamoDB denominada EastCoastStates que contiene los datos siguientes:
StateName StateAbbrev
Maine ME
New Hampshire NH
Massachusetts MA
Rhode Island RI
Connecticut CT
New York NY
New Jersey NJ
Delaware DE
Maryland MD
Virginia VA
North Carolina NC
South Carolina SC
Georgia GA
Florida FL
Supongamos que la tabla est disponible como una tabla de Hive externa denominada east_coast_states:
La unin siguiente devuelve los estados de la costa oriental de Estados Unidos que tienen al menos tres
accidentes geogrficos:
Hive es una solucin excelente para copiar datos entre tablas de DynamoDB, buckets de Amazon S3,
tablas de Hive nativas y Hadoop Distributed File System (HDFS). En esta seccin se proporcionan
ejemplos de estas operaciones.
Temas
Copia de datos entre DynamoDB y una tabla de Hive nativa (p. 740)
Copia de datos entre DynamoDB y Amazon S3 (p. 741)
Copia de datos entre DynamoDB y HDFS (p. 746)
Uso de la compresin de datos (p. 750)
Lectura de datos de caracteres UTF-8 no imprimibles (p. 751)
Puede ser algo conveniente si tiene que realizar muchas consultas de HiveQL, pero no desea consumir
capacidad de desempeo provisionada de DynamoDB. Dado que los datos de la tabla de Hive nativa son
una copia de los datos de DynamoDB, y no son datos "en tiempo real", en las consultas no cabe esperar
que los datos estn actualizados.
Los ejemplos de esta seccin se han escrito partiendo del supuesto de que ya ha llevado a cabo los
pasos del Tutorial: Uso de Amazon DynamoDB y Apache Hive (p. 728) y de que ya dispone de una tabla
externa en DynamoDB (ddb_features).
En estos ejemplos, la subconsulta SELECT * FROM ddb_features recuperar todos los datos de
ddb_features. Si solamente desea copiar un subconjunto de los datos, puede usar una clusula WHERE en
la subconsulta.
En el siguiente ejemplo se crea una tabla de Hive nativa que nicamente contiene algunos de atributos de
lagos y cumbres:
Puede ser interesante hacerlo si desea crear un archivo comprimido de datos en la tabla de DynamoDB.
Por ejemplo, supongamos que tiene un entorno de pruebas en el cual necesita trabajar con un conjunto
de datos de prueba de referencia en DynamoDB. Puede copiar los datos de referencia en un bucket
de Amazon S3 y, a continuacin, ejecutar las pruebas. A continuacin, puede restablecer el entorno de
pruebas restaurando los datos de referencia del bucket de Amazon S3 en DynamoDB.
Si ha realizado el Tutorial: Uso de Amazon DynamoDB y Apache Hive (p. 728), ya dispone de un bucket
de Amazon S3 que contiene los logs de Amazon EMR. Puede utilizar este bucket para los ejemplos de
esta seccin, si conoce su ruta raz:
s3://aws-logs-accountID-region
donde accountID es el identificador de su cuenta de AWS y region es la regin de AWS del bucket.
Note
En estos ejemplos, utilizaremos una subruta contenida en el bucket, como en este ejemplo:
s3://aws-logs-123456789012-us-west-2/hive-test
Los procedimientos siguientes se han escrito partiendo del supuesto de que ya ha llevado a cabo los
pasos del tutorial y de que ya dispone de una tabla externa en DynamoDB (ddb_features).
Temas
Copia de datos mediante el formato predeterminado de Hive (p. 742)
Copia de datos con un formato especificado por el usuario (p. 743)
Copia de datos sin mapeo de columnas (p. 744)
Visualizacin de datos en Amazon S3 (p. 745)
Use una instruccin INSERT OVERWRITE para escribir directamente en Amazon S3.
Cada campo se separa por un carcter SOH (inicio del encabezado, 0x01). En el archivo, SOH aparece
como ^A.
1. Cree una tabla externa que apunte a los datos sin formato de Amazon S3.
(feature_id BIGINT,
feature_name STRING ,
feature_class STRING ,
state_alpha STRING,
prim_lat_dec DOUBLE ,
prim_long_dec DOUBLE ,
elev_in_ft BIGINT)
LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
1. Cree una tabla de Hive externa mapeada a Amazon S3. Al hacerlo, asegrese de que los tipos de
datos sean coherentes con los de la tabla de DynamoDB externa.
Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de Amazon
S3:
Si la tabla de DynamoDB contiene atributos de tipo Map, List, Boolean o Null, entonces este es el
nico modo de usar Hive para copiar datos de DynamoDB en Amazon S3.
1. Cree una tabla externa asociada con la tabla de DynamoDB. Esta instruccin de HiveQL no contiene
ningn mapeo dynamodb.column.mapping.
Name^C{"s":"Soldiers Farewell
Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"
Name^C{"s":"Jones
Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}
Name^C{"s":"Sentinel
Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"
Name^C{"s":"Neversweet
Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269
Name^C{"s":"Chacaloochee
Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C
Cada campo comienza por un carcter STX (inicio del texto, 0x02) y termina con un carcter ETX (final del
texto, 0x03). En el archivo, STX aparece como ^B y ETX aparece como ^C.
Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de Amazon
S3:
Los pasos siguientes se han escrito partiendo del supuesto de que ha copiado los datos de DynamoDB a
Amazon S3 por medio de uno de los procedimientos de esta seccin.
1. Si tiene abierto el smbolo del sistema de Hive, salga y cambie al smbolo del sistema de Linux.
hive> exit;
2. Muestre el contenido del directorio hive-test en el bucket de Amazon S3. Aqu es donde Hive ha
copiado los datos de DynamoDB.
aws s3 ls s3://aws-logs-123456789012-us-west-2/hive-test/
aws s3 cp s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 .
download: s3://aws-logs-123456789012-us-west-2/hive-test/000000_0
to ./000000_0
Note
El sistema de archivos local del nodo maestro tiene una capacidad limitada. No utilice este
comando con archivos ms grandes que el espacio disponible en el sistema de archivos
local.
Puede ser conveniente si va a ejecutar un trabajo de MapReduce que requiere datos de DynamoDB. Si
copia los datos de DynamoDB a HDFS, Hadoop puede procesarlos utilizando en paralelo todos los nodos
disponibles en el clster de Amazon EMR. Una vez que se haya completado el trabajo de MapReduce,
puede escribir los resultados de HDFS a DDB.
En los ejemplos siguientes, Hive leer y escribir en el siguiente directorio de HDFS: /user/hadoop/
hive-test
Los ejemplos de esta seccin se han escrito partiendo del supuesto de que ya ha llevado a cabo los
pasos del Tutorial: Uso de Amazon DynamoDB y Apache Hive (p. 728) y de que ya dispone de una tabla
externa en DynamoDB (ddb_features).
Temas
Copia de datos mediante el formato predeterminado de Hive (p. 746)
Copia de datos con un formato especificado por el usuario (p. 747)
Copia de datos sin mapeo de columnas (p. 748)
Acceso a los datos de HDFS (p. 749)
Cada campo se separa por un carcter SOH (inicio del encabezado, 0x01). En el archivo, SOH aparece
como ^A.
1. Cree una tabla externa mapeada a los datos sin formato de HDFS.
1. Cree una tabla de Hive externa mapeada a HDFS. Al hacerlo, asegrese de que los tipos de datos
sean coherentes con los de la tabla de DynamoDB externa.
264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900
115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0
Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de HDFS:
Si la tabla de DynamoDB contiene atributos de tipo Map, List, Boolean o Null, entonces este es el
nico modo de usar Hive para copiar datos de DynamoDB en HDFS.
1. Cree una tabla externa asociada con la tabla de DynamoDB. Esta instruccin de HiveQL no contiene
ningn mapeo dynamodb.column.mapping.
Name^C{"s":"Soldiers Farewell
Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"
Name^C{"s":"Jones
Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}
Name^C{"s":"Sentinel
Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"
Name^C{"s":"Neversweet
Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269
Name^C{"s":"Chacaloochee
Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C
Cada campo comienza por un carcter STX (inicio del texto, 0x02) y termina con un carcter ETX (final del
texto, 0x03). En el archivo, STX aparece como ^B y ETX aparece como ^C.
Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de HDFS:
HDFS no es lo mismo que el sistema de archivos local del nodo maestro. No se puede trabajar con los
archivos y directorios de HDFS usando los comandos Linux estndar (tales como cat, cp, mv o rm). En
lugar de ello, estas tareas se llevan a cabo usando el comando hadoop fs.
Los pasos siguientes se han escrito partiendo del supuesto de que ha copiado los datos de DynamoDB a
HDFS por medio de uno de los procedimientos de esta seccin.
1. Si tiene abierto el smbolo del sistema de Hive, salga y cambie al smbolo del sistema de Linux.
hive> exit;
2. Muestre el contenido del directorio /user/hadoop/hive-test en HDFS. Aqu es donde Hive ha copiado
los datos de DynamoDB.
Found 1 items
-rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0
Note
El sistema de archivos local del nodo maestro tiene una capacidad limitada. No utilice este
comando con archivos ms grandes que el espacio disponible en el sistema de archivos
local.
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK;
SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec;
El archivo resultante de Amazon S3 tendr un nombre generado por el sistema con la extensin .lzo (por
ejemplo, 8d436957-57ba-4af7-840c-96c2fc7bb6f5-000000.lzo).
org.apache.hadoop.io.compress.GzipCodec
org.apache.hadoop.io.compress.DefaultCodec
com.hadoop.compression.lzo.LzoCodec
com.hadoop.compression.lzo.LzopCodec
org.apache.hadoop.io.compress.BZip2Codec
org.apache.hadoop.io.compress.SnappyCodec
Apache Hive en Amazon EMR implementa su propia lgica para balancear la carga de E/S en la tabla de
DynamoDB y trata de minimizar la posibilidad de sobrepasar el desempeo provisionado de la tabla. Al
final de cada consulta de Hive, Amazon EMR devuelve mtricas de tiempo de ejecucin, incluido el nmero
de veces que se ha superado el desempeo provisionado. Puede utilizar esta informacin, junto con las
mtricas de CloudWatch sobre la tabla de DynamoDB, para mejorar el desempeo en las solicitudes
posteriores.
La consola de Amazon EMR proporciona herramientas de monitorizacin bsica para el clster. Para
obtener ms informacin, consulte View and Monitor a Cluster en la Amazon EMR Management Guide.
Tambin puede monitorizar el clster y los trabajos de Hadoop mediante herramientas basadas en Web,
tales como Hue, Ganglia y la interfaz web de Hadoop. Para obtener ms informacin, consulte View Web
Interfaces Hosted on Amazon EMR Clusters en la Amazon EMR Management Guide.
En esta seccin se describen los pasos que puede llevar a cabo para ajustar el desempeo de las
operaciones de Hive en las tablas de DynamoDB externas.
Temas
Desempeo provisionado de DynamoDB (p. 751)
Ajuste de los mapeadores (p. 753)
Temas adicionales (p. 754)
Por ejemplo, supongamos que ha provisionado 100unidades de capacidad de lectura para la tabla
de DynamoDB. Esto permite leer 409600bytes por segundo (100 4 KB, que es el tamao de la
unidad de capacidad de lectura). Ahora, supongamos que la tabla contiene 20GB de datos (a saber,
21474836480bytes) y que desea usar la instruccin SELECT para seleccionar todos los datos mediante
HiveQL. A continuacin se indica cmo calcular cunto tardar aproximadamente la consulta en
ejecutarse:
En esta situacin, la tabla de DynamoDB es un cuello de botella. Agregar ms nodos de Amazon EMR no
servir de ayuda, porque el desempeo de Hive est limitado a tan solo 409600bytes por segundo. La
nica forma de reducir el tiempo necesario para ejecutar la instruccin SELECT es aumentar la capacidad
de lectura provisionada de la tabla de DynamoDB.
Puede realizar un clculo similar para calcular aproximadamente cunto se tardara en cargar los datos
masivamente en una tabla de Hive externa mapeada a una tabla de DynamoDB. Determine el nmero total
de bytes de los datos que desea cargar y, a continuacin, divida esa cifra por una unidad de capacidad de
escritura de DynamoDB (1 KB). Obtendr el nmero de segundos que se tardar en cargar la tabla.
Capacidad de lectura
Amazon EMR administra la carga de solicitudes en la tabla de DynamoDB de acuerdo con los
ajustes de desempeo provisionado de la tabla. Sin embargo, si observa una cantidad elevada
de mensajes de ProvisionedThroughputExceeded en el resultado del trabajo, puede
ajustar la tasa de lectura predeterminada. Para ello, puede modificar la variable de configuracin
dynamodb.throughput.read.percent. Puede usar el comando SET para establecer esta variable en
el smbolo del sistema de Hive:
SET dynamodb.throughput.read.percent=1.0;
Esta variable persiste nicamente durante la sesin de Hive actual. Si sale de Hive y vuelve a abrirlo ms
adelante, dynamodb.throughput.read.percent recuperar su valor predeterminado.
Si observa que Hive agota con frecuencia la capacidad de lectura provisionada de la tabla, o si las
solicitudes de lectura son objeto de la limitacin controlada en demasiados casos, pruebe a reducir
dynamodb.throughput.read.percent por debajo de 0.5. Si tiene capacidad de lectura suficiente en
la tabla y desea aumentar la agilidad de las operaciones de HiveQL, puede establecer esta variable en un
valor superior a 0.5.
Capacidad de escritura
Amazon EMR administra la carga de solicitudes en la tabla de DynamoDB de acuerdo con los
ajustes de desempeo provisionado de la tabla. Sin embargo, si observa una cantidad elevada
SET dynamodb.throughput.write.percent=1.0;
Esta variable persiste nicamente durante la sesin de Hive actual. Si sale de Hive y vuelve a abrirlo ms
adelante, dynamodb.throughput.write.percent recuperar su valor predeterminado.
Si observa que Hive agota con frecuencia la capacidad de escritura provisionada de la tabla, o si las
solicitudes de escritura son objeto de la limitacin controlada en demasiados casos, pruebe a reducir
dynamodb.throughput.write.percent por debajo de 0.5. Si tiene capacidad suficiente en la tabla
y desea aumentar la agilidad de las operaciones de HiveQL, puede establecer esta variable en un valor
superior a 0.5.
Al escribir datos en DynamoDB utilizando Hive, debe asegurarse de que el nmero de unidades de
capacidad de escritura sea mayor que el nmero de mapeadores en el cluster. Por ejemplo, tomemos
un clster de Amazon EMR que consta de 10 nodos m1.xlarge. El tipo de nodo m1.xlarge proporciona
8tareas de mapeador, de modo que el clster tendra un total de 80mapeadores (10 8). Si la tabla de
DynamoDB tiene menos de 80unidades de capacidad de escritura, entonces una operacin de escritura
de Hive podra consumir todo el desempeo de escritura de dicha tabla.
Para determinar el nmero de mapeadores de los tipos de nodos de Amazon EMR, consulte Task
Configuration en la Amazon EMR Developer Guide.
Para obtener ms informacin sobre los mapeadores, consulte Ajuste de los mapeadores (p. 753).
El nmero de tareas de mapeador que se usan en un trabajo de Hadoop se ve incluido por las
divisiones de entrada que Hadoop utiliza para subdividir los datos en bloques lgicos. Si Hadoop
no realiza suficientes divisiones de entrada, entonces las operaciones de escritura podran no
consumir todo el desempeo de escritura disponible en la tabla de DynamoDB.
Si la tabla de DynamoDB posee gran capacidad de desempeo para las lecturas, puede probar a
aumentar el nmero de mapeadores de una de las siguientes formas:
Aumente el tamao de los nodos del clster. Por ejemplo, si el clster utiliza m1.large nodos (tres
mapeadores por nodo), puede probar a actualizarlos a nodos m1.xlarge (ocho mapeadores por nodo).
Aumente el nmero de nodos del clster. Por ejemplo, si tiene un clster de tres nodos de tipo
m1.xlarge, dispone de un total de 24mapeadores. Si duplicara el tamao del clster, con el mismo tipo
de nodo, tendra 48mapeadores.
Puede utilizar la Consola de administracin de AWS para administrar el tamao o el nmero de nodos del
clster. Puede que tenga que reiniciar el clster para que surtan efecto estos cambios.
Puede usar el parmetro dynamodb.max.map.tasks para establecer un lmite superior para las tareas
de mapeo:
SET dynamodb.max.map.tasks=1
Este valor debe ser igual o superior a 1. Cuando Hive procese la consulta, el trabajo de Hadoop resultante
no usar ms tareas que las indicadas por dynamodb.max.map.tasks cuando realice lecturas en la
tabla de DynamoDB.
Temas adicionales
A continuacin se muestran otras maneras de ajustar las aplicaciones que utilizan Hive para obtener
acceso a DynamoDB.
SET dynamodb.retry.duration=2;
El valor debe ser un nmero entero distinto de cero que represente el nmero de minutos del intervalo de
reintento. El valor predeterminado de dynamodb.retry.duration es 2 (minutos).
Tiempo de solicitud
Programar las consultas de Hive que obtienen acceso a una tabla de DynamoDB de modo que se lleven
a cabo en aquellos momentos en que la demanda de esa tabla de DynamoDB es ms baja, mejora
el desempeo. Por ejemplo, si la mayora de los usuarios de la aplicacin viven en San Francisco,
podra elegir exportar los datos diarios a las 4.00h PST, cuando la mayora de los usuarios duerme y no
actualizan los registros de la base de datos de DynamoDB.
La posibilidad de importar y exportar datos resulta til en muchos casos. Por ejemplo, supongamos que
deseamos mantener un conjunto de referencia de los datos para realizar pruebas. Podra colocar estos
datos de referencia en una tabla de DynamoDB y exportarla a Amazon S3. A continuacin, tras ejecutar
una aplicacin que modificase los datos de prueba, podra "restablecer" el conjunto de datos importando
de nuevo los datos de referencia de Amazon S3 a la tabla de DynamoDB. Otro ejemplo podra ser la
eliminacin accidental de los datos o incluso la ejecucin por error de una operacin DeleteTable. En
estos casos, podra restaurar los datos a partir de un archivo exportado previamente a Amazon S3. Incluso
podra copiar los datos de una tabla de DynamoDB de una regin de AWS, almacenarlos en Amazon S3
y, a continuacin, importarlos de Amazon S3 a una tabla de DynamoDB idntica de otra regin. As, las
aplicaciones de la segunda regin podra obtener acceso al punto de enlace de DynamoDB ms prximo y
utilizar su propia copia de los datos, con menos latencia de red.
Para exportar una tabla de DynamoDB, se utiliza la consola de AWS Data Pipeline para crear una nueva
canalizacin. La canalizacin lanza un clster de Amazon EMR para realizar la exportacin propiamente
dicha. Amazon EMR lee los datos de DynamoDB y los escribe en un archivo de exportacin en un bucket
de Amazon S3.
El proceso es similar para la importacin, salvo que los datos se leen en el bucket de Amazon S3 y se
escriben en la tabla de DynamoDB.
Important
Al exportar o importar datos de DynamoDB se devengan costos adicionales por los servicios de
AWS subyacentes que se utilizan:
Amazon EMR: ejecuta un clster administrado de Hadoop para llevar a cabo las lecturas y
escrituras entre DynamoDB y Amazon S3. La configuracin del clster es un nodo maestro de
instancia m3.xlarge y un nodo principal de instancia m3.xlarge.
Para obtener ms informacin, consulte Precios de AWS Data Pipeline, Precios de Amazon EMR
y Precios de Amazon S3.
Tambin puede controlar el acceso creando polticas de IAM y adjuntndolas a usuarios o grupos de IAM.
Estas polticas permiten especificar qu usuarios estn autorizados para importar y exportar los datos de
DynamoDB.
Important
El usuario de IAM que lleva a cabo las importaciones y exportaciones debe tener un ID de
clave de acceso y una clave secreta de AWS activos. Para obtener ms informacin, consulte
Administering Access Keys for IAM Users en la Gua del usuario de IAM.
Si nunca haba utilizado AWS Data Pipeline, deber crear manualmente DataPipelineDefaultRole y
DataPipelineDefaultResourceRole. Una vez que haya creado estos roles, podr usarlos en cualquier
momento para exportar o importar datos de DynamoDB.
Note
Si ya haba utilizado la consola de AWS Data Pipeline para crear una canalizacin, entonces
DataPipelineDefaultRole y DataPipelineDefaultResourceRole se crearon automticamente en ese
momento. No es necesario que realice ninguna accin; puede omitir esta seccin y comenzar
a crear canalizaciones en la consola de DynamoDB. Para obtener ms informacin, consulte
Exportacin de datos de DynamoDB a Amazon S3 (p. 761) y Importacin de datos de Amazon
S3 a DynamoDB (p. 761).
Ahora que ha creado estos roles, puede comenzar a crear canalizaciones desde la consola de DynamoDB.
Para obtener ms informacin, consulte Exportacin de datos de DynamoDB a Amazon S3 (p. 761) y
Importacin de datos de Amazon S3 a DynamoDB (p. 761).
Note
Puede utilizar un procedimiento similar para adjuntar esta poltica administrada a un grupo, en
lugar de a un usuario.
Por ejemplo, supongamos que desea permitir que un usuario de IAM exporte e importe solamente las
tablas Forum, Thread y Reply. En este procedimiento se describe cmo crear una poltica personalizada
para que un usuario pueda usar estas tablas, pero no las dems.
a. Revise los valores de Policy Name y Description generados automticamente. Si lo desea, puede
modificar estos valores.
b. En el cuadro de texto Policy Document, edite la poltica para restringir el acceso a determinadas
tabla. De forma predeterminada, la poltica permite todas las acciones de DynamoDB en todas las
tablas:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"cloudwatch:DeleteAlarms",
"cloudwatch:DescribeAlarmHistory",
"cloudwatch:DescribeAlarms",
"cloudwatch:DescribeAlarmsForMetric",
"cloudwatch:GetMetricStatistics",
"cloudwatch:ListMetrics",
"cloudwatch:PutMetricAlarm",
"dynamodb:*",
"sns:CreateTopic",
"sns:DeleteTopic",
"sns:ListSubscriptions",
"sns:ListSubscriptionsByTopic",
"sns:ListTopics",
"sns:Subscribe",
"sns:Unsubscribe"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "DDBConsole"
},
"dynamodb:*",
A continuacin, construya una nueva instruccin Action que permita obtener acceso solamente
a las tablas Forum, Thread y Reply:
{
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/Forum",
"arn:aws:dynamodb:us-west-2:123456789012:table/Thread",
"arn:aws:dynamodb:us-west-2:123456789012:table/Reply"
]
},
Note
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:us-west-2:123456789012:table/Forum",
"arn:aws:dynamodb:us-west-2:123456789012:table/Thread",
"arn:aws:dynamodb:us-west-2:123456789012:table/Reply"
]
},
{
"Action": [
"cloudwatch:DeleteAlarms",
"cloudwatch:DescribeAlarmHistory",
"cloudwatch:DescribeAlarms",
"cloudwatch:DescribeAlarmsForMetric",
"cloudwatch:GetMetricStatistics",
"cloudwatch:ListMetrics",
"cloudwatch:PutMetricAlarm",
"sns:CreateTopic",
"sns:DeleteTopic",
"sns:ListSubscriptions",
"sns:ListSubscriptionsByTopic",
"sns:ListTopics",
"sns:Subscribe",
"sns:Unsubscribe"
],
"Effect": "Allow",
"Resource": "*",
"Sid": "DDBConsole"
},
6. Cuando est conforme con los ajustes de la poltica, haga clic en Create Policy.
Una vez que haya creado la poltica, puede adjuntrsela a un usuario de IAM.
1. En el panel de la consola de IAM, haga clic en Users y seleccione el usuario que desee modificar.
2. En la pestaa Permissions, haga clic en Attach Policy.
3. En el panel Attach Policy, seleccione el nombre de la poltica que desee y haga clic en Attach Policy.
Note
Si nunca haba utilizado AWS Data Pipeline, tendr que configurar dos roles de IAM antes de
seguir este procedimiento. Para obtener ms informacin, consulte Creacin de roles de IAM para
AWS Data Pipeline (p. 757).
1. Sign in to the Consola de administracin de AWS and open the AWS Data Pipeline console at https://
console.aws.amazon.com/datapipeline/.
2. Si an no dispone de ninguna canalizacin en la regin de AWS actual, elija Get started now.
El formato del URI de S3 Log Folder es el mismo que el de Output S3 Folder. El URI debe
resolverse en una carpeta; los archivos log no se pueden escribir en el nivel superior del bucket
de S3.
4. Cuando est conforme con la configuracin, haga clic en Activate.
Se crear la canalizacin; este proceso puede tardar varios minutos en completarse. Puede monitorizar el
progreso en la consola de AWS Data Pipeline.
Cuando la exportacin haya finalizado, puede ir a la consola de Amazon S3 para ver el archivo exportado.
El archivo se encontrar en una carpeta denominada igual que la tabla y su nombre tendr el formato
siguiente: YYYY-MM-DD_HH.MM. El formato interno de este archivo se describe en Verify the Data Export
File en la Gua para desarrolladores de AWS Data Pipeline.
Vamos a utilizar el trmino tabla de origen para referirnos a la tabla original desde la que se han exportado
los datos y tabla de destino para referirnos a la tabla que recibir los datos importados. Puede importar
datos de un archivo de exportacin de Amazon S3, siempre y cuando se cumplan todas las condiciones
siguientes:
La tabla de destino no tiene que estar vaca. Sin embargo, el proceso de importacin reemplazar
los elementos de datos de la tabla que tengan las mismas claves que los elementos del archivo de
exportacin. Por ejemplo, supongamos que tenemos una tabla denominada Customer con la clave
CustomerId y que la tabla solo contiene tres elementos (CustomerId 1, 2 y 3). Si el archivo de exportacin
contiene tambin elementos de datos para CustomerID 1, 2 y 3, los elementos de la tabla de destino se
sustituirn por los del archivo de exportacin. Si el archivo de exportacin contiene tambin un elemento
de datos para CustomerId 4, entonces este se agregar a la tabla.
La tabla de destino puede estar en una regin de AWS diferente. Por ejemplo, supongamos que tiene una
tabla denominada Customer en la regin EE.UU. Oeste (Oregn) y exporta sus datos a Amazon S3. Podra
importar esos datos a una tabla Customer idntica de la regin UE (Irlanda). Esto se denomina exportacin
e importacin entre regiones. Para obtener una lista de las regiones de AWS, visite Regiones y puntos de
conexin de AWS en la AWS General Reference.
Tenga en cuenta que la Consola de administracin de AWS le permite exportar varias tablas de origen a la
vez. Sin embargo, solo se pueden importar de una en una.
1. Sign in to the Consola de administracin de AWS and open the AWS Data Pipeline console at https://
console.aws.amazon.com/datapipeline/.
2. (Opcional) Si desea realizar una importacin entre regiones, vaya a la esquina superior derecha de la
ventana y elija la regin de destino.
3. Elija Create new pipeline.
4. En la pgina Create Pipeline, proceda del modo siguiente:
El formato del URI de S3 Log Folder es el mismo que el de Output S3 Folder. El URI debe
resolverse en una carpeta; los archivos log no se pueden escribir en el nivel superior del bucket
de S3.
Se crear la canalizacin; este proceso puede tardar varios minutos en completarse. El trabajo de
importacin comenzar inmediatamente despus de que se cree la canalizacin.
Solucin de problemas
En esta seccin se explican algunos modos de error bsicos y cmo solucionar problemas con las
exportaciones en DynamoDB.
Si se produce un error durante una importacin o exportacin, en la consola de AWS Data Pipeline la
canalizacin aparecer con el estado ERROR. Si esto ocurre, haga clic en el nombre de la canalizacin en
la que se ha producido el error para abrir su pgina de detalles. Aparecer informacin sobre todos los
pasos de la canalizacin y el estado de cada uno de ellos. En particular, examine todos los seguimientos
del stack de ejecucin que observe.
Por ltimo, vaya al bucket de Amazon S3 y busque los archivos log de importacin o exportacin que se
hayan escrito en l.
A continuacin se indican algunos problemas comunes que pueden provocar errores en una canalizacin,
acompaados de acciones correctivas. Para diagnosticar la canalizacin, compare los errores que ha
observado con los problemas que se indican a continuacin.
Si se trata de una importacin, asegrese de que la tabla de destino ya exista y de que esta ltima tenga
el mismo esquema de claves que la tabla de origen. Estas condiciones son imprescindibles y, si no se
cumplen, la importacin no se podr realizar.
Asegrese de que el bucket de Amazon S3 especificado se haya creado y de que dispone de permisos
de lectura y escritura para l.
La canalizacin podra haber superado su tiempo de ejecucin. Este parmetro se establece al crear la
canalizacin. Por ejemplo, es posible que haya establecido el tiempo de ejecucin en 1hora pero que
el trabajo de exportacin haya requerido ms tiempo. Pruebe a eliminar y volver a crear la canalizacin,
pero esta vez con ms tiempo de ejecucin.
Es posible que no disponga de los permisos adecuados para realizar una importacin o exportacin.
Para obtener ms informacin, consulte Requisitos previos para exportar e importar datos (p. 757).
Es posible que haya alcanzado un lmite de recursos en su cuenta de AWS, como el nmero mximo
de instancias Amazon EC2 o de canalizaciones de AWS Data Pipeline. Para obtener ms informacin,
incluso sobre cmo solicitar un aumento de estos lmites, consulte Lmites de los servicios de AWS en la
AWS General Reference.
Note
Para obtener ms informacin sobre cmo solucionar problemas en una canalizacin, visite
Troubleshooting en la Gua para desarrolladores de AWS Data Pipeline.
AWS Data Pipeline ofrece varias plantillas para crear canalizaciones; las siguientes son pertinentes para
DynamoDB.
Lmites en DynamoDB
En esta seccin se describen los lmites actuales en Amazon DynamoDB, o la ausencia de ellos en
algunos casos. Cada uno de los lmites que se enumeran a continuacin se aplica a una sola regin, a no
ser que se especifique otra cosa.
Temas
Unidades de capacidad y desempeo provisionado (p. 765)
Tablas (p. 767)
ndices secundarios (p. 767)
Claves de particin y claves de ordenacin (p. 767)
Reglas de nomenclatura (p. 768)
Tipos de datos (p. 769)
Elementos (p. 769)
Atributos (p. 770)
Parmetros de expresin (p. 770)
Flujos de DynamoDB (p. 771)
DynamoDB Accelerator (DAX) (p. 771)
Lmites especficos de API (p. 772)
Una unidad de capacidad de escritura equivale a una escritura por segundo para los elementos con un
tamao de hasta 1 KB.
Una cuenta de AWS establece algunos lmites predeterminados respecto al desempeo que se puede
aprovisionar. Estos son los lmites a menos que solicite una cantidad mayor. Para solicitar un aumento del
lmite de servicio, consulte https://aws.amazon.com/support.
Todo el desempeo disponible para la cuenta se puede aplicar a una sola tabla o a varias
tablas.
En la Consola de administracin de AWS, puede consultar cul es la capacidad provisionada actual en una
regin determinada para no aproximarse demasiado a los lmites. Si aumenta los lmites predeterminados,
puede usar la operacin DescribeLimits para consultar los valores de lmites en un momento dado.
No puede superar los lmites por cuenta al agregar capacidad provisionada. DynamoDB tampoco permite
aumentar la capacidad provisionada con gran rapidez. Aparte de estas restricciones, puede aumentar
la capacidad provisionada de las tablas tanto como lo necesite. Para obtener ms informacin sobre los
lmites por cuenta, consulte la seccin anterior Descripcin de los lmites de desempeo aprovisionados
predeterminados (p. 765).
Los lmites de reduccin de tablas e ndices secundarios globales no estn asociados, lo que
significa que los ndices secundarios globales de una determinada tabla tienen sus propios
lmites de reduccin. Sin embargo, si una solicitud reduce el desempeo de una tabla y un ndice
secundario global, se rechazar si se supera alguno de los lmites actuales. Las solicitudes no se
procesan parcialmente.
API Version 2012-08-10
766
Amazon DynamoDB Developer Guide
Tablas
Example
Una tabla con un ndice secundario global, en las primeras 4 horas de un da, puede modificarse de la
siguiente manera:
Al final de ese mismo da, el desempeo de la tabla y del ndice secundario global se podra reducir un
total de 9 veces cada uno.
Tablas
Tamao de la tabla
No existe ningn lmite prctico del tamao de una tabla. Las tablas no presentan restricciones en cuanto
al nmero de elementos o de bytes.
ndices secundarios
ndices secundarios por tabla
Puede definir un mximo de 5 lmites secundarios locales y 5 ndices secundario global lmites secundarios
globales por tabla.
Este lmite no se aplica a los ndices secundarios cuyo valor de ProjectionType sea KEYS_ONLY o ALL.
Hay una excepcin en las tablas con ndices secundarios locales. Con un local secondary index, se limita
el tamao de las colecciones de elementos: por cada valor de clave de particin diferente, los tamaos
totales de todos los elementos de la tabla y de los ndices no puede superar el tamao de 10 GB. Esto
podra restringir el nmero de claves de ordenacin por cada valor de clave de particin. Para obtener ms
informacin, consulte Lmite de tamao de una coleccin de elementos (p. 515).
Reglas de nomenclatura
Nombres de las tablas y de los ndices secundarios
Los nombres de las tablas y de los ndices secundarios deben tener 3caracteres como mnimo y 255como
mximo. Los caracteres permitidos son:
A-Z
a-z
0-9
_ (guion bajo)
- (guion)
. (punto)
Las excepciones se enumeran a continuacin. Los siguientes nombres de atributo no puede tener ms de
255caracteres:
Estos nombres de atributos deben codificarse mediante UTF-8 y el tamao total de cada nombre (despus
de la codificacin) no puede superar los 255bytes.
Tipos de datos
Cadena
La longitud de un valor de tipo String est limitada en funcin del tamao de elemento mximo de 400 KB.
Los valores de tipo String son Unicode con codificacin binaria UTF-8. Dado que UTF-8 es una
codificacin de ancho variable, DynamoDB determina los bytes UTF-8 de un valor de tipo String para
determinar su longitud.
Nmero
Un valor de tipo Number puede tener hasta 38dgitos de precisin y pueden ser positivo, negativo o cero.
DynamoDB utiliza cadenas JSON para representar los datos de tipo Number en las solicitudes y las
respuestas. Para obtener ms informacin, consulte API de bajo nivel de DynamoDB (p. 192).
Si la precisin del nmero es importante, debe pasar los nmeros a DynamoDB utilizando cadenas que se
conviertan a partir de un tipo de nmero.
Binary
La longitud de un valor de tipo Binary est limitada en funcin del tamao de elemento mximo de 400 KB.
Las aplicaciones que utilizan atributos de tipo Binary deben codificar los datos en formato Base64 antes de
envirselos a DynamoDB. Al recibirlos, DynamoDB decodifica los datos y los convierte a matrices de bytes
sin signo; a continuacin, utiliza ese resultado como longitud del atributo.
Elementos
Tamao de elemento
El tamao mximo de un elemento en DynamoDB es de 400 KB, que incluye tanto la longitud en formato
binario de los nombres de los atributos (longitud en UTF-8) y las longitudes de los valores de los atributos
(tambin en formato binario). El nombre de los atributos se tiene en cuenta al calcular el lmite de tamao.
Por ejemplo, tomemos un elemento con dos atributos: un atributo denominado "shirt-color" cuyo valor es
"R" y otro denominado "shirt-size" cuyo valor es "M". El tamao total de ese elemento es de 23bytes.
Atributos
Pares de nombre-valor de los atributos por elemento
El tamao acumulado de los atributos por elemento debe ajustarse al tamao mximo de elemento
DynamoDB (400 KB).
Parmetros de expresin
Los parmetros de expresin incluyen ProjectionExpression, ConditionExpression,
UpdateExpression y FilterExpression.
Longitudes
La longitud mxima de cualquier cadena de expresin es 4KB. Por ejemplo, el tamao de
ConditionExpression a=b es de tres bytes.
La longitud mxima de todas las variables de sustitucin de una expresin es de 2MB. Este
valor representa la suma de las longitudes de todos los ExpressionAttributeNames y
ExpressionAttributeValues.
Operadores y operandos
El nmero mximo de operadores o funciones que se admiten en una UpdateExpression es de 300. Por
ejemplo, UpdateExpression SET a = :val1 + :val2 + :val3 contiene dos operadores "+".
Palabras reservadas
DynamoDB no impide utilizar nombres que entran en conflicto con las palabras reservadas. Para ver una
lista completa, consulte Palabras reservadas en DynamoDB (p. 815).
Sin embargo, si utiliza una palabra reservada en un parmetro de expresin, tambin debe especificar
ExpressionAttributeNames. Para obtener ms informacin, consulte Nombres de atributos de
expresin (p. 356).
Flujos de DynamoDB
Lectores simultneos de un fragmento en Flujos de
DynamoDB
No permita que ms de dos procesos lean el mismo fragmento de Flujos de DynamoDB al mismo tiempo.
Si excede este lmite, puede producirse una limitacin controlada de las solicitudes.
Si requiere un aumento de la capacidad de escritura en una tabla que tiene habilitado DynamoDB Streams,
vaya a https://aws.amazon.com/support y abra un caso de aumento del lmite de servicio. Especifique que
desea aumentar el lmite de "Unidades de capacidad de escritura de tabla".
Nodos
Un clster de DAX consta exactamente de 1nodo principal y entre 0 y 9nodos de rplica de lectura.
El nmero total de nodos (por cuenta de AWS) no puede superar los 50 en una misma regin de AWS.
Grupos de parmetros
Puede crear hasta 20 grupos de parmetros de DAX por regin.
Grupos de subredes
Puede crear hasta 50 grupos de subredes de DAX por regin.
La nica excepcin se admite al crear una tabla con uno o varios ndices secundarios. Puede haber
hasta 5de las solicitudes citadas en ejecucin a la vez; no obstante, si las especificaciones de la
tabla o el ndice son complejas, DynamoDB podra reducir temporalmente el nmero de solicitudes
simultneas por debajo de 5.
BatchGetItem
En una sola operacin BatchGetItem se puede recuperar un mximo de 100 elementos. El tamao
total de todos los elementos recuperados no puede ser mayor que 16 MB.
BatchWriteItem
DescribeLimits
Solo se debe llamar a DescribeLimitsde forma peridica. Es de esperar que se produzcan errores
de limitacin controlada si se realiza la llamada ms de una vez por minuto.
Query
El conjunto de resultados de una operacin Query est limitado a 1 MB por llamada. Puede utilizar
LastEvaluatedKey de la respuesta a la consulta para recuperar ms resultados.
Scan
El conjunto de resultados de una operacin Scan est limitado a 1 MB por llamada. Puede utilizar
LastEvaluatedKey de la respuesta al examen para recuperar ms resultados.
Apndice de DynamoDB
Temas
Ejemplos de tablas y datos (p. 773)
Creacin de ejemplos de tablas y carga de datos (p. 783)
Ejemplo de aplicacin de DynamoDB con el AWS SDK para Python (Boto): tres en raya (p. 798)
Amazon DynamoDB Storage Backend for Titan (p. 815)
Palabras reservadas en DynamoDB (p. 815)
Parmetros condicionales heredados (p. 824)
Versin actual del API de bajo nivel (2012-08-10) (p. 842)
Versin anterior del API de bajo nivel (2011-12-05) (p. 842)
Id (Nmero)
Name (Cadena)
ForumName (Cadena)
Subject (Cadena)
Id (Cadena)
ReplyDateTime (Cadena)
La tabla Reply posee un ndices secundario global denominado PostedBy-Message-Index. Este ndice
facilitar las consultas de dos atributos sin clave de la tabla Reply.
PostedBy (Cadena)
Message (Cadena)
Para obtener ms informacin sobre estas tablas, consulte Caso de uso1: Catlogo de productos (p. 291)
y Caso de uso2: Aplicacin de foros (p. 292).
En las secciones siguientes se muestran los ejemplos de archivos de datos que se utilizan para cargar las
tablas ProductCatalog, Forum, Thread y Reply.
Cada archivo de datos contiene varios componentes PutRequest, cada uno de los cuales contienen
un nico elemento. Estos componentes PutRequest se utilizan como datos de entrada de la operacin
BatchWriteItem, mediante la AWS Command Line Interface (AWS CLI).
Para obtener ms informacin, consulte Paso 2: Cargar los datos en las tablas (p. 293) en Creacin de
tablas y carga de ejemplos de datos (p. 291).
"Price": {
"N": "2"
},
"Dimensions": {
"S": "8.5 x 11.0 x 0.5"
},
"PageCount": {
"N": "500"
},
"InPublication": {
"BOOL": true
},
"ProductCategory": {
"S": "Book"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "102"
},
"Title": {
"S": "Book 102 Title"
},
"ISBN": {
"S": "222-2222222222"
},
"Authors": {
"L": [
{
"S": "Author1"
},
{
"S": "Author2"
}
]
},
"Price": {
"N": "20"
},
"Dimensions": {
"S": "8.5 x 11.0 x 0.8"
},
"PageCount": {
"N": "600"
},
"InPublication": {
"BOOL": true
},
"ProductCategory": {
"S": "Book"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "103"
},
"Title": {
"S": "Book 103 Title"
},
"ISBN": {
"S": "333-3333333333"
},
"Authors": {
"L": [
{
"S": "Author1"
},
{
"S": "Author2"
}
]
},
"Price": {
"N": "2000"
},
"Dimensions": {
"S": "8.5 x 11.0 x 1.5"
},
"PageCount": {
"N": "600"
},
"InPublication": {
"BOOL": false
},
"ProductCategory": {
"S": "Book"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "201"
},
"Title": {
"S": "18-Bike-201"
},
"Description": {
"S": "201 Description"
},
"BicycleType": {
"S": "Road"
},
"Brand": {
"S": "Mountain A"
},
"Price": {
"N": "100"
},
"Color": {
"L": [
{
"S": "Red"
},
{
"S": "Black"
}
]
},
"ProductCategory": {
"S": "Bicycle"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "202"
},
"Title": {
"S": "21-Bike-202"
},
"Description": {
"S": "202 Description"
},
"BicycleType": {
"S": "Road"
},
"Brand": {
"S": "Brand-Company A"
},
"Price": {
"N": "200"
},
"Color": {
"L": [
{
"S": "Green"
},
{
"S": "Black"
}
]
},
"ProductCategory": {
"S": "Bicycle"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "203"
},
"Title": {
"S": "19-Bike-203"
},
"Description": {
"S": "203 Description"
},
"BicycleType": {
"S": "Road"
},
"Brand": {
"S": "Brand-Company B"
},
"Price": {
"N": "300"
},
"Color": {
"L": [
{
"S": "Red"
},
{
"S": "Green"
},
{
"S": "Black"
}
]
},
"ProductCategory": {
"S": "Bicycle"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "204"
},
"Title": {
"S": "18-Bike-204"
},
"Description": {
"S": "204 Description"
},
"BicycleType": {
"S": "Mountain"
},
"Brand": {
"S": "Brand-Company B"
},
"Price": {
"N": "400"
},
"Color": {
"L": [
{
"S": "Red"
}
]
},
"ProductCategory": {
"S": "Bicycle"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"N": "205"
},
"Title": {
"S": "18-Bike-204"
},
"Description": {
"S": "205 Description"
},
"BicycleType": {
"S": "Hybrid"
},
"Brand": {
"S": "Brand-Company C"
},
"Price": {
"N": "500"
},
"Color": {
"L": [
{
"S": "Red"
},
{
"S": "Black"
}
]
},
"ProductCategory": {
"S": "Bicycle"
}
}
}
}
]
}
"S": "attributes"
},
{
"S": "throughput"
}
]
}
}
}
},
{
"PutRequest": {
"Item": {
"ForumName": {
"S": "Amazon S3"
},
"Subject": {
"S": "S3 Thread 1"
},
"Message": {
"S": "S3 thread 1 message"
},
"LastPostedBy": {
"S": "User A"
},
"LastPostedDateTime": {
"S": "2015-09-29T19:58:22.514Z"
},
"Views": {
"N": "0"
},
"Replies": {
"N": "0"
},
"Answered": {
"N": "0"
},
"Tags": {
"L": [
{
"S": "largeobjects"
},
{
"S": "multipart upload"
}
]
}
}
}
}
]
}
"S": "2015-09-15T19:58:22.947Z"
},
"Message": {
"S": "DynamoDB Thread 1 Reply 1 text"
},
"PostedBy": {
"S": "User A"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"S": "Amazon DynamoDB#DynamoDB Thread 1"
},
"ReplyDateTime": {
"S": "2015-09-22T19:58:22.947Z"
},
"Message": {
"S": "DynamoDB Thread 1 Reply 2 text"
},
"PostedBy": {
"S": "User B"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"S": "Amazon DynamoDB#DynamoDB Thread 2"
},
"ReplyDateTime": {
"S": "2015-09-29T19:58:22.947Z"
},
"Message": {
"S": "DynamoDB Thread 2 Reply 1 text"
},
"PostedBy": {
"S": "User A"
}
}
}
},
{
"PutRequest": {
"Item": {
"Id": {
"S": "Amazon DynamoDB#DynamoDB Thread 2"
},
"ReplyDateTime": {
"S": "2015-10-05T19:58:22.947Z"
},
"Message": {
"S": "DynamoDB Thread 2 Reply 2 text"
},
"PostedBy": {
"S": "User A"
}
}
}
}
]
En Creacin de tablas y carga de ejemplos de datos (p. 291), primero se crean las tablas en la consola de
DynamoDB y, a continuacin, se utiliza la AWS CLI para agregar datos a esas tablas. En este apndice se
proporciona cdigo para crear las tablas y agregarles datos mediante programacin.
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.TimeZone;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.LocalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.Projection;
import com.amazonaws.services.dynamodbv2.model.ProjectionType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
try {
deleteTable(productCatalogTableName);
deleteTable(forumTableName);
deleteTable(threadTableName);
deleteTable(replyTableName);
loadSampleProducts(productCatalogTableName);
loadSampleForums(forumTableName);
loadSampleThreads(threadTableName);
loadSampleReplies(replyTableName);
}
catch (Exception e) {
System.err.println("Program failed:");
System.err.println(e.getMessage());
}
System.out.println("Success.");
}
}
catch (Exception e) {
System.err.println("DeleteTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}
try {
// key
if (sortKeyName != null) {
keySchema.add(new
KeySchemaElement().withAttributeName(sortKeyName).withKeyType(KeyType.RANGE)); // Sort
// key
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName(sortKeyName).withAttributeType(sortKeyType));
}
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName("PostedBy").withAttributeType("S"));
// key
new
KeySchemaElement().withAttributeName("PostedBy").withKeyType(KeyType.RANGE)) // Sort
// key
.withProjection(new
Projection().withProjectionType(ProjectionType.KEYS_ONLY)));
request.setLocalSecondaryIndexes(localSecondaryIndexes);
}
request.setAttributeDefinitions(attributeDefinitions);
}
catch (Exception e) {
System.err.println("CreateTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}
try {
// Add bikes.
}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
try {
}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
// Add threads.
}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.SecurityToken;
namespace com.amazonaws.codesamples
{
class CreateTablesLoadData
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
// Create tables (using the AWS SDK for .NET low-level API).
CreateTableProductCatalog();
CreateTableForum();
CreateTableThread(); // ForumTitle, Subject */
CreateTableReply();
{
// There is no such table.
}
}
});
new AttributeDefinition
{
AttributeName = "PostedBy",
AttributeType = "S"
}
},
KeySchema = new List<KeySchemaElement>()
{
new KeySchemaElement()
{
AttributeName = "Id",
KeyType = "HASH"
},
new KeySchemaElement()
{
AttributeName = "ReplyDateTime",
KeyType = "RANGE"
}
},
LocalSecondaryIndexes = new List<LocalSecondaryIndex>()
{
new LocalSecondaryIndex()
{
IndexName = "PostedBy_index",
{
TableName = tableName
});
Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
// Try-catch to handle potential eventual-consistency issue.
catch (ResourceNotFoundException)
{ }
}
}
book2["Id"] = 102;
book2["Title"] = "Book 102 Title";
book2["ISBN"] = "222-2222222222";
bicycle5["Id"] = 205;
bicycle5["Title"] = "20-Title 205";
bicycle4["Description"] = "205 description";
bicycle5["BicycleType"] = "Hybrid";
bicycle5["Brand"] = "Brand-Company C";
bicycle5["Price"] = 500;
bicycle5["Color"] = new List<string> { "Red", "Black" };
bicycle5["ProductCategory"] = "Bike";
productCatalogTable.PutItem(bicycle5);
}
forumTable.PutItem(forum1);
forumTable.PutItem(forum2);
}
// Thread 1.
var thread1 = new Document();
thread1["ForumName"] = "Amazon DynamoDB"; // Hash attribute.
thread1["Subject"] = "DynamoDB Thread 1"; // Range attribute.
thread1["Message"] = "DynamoDB thread 1 message text";
thread1["LastPostedBy"] = "User A";
thread1["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0,
0));
thread1["Views"] = 0;
thread1["Replies"] = 0;
thread1["Answered"] = false;
thread1["Tags"] = new List<string> { "index", "primarykey", "table" };
threadTable.PutItem(thread1);
// Thread 2.
var thread2 = new Document();
thread2["ForumName"] = "Amazon DynamoDB"; // Hash attribute.
thread2["Subject"] = "DynamoDB Thread 2"; // Range attribute.
thread2["Message"] = "DynamoDB thread 2 message text";
thread2["LastPostedBy"] = "User A";
thread2["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0,
0));
thread2["Views"] = 0;
thread2["Replies"] = 0;
thread2["Answered"] = false;
thread2["Tags"] = new List<string> { "index", "primarykey", "rangekey" };
threadTable.PutItem(thread2);
// Thread 3.
var thread3 = new Document();
thread3["ForumName"] = "Amazon S3"; // Hash attribute.
thread3["Subject"] = "S3 Thread 1"; // Range attribute.
thread3["Message"] = "S3 thread 3 message text";
thread3["LastPostedBy"] = "User A";
thread3["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0,
0));
thread3["Views"] = 0;
thread3["Replies"] = 0;
thread3["Answered"] = false;
thread3["Tags"] = new List<string> { "largeobjects", "multipart upload" };
threadTable.PutItem(thread3);
}
// Reply 1 - thread 1.
var thread1Reply1 = new Document();
thread1Reply1["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute.
thread1Reply1["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(21, 0,
0, 0)); // Range attribute.
thread1Reply1["Message"] = "DynamoDB Thread 1 Reply 1 text";
thread1Reply1["PostedBy"] = "User A";
replyTable.PutItem(thread1Reply1);
// Reply 2 - thread 1.
var thread1reply2 = new Document();
thread1reply2["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute.
thread1reply2["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(14, 0,
0, 0)); // Range attribute.
thread1reply2["Message"] = "DynamoDB Thread 1 Reply 2 text";
thread1reply2["PostedBy"] = "User B";
replyTable.PutItem(thread1reply2);
// Reply 3 - thread 1.
var thread1Reply3 = new Document();
thread1Reply3["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute.
thread1Reply3["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0,
0)); // Range attribute.
thread1Reply3["Message"] = "DynamoDB Thread 1 Reply 3 text";
thread1Reply3["PostedBy"] = "User B";
replyTable.PutItem(thread1Reply3);
// Reply 1 - thread 2.
var thread2Reply1 = new Document();
thread2Reply1["Id"] = "Amazon DynamoDB#DynamoDB Thread 2"; // Hash attribute.
thread2Reply1["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0,
0)); // Range attribute.
thread2Reply1["Message"] = "DynamoDB Thread 2 Reply 1 text";
thread2Reply1["PostedBy"] = "User A";
replyTable.PutItem(thread2Reply1);
// Reply 2 - thread 2.
var thread2Reply2 = new Document();
thread2Reply2["Id"] = "Amazon DynamoDB#DynamoDB Thread 2"; // Hash attribute.
thread2Reply2["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0,
0)); // Range attribute.
thread2Reply2["Message"] = "DynamoDB Thread 2 Reply 2 text";
replyTable.PutItem(thread2Reply2);
}
}
}
El juego de tres en raya (Tic-Tac-Toe) es un ejemplo de aplicacin web creada en Amazon DynamoDB. La
aplicacin utiliza el AWS SDK para Python (Boto) para llevar a cabo las llamadas a DynamoDB necesarias
para almacenar los datos de las partidas en una tabla de DynamoDB, y el marco web de Python, Flask,
para ilustrar el desarrollo ntegro de la aplicacin en DynamoDB, lo que incluye cmo se modelan los
datos. Adems, en el ejemplo se muestran las prcticas recomendadas en lo que respecta al modelado
de datos en DynamoDB; esto incluye la tabla que se crea para la aplicacin del juego, la clave principal
que se define, los ndices adicionales que se necesitan segn los requisitos de las consultas y el uso de
atributos de valores concatenados.
Hasta que otro usuario acepta la invitacin, el estado de la partida es PENDING. Una vez que un
contrincante ha aceptado la invitacin, el estado de la partida cambia a IN_PROGRESS.
3. La partida comienza una vez que su contrincante ha iniciado sesin y aceptado la invitacin.
4. La aplicacin almacena todas las jugadas de las partidas y la informacin de estado en una tabla de
DynamoDB.
5. La partida termina cuando un jugador gana o si se produce un empate, en cuyo caso se establece el
estado de la partida en FINISHED.
Paso 1: Implementar y probar localmente (p. 799): en esta seccin, se descarga, implementa y prueba
la aplicacin en el equipo local. Las tablas requeridas se crean en la versin descargable de DynamoDB.
Paso2: Examinar el modelo de datos y los detalles de implementacin (p. 802): en esta seccin se
describe primero con detalle el modelo de datos, incluidos los ndices y el uso del atributo de valores
concatenados. A continuacin, se explica el funcionamiento de la aplicacin.
Paso3: Implementar en produccin mediante el servicio de DynamoDB (p. 809): esta seccin se
centra en las consideraciones de implementacin en un entorno de produccin. En este paso, se crea
una tabla mediante el servicio Amazon DynamoDB y se implementa la aplicacin con AWS Elastic
Beanstalk. Cuando la aplicacin se encuentra en produccin, se conceden adems los permisos
adecuados para que la aplicacin pueda obtener acceso a la tabla de DynamoDB. Las instrucciones de
esta seccin le guiarn a lo largo de todo el proceso de implementacin en produccin.
Paso4: Eliminar recursos (p. 815): en esta seccin se resaltan las reas que no se abordan en este
ejemplo. Adems, la seccin proporciona los pasos que deben seguirse para eliminar los recursos de
AWS que se han creado en los pasos anteriores, con el fin de evitar que se le cobre algn importe.
En este paso se descarga, implementa y prueba la aplicacin del juego de tres en raya en el equipo local.
En lugar de utilizar el servicio web de Amazon DynamoDB, descargue DynamoDB en su equipo y cree en
l la tabla requerida.
Python
Flask (un micromarco de trabajo para Python)
El AWS SDK para Python (Boto)
DynamoDB en ejecucin en su equipo
Git
1. Instalacin de Python. Para obtener instrucciones paso a paso, vaya a Download Python.
Para obtener instrucciones, visite Install PIP. En la pgina de instalacin, seleccione el enlace get-
pip.py y, a continuacin, guarde el archivo. Despus, abra un terminal como administrador y escriba lo
siguiente en el smbolo del sistema:
python.exe get-pip.py
3. Descargue DynamoDB en su equipo. Para obtener instrucciones sobre cmo ejecutarlo, consulte
Configuracin de la versin de DynamoDB local (descargable) (p. 44).
4. Descargue la aplicacin Tic-Tac-Toe:
a. Instale Git. Para obtener instrucciones, visite git Downloads.
b. Ejecute el siguiente cdigo para descargar la aplicacin:
API Version 2012-08-10
799
Amazon DynamoDB Developer Guide
Paso 1: Implementar y probar localmente
1. Inicie DynamoDB.
2. Inicie el servidor web de la aplicacin Tic-Tac-Toe.
Para ello, abra un terminal de comandos, navegue a la carpeta en la que ha descargado la aplicacin
Tic-Tac-Toe y ejecute la aplicacin localmente utilizando el cdigo siguiente:
http://localhost:5000/
http://localhost:5000/
El navegador transmite informacin a travs de las cookies, por lo que ha de utilizar el modo de
incgnito o la navegacin privada para que las cookies no se conserven.
9. Inicie sesin como user2.
Aparecer la pgina de la partida con una cuadrcula de tres en raya vaca. En la pgina se muestra
tambin informacin pertinente sobre la partida, como el Id. de la partida, a quin le toca jugar y el
estado de la partida.
11. Juegue la partida.
Cada vez que un usuario mueve ficha, el servicio web enva una solicitud a DynamoDB para actualizar de
forma condicional el elemento de la partida en la tabla Games. Por ejemplo, las condiciones garantizan que
el movimiento haya sido vlido, que la casilla elegida por el usuario est disponible o que le tocaba jugar
al usuario que movi la ficha. Para cada jugada vlida, la operacin de actualizacin agrega un nuevo
atributo correspondiente a la casilla seleccionada en el tablero. La operacin de actualizacin tambin
establece el valor del atributo existente en el usuario que puede llevar a cabo la siguiente jugada.
En la pgina de la partida, la aplicacin realiza llamadas asncronas a JavaScript cada segundo durante
un mximo de cinco minutos, para comprobar si el estado de la partida en DynamoDB ha cambiado. En
caso afirmativo, la aplicacin actualiza la pgina con la nueva informacin. Despus de cinco minutos, la
aplicacin deja de realizar las solicitudes y tendr que actualizar la pgina si desea obtener informacin
actualizada.
Tabla: en DynamoDB, una tabla es una coleccin de elementos (es decir, de registros) y cada elemento
es una coleccin de pares de nombre-valor denominados atributos.
En este ejemplo del juego de tres en raya, la aplicacin almacena todos los datos de las partidas en
una tabla, Games. La aplicacin crea un elemento en la tabla por cada partida y almacena todos los
datos de las partidas como atributos. Una partida de tres en raya puede incluir hasta nueve jugadas
o movimientos. Dado que las tablas de DynamoDB no tienen un esquema cuando el nico atributo
obligatorio es la clave principal, la aplicacin puede almacenar un nmero variable de atributos por cada
elemento de partida.
La tabla Games posee una clave principal simple que consta de un solo atributo, GameId, de tipo String.
La aplicacin asigna identificador exclusivo a cada partida. Para obtener ms informacin sobre claves
principales en DynamoDB, consulte Clave principal (p. 6).
Cuando un usuario inicia una partida de tres en raya invitando a otro usuario a jugar, la aplicacin crea
un nuevo elemento en la tabla Games con atributos que almacenan los metadatos de la partida, tales
como los siguientes:
HostId, usuario que inici la partida.
Opponent, usuario al que se invit a jugar.
Usuario al que le toca jugar. El usuario que inicia la partida juega primero.
El usuario que utiliza el smbolo O en el tablero. El usuario que inicia las partidas utiliza el smbolo O.
Adems, la aplicacin crea un atributo StatusDate concatenado que marca el estado inicial de la
partida como PENDING. En la siguiente captura de pantalla se muestra un ejemplo de elemento tal y
como aparece en la consola de DynamoDB:
A medida que la partida avanza, la aplicacin agrega un atributo a la tabla por cada jugada. El nombre
del atributo es la posicin en el tablero; por ejemplo, TopLeft o BottomRight. Por ejemplo, una
jugada puede tener el atributo TopLeft con el valor O, un atributo TopRight con el valor O y un atributo
BottomRight con el valor X. El valor del atributo puede ser O o X, segn cul sea el usuario que ha
realizado la jugada. Por ejemplo, fjese en el tablero siguiente:
HostId-StatusDate-index. Este ndice tiene HostId como clave de particin y StatusDate como
clave de ordenacin. Puede utilizar este ndice para realizar una consulta sobre HostId, por ejemplo,
para encontrar las partidas organizadas por un usuario concreto.
Estos ndices se denominan ndices secundarios globales porque su clave de particin no es la misma
(GameId) que se us en la clave principal de la tabla.
Tenga en cuenta que en los dos ndices se especifica StatusDate como clave de ordenacin. Al
hacerlo, se habilita lo siguiente:
Puede realizar consultas utilizando el operador de comparacin BEGINS_WITH. Por ejemplo, puede
buscar todas las partidas que tienen el atributo IN_PROGRESS y que ha organizado un usuario
determinado. En este caso, el operador BEGINS_WITH comprueba los valores de StatusDate que
comienzan por IN_PROGRESS.
DynamoDB almacena los elementos en el ndice de forma secuencial, segn el valor de la clave
de ordenacin. As pues, si todos los prefijos de estado son iguales (por ejemplo, IN_PROGRESS),
el formato ISO utilizado para la parte de la fecha har que los elementos se ordenen por orden de
antigedad descendente. Este enfoque permite realizar con eficacia algunas consultas, tales como las
siguientes:
Recuperar como mximo las diez partidas IN_PROGRESS ms recientes organizadas por el usuario
que ha iniciado sesin. Para esta consulta, se especifica el ndice HostId-StatusDate-index.
Recuperar como mximo las diez partidas IN_PROGRESS ms recientes en las que el usuario que
ha iniciado sesin sea el contrincante. Para esta consulta, se especifica el ndice OpponentId-
StatusDate-index.
Para obtener ms informacin acerca de los ndices secundarios, consulte Uso de ndices secundarios
para mejorar el acceso a los datos (p. 463).
Pgina de inicio: en esta pgina se proporciona al usuario un inicio de sesin sencillo, un botn CREATE
para crear una nueva partida de tres en raya, una lista de partidas en curso, el historial de partidas y
todas las invitaciones pendientes para jugar.
Pgina de inicio
Cuando el usuario inicia sesin, la aplicacin muestra las tres listas de informacin siguientes:
Pending invitations: esta lista muestra como mximo las diez invitaciones ms recientes de otros
usuarios que el usuario que ha iniciado sesin todava no ha aceptado. En la captura de pantalla
anterior, el usuario user1 tiene invitaciones pendientes de los usuarios user2 y user5.
Games In-Progress: esta lista muestra como mximo las diez partidas ms recientes que estn en curso.
Se trata de partidas en las que el usuario est jugando activamente y cuyo estado es IN_PROGRESS. En
la captura de pantalla, el usuario user1 est jugando activamente una partida de tres en raya contra los
usuarios user3 y user4.
Recent History: esta lista muestra como mximo las diez partidas ms recientes que el usuario ha
terminado, cuyo estado es FINISHED. En el juego que aparece en la captura de pantalla, el usuario
user1 ha jugado anteriormente contra el usuario user2. En la lista se muestra el resultado de cada
partida completada.
En el cdigo, la funcin index (en application.py) realiza las tres llamadas siguientes para recuperar
la informacin de estado de las partidas:
inviteGames = controller.getGameInvites(session["username"])
inProgressGames = controller.getGamesWithStatus(session["username"], "IN_PROGRESS")
finishedGames = controller.getGamesWithStatus(session["username"], "FINISHED")
Cada una de estas llamadas devuelve una lista de elementos de DynamoDB que estn integrados en los
objetos Game. Resulta fcil extraer datos de estos objetos en la vista. La funcin de ndice transmite estas
listas de objetos a la vista para representar el cdigo HTML.
return render_template("index.html",
user=session["username"],
invites=inviteGames,
inprogress=inProgressGames,
finished=finishedGames)
La aplicacin del juego de tres en raya define la clase Game principalmente para almacenar los datos de
las partidas recuperados de DynamoDB. Estas funciones devuelven listas de objetos Game que permiten
aislar el resto de la aplicacin del cdigo relacionado con los elementos de Amazon DynamoDB. Por
lo tanto, estas funciones le ayudan a desacoplar el cdigo de aplicacin de los detalles de la capa de
almacenamiento de datos.
El patrn de arquitectura descrito aqu tambin se denomina patrn de interfaz de usuario (IU) de
tipo modelo-vista-controlador (MVC). En este caso, las instancias de objetos Game (que representan
datos) son el modelo y la pgina HTML es la vista. El controlador se divide en dos archivos. El archivo
application.py contiene la lgica del controlador correspondiente al marco de trabajo Flask, mientras
que la lgica empresarial se asla en el archivo gameController.py. Es decir, la aplicacin guarda
todo lo que se refiere al SDK de DynamoDB en su propio archivo independiente dentro de la carpeta
dynamodb.
Vamos a revisar las tres funciones para entender cmo consultan la tabla Games y utilizan ndices
secundarios globales para recuperar los datos pertinentes.
La funcin getGameInvites recupera la lista de las diez invitaciones pendientes ms recientes. Hay
usuarios que han creado estas partidas, pero los contrincantes no han aceptado las invitaciones para
jugar. En estas partidas, el estado sigue siendo PENDING hasta que el contrincante acepta la invitacin. Si
el contrincante rechaza la invitacin, la aplicacin eliminar el elemento correspondiente de la tabla.
Especifica el ndice OpponentId-StatusDate-index que se debe usar con los siguientes valores de
clave de ndice y operadores de comparacin:
La clave de particin es OpponentId y acepta la clave de ndice user ID.
La clave de ordenacin es StatusDate y acepta el operador de comparacin y el valor de clave de
ndice beginswith="PENDING_".
gameInvitesIndex = self.cm.getGamesTable().query(
Opponent__eq=user,
StatusDate__beginswith="PENDING_",
index="OpponentId-StatusDate-index",
limit=10)
En el ndice, por cada OpponentId (clave de particin) DynamoDB ordena los elementos segn
StatusDate (clave de ordenacin). Por lo tanto, las partidas que devuelve la consulta son las diez ms
recientes.
Una vez que un contrincante ha aceptado una invitacin a jugar, el estado de la partida cambia a
IN_PROGRESS. Cuando la partida finaliza, el estado cambia a FINISHED.
Las consultas para buscar las partidas que se encuentran en curso o que ya han finalizado son
iguales salvo por el valor de estado, que vara. Por consiguiente, la aplicacin define la funcin
getGamesWithStatus, que acepta el valor de estado como parmetro.
En la seccin siguiente se explican las partidas en curso, pero la misma descripcin es aplicable tambin a
las partidas finalizadas.
Una lista de partidas en curso de un usuario determinado incluye los dos tipos siguientes:
La funcin getGamesWithStatus ejecuta las dos consultas siguientes, utilizando en cada caso el ndice
secundario apropiado.
oppGamesInProgress = self.cm.getGamesTable().query(Opponent__eq=user,
StatusDate__beginswith=status,
index="OpponentId-StatusDate-index",
limit=10)
A continuacin, la funcin combina ambas listas, las ordena, crea una lista de entre 0 y 10elementos
que contiene los primeros objetos Game y se la devuelve a la funcin de llamada (es decir, al ndice).
games = self.mergeQueries(hostGamesInProgress,
oppGamesInProgress)
return games
Pgina de la partida
La pgina de la partida es donde el usuario juega las partidas de tres en raya. Muestra la cuadrcula del
juego, adems de la informacin pertinente sobre el juego. En la siguiente captura de pantalla se muestra
un ejemplo de partida en curso:
En este caso, la pgina muestra al usuario como anfitrin y el estado de la partida PENDING, mientras
espera a que el contrincante acepte.
Cuando el usuario ha aceptado una de las invitaciones pendientes de la pgina de inicio.
API Version 2012-08-10
807
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin
En este caso, la pgina muestra al usuario como contrincante y el estado de la partida IN_PROGRESS.
Cuando el usuario selecciona una opcin en el tablero, se genera una solicitud POST de formulario
a la aplicacin. Es decir, Flask llama a la funcin selectSquare (en application.py) con los
datos del formulario HTML. Esta funcin, a su vez, llama a la funcin updateBoardAndTurn (en
gameController.py) para actualizar el elemento de partida como se indica a continuacin:
La funcin devuelve true si el elemento se actualiz correctamente; en caso contrario, devuelve false.
Tenga en cuenta lo siguiente en relacin con la funcin updateBoardAndTurn:
La funcin llama a la funcin update_item del AWS SDK para Python con el fin de realizar un conjunto
de actualizaciones finitas de un elemento existente. La funcin se mapea a la operacin UpdateItem en
DynamoDB. Para obtener ms informacin, consulte UpdateItem.
Note
Nuevo atributo que se va a agregar, especfico de la jugada del usuario actual, y su valor (por ejemplo,
TopLeft="X").
attributeUpdates = {
position : {
"Action" : "PUT",
"Value" : { "S" : representation }
}
}
self.cm.db.update_item("Games", key=key,
attribute_updates=attributeUpdates,
expected=expectations)
Una vez que la funcin devuelva el resultado, la funcin selectSquare llama a "redirect" como se indica
en el ejemplo siguiente:
redirect("/game="+gameId)
Esta llamada hace que el navegador se actualice. Durante esta actualizacin, la aplicacin comprueba si la
partida ha terminado con un ganador o en empate. En caso afirmativo, la aplicacin actualiza el elemento
de partida en consecuencia.
Implemente la aplicacin con Elastic Beanstalk, un servicio fcil de utilizar para implementar y escalar
servicios y aplicaciones web. Para obtener ms informacin, visite Deploying a Flask Application to
AWS Elastic Beanstalk.
Elastic Beanstalk lanzar una o varias instancias Amazon Elastic Compute Cloud (Amazon EC2), que se
configuran a travs de Elastic Beanstalk, en las que se ejecutar la aplicacin Tic-Tac-Toe.
Con el servicio de Amazon DynamoDB, cree una tabla Games que existe en AWS, en lugar de
localmente en el equipo.
Adems, tendr que configurar los permisos. Todos los recursos de AWS que se crean, tales como la tabla
Games en DynamoDB, son privados de forma predeterminada. Solo el propietario del recurso, es decir, la
cuenta de AWS que ha creado la tabla Games, puede obtener acceso a esta tabla. Por lo tanto, de forma
predeterminada la aplicacin Tic-Tac-Toe no puede actualizar la tabla Games.
Para conceder los permisos necesarios, vamos a crear un rol de AWS Identity and Access Management
(IAM) y a conceder a este rol permisos para obtener acceso a la tabla Games. Primero, la instancia
Amazon EC2 asume esta funcin. En respuesta, AWS devuelve credenciales de seguridad temporales
que la instancia Amazon EC2 puede utilizar para actualizar la tabla Games en nombre de la aplicacin Tic-
Tac-Toe. Al configurar su aplicacin en Elastic Beanstalk, debe especificar el rol de IAM que la instancia o
instancias Amazon EC2 pueden asumir. Para obtener ms informacin acerca de los roles de IAM, vaya a
IAM Roles for Amazon EC2 en la Gua del usuario de Amazon EC2 para instancias de Linux.
Note
Antes de crear instancias Amazon EC2 para la aplicacin Tic-Tac-Toe, primero debe decidir en
qu regin de AWS desea que Elastic Beanstalk las cree. Despus de crear la aplicacin de
Elastic Beanstalk, se proporciona los mismos nombre de regin y punto de enlace en un archivo
de configuracin. La aplicacin Tic-Tac-Toe utiliza la informacin de este archivo para crear
la tabla Games y enviar las solicitudes subsiguientes en una regin de AWS especfica. Tanto
la tabla Games de DynamoDB como las instancias Amazon EC2 que Elastic Beanstalk lanza
deben estar en la misma regin de AWS. Para ver una lista de regiones disponible, visite Amazon
DynamoDB en la Referencia general de Amazon Web Services.
1. Cree un rol de IAM mediante el servicio AWS IAM. Es preciso adjuntar una poltica a este rol que
conceda permisos para realizar las acciones de DynamoDB que se requieren para obtener acceso a la
tabla Games.
2. Empaquete el cdigo de la aplicacin Tic-Tac-Toe y un archivo de configuracin y cree un archivo .zip.
Este archivo .zip se utiliza para proporcionar el cdigo de la aplicacin Tic-Tac-Toe a Elastic Beanstalk
y ponerlo en sus servidores. Para obtener ms informacin sobre cmo crear un paquete, visite Creating
an Application Source Bundle en la Gua para desarrolladores de AWS Elastic Beanstalk.
{
"Version":"2012-10-17",
"Statement":[
{
"Action":[
"dynamodb:ListTables"
],
"Effect":"Allow",
"Resource":"*"
},
{
"Action":[
"dynamodb:*"
],
"Effect":"Allow",
"Resource":[
"arn:aws:dynamodb:us-west-2:922852403271:table/Games",
"arn:aws:dynamodb:us-west-2:922852403271:table/Games/index/*"
]
}
]
}
Para obtener ms instrucciones, consulte Creacin de un rol para un servicio de AWS (consola de
administracin de AWS) en la Gua del usuario de IAM.
Despus de extraer los archivos, observe que se ha creado la carpeta code. Para proporcionar esta
carpeta a Electric Beanstalk, debe empaquetar su contenido en un archivo .zip. En primer lugar, debe
agregar un archivo de configuracin a esa carpeta. La aplicacin utilizar la informacin sobre la regin y el
punto de enlace para crear una tabla de DynamoDB en la regin especificada y para realizar las solicitudes
de operaciones subsiguientes a la tabla utilizando el punto de enlace indicado.
[dynamodb]
region=<AWS region>
endpoint=<DynamoDB endpoint>
[dynamodb]
region=us-west-2
endpoint=dynamodb.us-west-2.amazonaws.com
Para obtener una lista de regiones disponibles, visite Amazon DynamoDB en la Referencia general de
Amazon Web Services.
Important
Al crear la aplicacin de Elastic Beanstalk, solicitaremos que se lance un entorno cuyo tipo
sea posible elegir. Para probar la aplicacin Tic-Tac-Toe del ejemplo, puede elegir el tipo de
entorno Single Instance, omitir el resto e ir al paso siguiente.
No obstante, tenga en cuenta que el tipo de entorno Load balancing, autoscaling proporciona
un entorno altamente disponible y escalable, algo que debe tener en cuenta al crear e
implementar otras aplicaciones. Si elige este tipo de entorno, tambin deber generar un
UUID y agregrselo al archivo de configuracin, tal y como se muestra a continuacin:
API Version 2012-08-10
811
Amazon DynamoDB Developer Guide
Paso3: Implementar en produccin
[dynamodb]
region=us-west-2
endpoint=dynamodb.us-west-2.amazonaws.com
[flask]
secret_key= 284e784d-1a25-4a19-92bf-8eeb7a9example
Para obtener instrucciones sobre cmo efectuar una carga en un bucket de Amazon S3, consulte los
temas Crear un depsito y Aadir un objeto a un depsito en la Gua de introduccin a Amazon Simple
Storage Service.
1. Escriba la siguiente URL personalizada con el fin de configurar una consola de Elastic Beanstalk para
configurar el entorno:
https://console.aws.amazon.com/elasticbeanstalk/?region=<AWS-Region>#/newApplication
?applicationName=TicTacToeyour-name
&solutionStackName=Python
&sourceBundleUrl=https://s3.amazonaws.com/<bucket-name>/TicTacToe.zip
&environmentType=SingleInstance
&instanceType=t1.micro
Para obtener ms informacin sobre las direcciones URL personalizadas, visite Constructing a Launch
Now URL en la AWS Elastic Beanstalk Developer Guide. Para la URL, tenga en cuenta lo siguiente:
Debe proporcionar el nombre de una regin de AWS (el mismo que ha facilitado en el archivo de
configuracin), un bucket de Amazon S3 y el nombre de objeto.
Para las pruebas, la URL solicita el tipo de entorno SingleInstance y t1.micro como tipo de instancia.
El nombre de la aplicacin debe ser nico. As pues, en la URL anterior, sugerimos que anteponga
su propio nombre a applicationName.
Al hacerlo, se abre la consola de Elastic Beanstalk. En algunos casos, es posible que deba iniciar
sesin.
2. En la consola de Elastic Beanstalk, elija Review and Launch y, a continuacin, elija Launch.
3. Anote la URL para futuras consultas. Esta URL abre la pgina de inicio de la aplicacin Tic-Tac-Toe.
4. Configure la aplicacin Tic-Tac-Toe de modo que conozca la ubicacin del archivo de configuracin.
Una vez que Elastic Beanstalk haya creado la aplicacin, elija Configuration.
a. Elija el engranaje que aparece junto a Software Configuration, como se muestra en la captura de
pantalla siguiente.
http://<pen-name>.elasticbeanstalk.com
6. Inicie sesin como testuser1 y elija CREATE para comenzar una nueva partida de tres en raya.
7. Escriba testuser2 en el cuadro Choose an Opponent.
Asegrese de borrar todas las cookies en la ventana del navegador para no iniciar sesin con el
mismo nombre de usuario.
9. Escriba la misma URL para abrir la pgina de inicio de la aplicacin, tal y como se muestra en el
ejemplo siguiente:
http://<env-name>.elasticbeanstalk.com
Pueden jugar la partida los usuarios testuser1 y testuser2. La aplicacin guardar cada jugada en el
elemento correspondiente de la tabla Games.
Si ha terminado de realizar pruebas, puede eliminar los recursos que ha creado para probar la aplicacin
Tic-Tac-Toe, con el fin de evitar que se le cobre algn importe.
Para obtener instrucciones actualizadas sobre DynamoDB Storage Backend para JanusGraph, consulte el
archivo README.md.
Si tiene que escribir alguna expresin que contenga un nombre de atributo que entre en conflicto con
una palabra reservada de DynamoDB, puede definir un nombre de atributo de expresin para usarlo
en lugar de la palabra reservada. Para obtener ms informacin, consulte Nombres de atributos de
expresin (p. 356).
ABORT
ABSOLUTE
ACTION
ADD
AFTER
AGENT
AGGREGATE
ALL
ALLOCATE
ALTER
ANALYZE
AND
ANY
ARCHIVE
ARE
ARRAY
AS
ASC
ASCII
ASENSITIVE
ASSERTION
ASYMMETRIC
AT
ATOMIC
ATTACH
ATTRIBUTE
AUTH
AUTHORIZATION
AUTHORIZE
AUTO
AVG
BACK
BACKUP
BASE
BATCH
BEFORE
BEGIN
BETWEEN
BIGINT
BINARY
BIT
BLOB
BLOCK
BOOLEAN
BOTH
BREADTH
BUCKET
BULK
BY
BYTE
CALL
CALLED
CALLING
CAPACITY
CASCADE
CASCADED
CASE
CAST
CATALOG
CHAR
CHARACTER
CHECK
CLASS
CLOB
CLOSE
CLUSTER
CLUSTERED
CLUSTERING
CLUSTERS
COALESCE
COLLATE
COLLATION
COLLECTION
COLUMN
COLUMNS
COMBINE
COMMENT
COMMIT
COMPACT
COMPILE
COMPRESS
CONDITION
CONFLICT
CONNECT
CONNECTION
CONSISTENCY
CONSISTENT
CONSTRAINT
CONSTRAINTS
CONSTRUCTOR
CONSUMED
CONTINUE
CONVERT
COPY
CORRESPONDING
COUNT
COUNTER
CREATE
CROSS
CUBE
CURRENT
CURSOR
CYCLE
DATA
DATABASE
DATE
DATETIME
DAY
DEALLOCATE
DEC
DECIMAL
DECLARE
DEFAULT
DEFERRABLE
DEFERRED
DEFINE
DEFINED
DEFINITION
DELETE
DELIMITED
DEPTH
DEREF
DESC
DESCRIBE
DESCRIPTOR
DETACH
DETERMINISTIC
DIAGNOSTICS
DIRECTORIES
DISABLE
DISCONNECT
DISTINCT
DISTRIBUTE
DO
DOMAIN
DOUBLE
DROP
DUMP
DURATION
DYNAMIC
EACH
ELEMENT
ELSE
ELSEIF
EMPTY
ENABLE
END
EQUAL
EQUALS
ERROR
ESCAPE
ESCAPED
EVAL
EVALUATE
EXCEEDED
EXCEPT
EXCEPTION
EXCEPTIONS
EXCLUSIVE
EXEC
EXECUTE
EXISTS
EXIT
EXPLAIN
EXPLODE
EXPORT
EXPRESSION
EXTENDED
EXTERNAL
EXTRACT
FAIL
FALSE
FAMILY
FETCH
FIELDS
FILE
FILTER
FILTERING
FINAL
FINISH
FIRST
FIXED
FLATTERN
FLOAT
FOR
FORCE
FOREIGN
FORMAT
FORWARD
FOUND
FREE
FROM
FULL
FUNCTION
FUNCTIONS
GENERAL
GENERATE
GET
GLOB
GLOBAL
GO
GOTO
GRANT
GREATER
GROUP
GROUPING
HANDLER
HASH
HAVE
HAVING
HEAP
HIDDEN
HOLD
HOUR
IDENTIFIED
IDENTITY
IF
IGNORE
IMMEDIATE
IMPORT
IN
INCLUDING
INCLUSIVE
INCREMENT
INCREMENTAL
INDEX
INDEXED
INDEXES
INDICATOR
INFINITE
INITIALLY
INLINE
INNER
INNTER
INOUT
INPUT
INSENSITIVE
INSERT
INSTEAD
INT
INTEGER
INTERSECT
INTERVAL
INTO
INVALIDATE
IS
ISOLATION
ITEM
ITEMS
ITERATE
JOIN
KEY
KEYS
LAG
LANGUAGE
LARGE
LAST
LATERAL
LEAD
LEADING
LEAVE
LEFT
LENGTH
LESS
LEVEL
LIKE
LIMIT
LIMITED
LINES
LIST
LOAD
LOCAL
LOCALTIME
LOCALTIMESTAMP
LOCATION
LOCATOR
LOCK
LOCKS
LOG
LOGED
LONG
LOOP
LOWER
MAP
MATCH
MATERIALIZED
MAX
MAXLEN
MEMBER
MERGE
METHOD
METRICS
MIN
MINUS
MINUTE
MISSING
MOD
MODE
MODIFIES
MODIFY
MODULE
MONTH
MULTI
MULTISET
NAME
NAMES
NATIONAL
NATURAL
NCHAR
NCLOB
NEW
NEXT
NO
NONE
NOT
NULL
NULLIF
NUMBER
NUMERIC
OBJECT
OF
OFFLINE
OFFSET
OLD
ON
ONLINE
ONLY
OPAQUE
OPEN
OPERATOR
OPTION
OR
ORDER
ORDINALITY
OTHER
OTHERS
OUT
OUTER
OUTPUT
OVER
OVERLAPS
OVERRIDE
OWNER
PAD
PARALLEL
PARAMETER
PARAMETERS
PARTIAL
PARTITION
PARTITIONED
PARTITIONS
PATH
PERCENT
PERCENTILE
PERMISSION
PERMISSIONS
PIPE
PIPELINED
PLAN
POOL
POSITION
PRECISION
PREPARE
PRESERVE
PRIMARY
PRIOR
PRIVATE
PRIVILEGES
PROCEDURE
PROCESSED
PROJECT
PROJECTION
PROPERTY
PROVISIONING
PUBLIC
PUT
QUERY
QUIT
QUORUM
RAISE
RANDOM
RANGE
RANK
RAW
READ
READS
REAL
REBUILD
RECORD
RECURSIVE
REDUCE
REF
REFERENCE
REFERENCES
REFERENCING
REGEXP
REGION
REINDEX
RELATIVE
RELEASE
REMAINDER
RENAME
REPEAT
REPLACE
REQUEST
RESET
RESIGNAL
RESOURCE
RESPONSE
RESTORE
RESTRICT
RESULT
RETURN
RETURNING
RETURNS
REVERSE
REVOKE
RIGHT
ROLE
ROLES
ROLLBACK
ROLLUP
ROUTINE
ROW
ROWS
RULE
RULES
SAMPLE
SATISFIES
SAVE
SAVEPOINT
SCAN
SCHEMA
SCOPE
SCROLL
SEARCH
SECOND
SECTION
SEGMENT
SEGMENTS
SELECT
SELF
SEMI
SENSITIVE
SEPARATE
SEQUENCE
SERIALIZABLE
SESSION
SET
SETS
SHARD
SHARE
SHARED
SHORT
SHOW
SIGNAL
SIMILAR
SIZE
SKEWED
SMALLINT
SNAPSHOT
SOME
SOURCE
SPACE
SPACES
SPARSE
SPECIFIC
SPECIFICTYPE
SPLIT
SQL
SQLCODE
SQLERROR
SQLEXCEPTION
SQLSTATE
SQLWARNING
START
STATE
STATIC
STATUS
STORAGE
STORE
STORED
STREAM
STRING
STRUCT
STYLE
SUB
SUBMULTISET
SUBPARTITION
SUBSTRING
SUBTYPE
SUM
SUPER
SYMMETRIC
SYNONYM
SYSTEM
TABLE
TABLESAMPLE
TEMP
TEMPORARY
TERMINATED
TEXT
THAN
THEN
THROUGHPUT
TIME
TIMESTAMP
TIMEZONE
TINYINT
TO
TOKEN
TOTAL
TOUCH
TRAILING
TRANSACTION
TRANSFORM
TRANSLATE
TRANSLATION
TREAT
TRIGGER
TRIM
TRUE
TRUNCATE
TTL
TUPLE
TYPE
UNDER
UNDO
UNION
UNIQUE
UNIT
UNKNOWN
UNLOGGED
UNNEST
UNPROCESSED
UNSIGNED
UNTIL
UPDATE
UPPER
URL
USAGE
USE
USER
USERS
USING
UUID
VACUUM
VALUE
VALUED
VALUES
VARCHAR
VARIABLE
VARIANCE
VARINT
VARYING
VIEW
VIEWS
VIRTUAL
VOID
WAIT
WHEN
WHENEVER
WHERE
WHILE
WINDOW
WITH
WITHIN
WITHOUT
WORK
WRAPPED
WRITE
YEAR
ZONE
Con la introduccin de los parmetros de expresin (consulte Uso de expresiones en DynamoDB (p. 352)),
varios parmetros anteriores se han quedado obsoletos. En las nuevas aplicaciones no se deben utilizar
estos parmetros heredados, sino los parmetros de expresin. (Para obtener ms informacin, consulte
Uso de expresiones en DynamoDB (p. 352).)
Note
En la siguiente tabla se muestran los API de DynamoDB que todava admiten estos parmetros heredados,
as como los parmetros de expresin que deben utilizarse en su lugar. Esta tabla puede resultarle til si
va a actualizar las aplicaciones de tal forma que utilicen parmetros de expresin a partir de ahora.
KeyConditions KeyConditionExpression
QueryFilter FilterExpression
ScanFilter FilterExpression
Expected ConditionExpression
Temas
AttributesToGet (p. 825)
AttributeUpdates (p. 826)
ConditionalOperator (p. 828)
Expected (p. 828)
KeyConditions (p. 832)
QueryFilter (p. 833)
ScanFilter (p. 835)
Escritura de condiciones con parmetros heredados (p. 836)
AttributesToGet
AttributesToGet es una matriz de uno o varios atributos que se recuperan de DynamoDB. Si no se
proporcionan sus nombres, se devuelven todos los atributos. Si cualquiera de los atributos solicitados no
se encuentra, no aparecer en el resultado.
AttributesToGet permite recuperar atributos de tipo List o Map; sin embargo, no puede recuperar
entradas individuales dentro de una lista o un mapa.
AttributeUpdates
En una operacin UpdateItem, AttributeUpdates representa, para cada uno de los atributos que
se van a modificar, su nombre, la accin que se va a llevar a cabo y su nuevo valor. Si va a actualizar un
atributo de clave de ndice de alguno de los ndices de esa tabla, el tipo de atributo debe coincidir con el
tipo de clave de ndice definido en el elemento AttributesDefinition de la descripcin de la tabla.
Puede utilizar UpdateItem para actualizar los atributos sin clave.
Los valores de los atributos no pueden ser null. La longitud de los atributos de tipo String y Binary debe ser
mayor que cero. Los atributos de tipo Set no pueden estar vacos. Las solicitudes con valores vacos se
rechazan con la excepcin ValidationException.
Cada entrada AttributeUpdates consta de un nombre de atributo que se va a modificar, junto con lo
siguiente:
Si se encuentra en la tabla un elemento con la clave principal especificada, los valores siguientes llevan
a cabo estas acciones:
PUT: agrega el atributo especificado al elemento. Si el atributo ya existe, se sustituye por el nuevo
valor.
DELETE: elimina el atributo y su valor, si no se ha especificado ningn valor para DELETE. El tipo de
datos del valor especificado debe coincidir con el tipo de datos del valor existente.
Si se especifica un conjunto de valores, entonces esos valores se restarn del conjunto anterior.
Por ejemplo, si el valor de atributo era el conjunto [a,b,c] y la accin DELETE especifica [a,c],
entonces el valor final del atributo es [b]. Especificar un conjunto vaco es un error.
ADD: si el atributo no existe ya, agrega el valor especificado al elemento. Si el atributo existe, el
comportamiento de ADD depende del tipo de datos del atributo:
Si el atributo existente es un nmero y Value tambin es un nmero, entonces Value se suma
matemticamente al atributo existente. Si Value es un nmero negativo, entonces se resta del
atributo existente.
Note
Si utiliza ADD para sumar o restar de un valor numrico de un elemento que no exista
antes de la actualizacin, DynamoDB utilizar 0 como valor inicial.
De igual forma, si utiliza ADD con un elemento existente para sumar o restar de un valor
de un atributo que no exista antes de la actualizacin, DynamoDB utilizar 0 como valor
inicial. Por ejemplo, supongamos que el elemento que desea actualizar no tiene un atributo
denominado itemcount, pero que, a pesar de ello, usted decide aplicar ADD para sumar 3
a este atributo. DynamoDB crear el atributo itemcount, establecer su valor inicial en 0 y,
por ltimo, le sumar 3. El resultado ser un nuevo atributo itemcount, cuyo valor ser 3.
Si el tipo de datos existente es Set y, adems, Value tambin es de tipo Set, Value se adjunta
al conjunto existente. Por ejemplo, si el valor de atributo es el conjunto [1,2] y la accin ADD
especifica [3], entonces el valor final del atributo es [1,2,3]. Se produce un error si se especifica
una accin ADD para un atributo de tipo Set y el tipo de atributo especificado no coincide con el tipo
de conjunto existente.
Ambos conjuntos deben tener el mismo tipo de datos primitivo. Por ejemplo, si el tipo de datos
existente es un conjunto de cadenas, Value tambin debe ser un conjunto de cadenas.
Si no se encuentra en la tabla ningn elemento con la clave especificada, los valores siguientes llevan a
cabo estas acciones:
PUT: hace que DynamoDB cree un nuevo elemento con la clave principal especificada y, a
continuacin, agrega el atributo.
DELETE: no sucede nada, porque no se pueden eliminar los atributos de un elemento que no existe.
La operacin se lleva a cabo, pero DynamoDB no crea ningn elemento nuevo.
ADD: hace que DynamoDB cree un elemento con la clave principal y el nmero (o el conjunto de
nmeros) suministrados para el valor del atributo. Los nicos tipos de datos permitidos son Number y
Number Set.
Si proporciona atributos que forman parte de una clave de ndice, entonces los tipos de datos de tales
atributos debern coincidir con los del esquema de la definicin de atributos de la tabla.
}
}'
ConditionalOperator
Operador lgico que se aplica a las condiciones de un mapa Expected, QueryFilter o ScanFilter:
AND: si todas las condiciones se evalan en true, entonces todo el mapa se evala en true.
OR: si al menos una de las condiciones se evala en true, entonces todo el mapa se evala en true.
Expected
Expected es un bloque condicional para una operacin UpdateItem. Expected es un mapa de pares
atributo-condicin. Cada entrada del mapa consta de un nombre de atributo, un operador de comparacin
y uno o varios valores. DynamoDB utiliza el operador de comparacin para comparar el atributo con el o
los valores suministrados. Para cada entrada de Expected, el resultado de la evaluacin es true o false.
Si especifica ms de una entrada en el mapa Expected, de forma predeterminada todas las condiciones
deben evaluarse en true. Es decir, se utiliza AND como operador para evaluar las condiciones. Si lo desea,
puede usar el parmetro ConditionalOperator para comparar las condiciones con el operador OR. En
tal caso, deber evaluarse en true al menos una de las condiciones, en lugar de todas ellas.
Las comparaciones de valores String de tipo mayor que, igual que o menor que se basan en Unicode
con la codificacin UTF-8 binaria. Por ejemplo, a es mayor que A y a es mayor que B.
Al comparar valores de tipo Binary, DynamoDB trata cada byte de los datos binarios como sin signo.
ComparisonOperator: comparador que permite evaluar los atributos contenidos en
AttributeValueList. Al realizar la comparacin, DynamoDB utiliza lecturas de consistencia alta.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number,
Binary, String Set, Number Set o Binary Set. Si un elemento contiene una entrada AttributeValue
de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no
es igual que {"N":"6"}. {"N":"6"} tampoco es igual que {"NS":["6", "2", "1"]}.
NE: distinto de. NE se admite para todos los tipos de datos, incluidas las listas y los mapas.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que
{"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.
LT : Menor que.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que
{"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.
GT : Mayor que.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que
{"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.
NOT_NULL: el atributo existe. NOT_NULL se admite para todos los tipos de datos, incluidas las listas y
los mapas.
Note
Este operador comprueba si existe un atributo, no su tipo de datos. Si el tipo de datos del
atributo "a" es null y se evala mediante NOT_NULL, el resultado es un valor true de tipo
Boolean. Este resultado se debe a que el atributo "a" existe; su tipo de datos no es pertinente
para el operador de comparacin NOT_NULL.
API Version 2012-08-10
829
Amazon DynamoDB Developer Guide
Expected
NULL: el atributo no existe. NULL se admite para todos los tipos de datos, incluidas las listas y los
mapas.
Note
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si el atributo de destino de la comparacin es de tipo String, entonces el
operador comprueba si hay una subcadena coincidente. Si el atributo de destino de la comparacin es
de tipo Binary, entonces el operador busca una subsecuencia del destino que coincida con la entrada.
Si el atributo de destino de la comparacin es un conjunto ("SS", "NS" o "BS"), entonces el operador se
evala en true si encuentra una coincidencia exacta con cualquier miembro del conjunto.
CONTAINS es compatible con listas: al evaluar "a CONTAINS b", "a" puede ser una lista; sin
embargo, "b" no puede ser un conjunto, un mapa ni una lista.
NOT_CONTAINS: comprueba la ausencia de una subsecuencia, o la ausencia de un valor en un
conjunto.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si el atributo de destino de la comparacin es de tipo String, entonces
el operador comprueba la ausencia de una subcadena coincidente. Si el atributo de destino de la
comparacin es de tipo Binary, entonces el operador busca la ausencia de una subsecuencia del
destino que coincida con la entrada. Si el atributo de destino de la comparacin es un conjunto ("SS",
"NS" o "BS"), entonces el operador se evala en true si no (does not) encuentra una coincidencia
exacta con cualquier miembro del conjunto.
NOT_CONTAINS es compatible con listas: al evaluar "a NOT CONTAINS b", "a" puede ser una lista;
sin embargo, "b" no puede ser un conjunto, un mapa ni una lista.
BEGINS_WITH: comprueba si hay un prefijo.
AttributeValueList puede contener un solo AttributeValue de tipo String o Binary (no de tipo
Number ni Set). El atributo de destino de la comparacin debe ser un valor de tipo String o Binary (no
de tipo Number ni Set).
IN: comprueba si hay entradas que coincidan en dos conjuntos.
AttributeValueList debe contener dos entradas AttributeValue del mismo tipo, que puede
ser String, Number o Binary (pero no de tipo Set). Un atributo de destino coincide si el valor de destino
es mayor o igual que el primer componente y menor o igual que el segundo componente. Si un
elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud,
el valor no coincide. Por ejemplo, {"S":"6"} no se compara con {"N":"6"}. {"N":"6"} tampoco
se compara con {"NS":["6", "2", "1"]}.
Exists: valor de tipo Boolean que hace que DynamoDB evale el valor antes de intentar la operacin
condicional.
Si Exists es true, DynamoDB comprobar si el valor del atributo ya existe en la tabla. Si lo
encuentra, entonces la condicin se evala en true; de lo contrario, la condicin se evala en false.
Si Exists es false, DynamoDB presupone que el valor del atributo no (not) existe en la tabla.
Si el valor no existe, entonces el supuesto es vlido y la condicin se evala en true. Si el valor se
encuentra, a pesar del supuesto de que no exista, la condicin se evala en false.
KeyConditions
KeyConditions son los criterios de seleccin de una operacin Query. Para ejecutar una consulta en
una tabla, solo puede usar condiciones con los atributos de clave principal de la tabla. Debe proporcionar
el nombre y valor de la clave de particin como una condicin EQ. Si lo desea, puede proporcionar una
segunda condicin referida a la clave de ordenacin.
Note
Si no proporciona una condicin de clave de ordenacin, se recuperarn todos los elementos que
coincidan con la clave de particin. Si hay una expresin FilterExpression o QueryFilter
presente, se aplicar despus de recuperar los elementos.
Para ejecutar una consulta en un ndice, solo puede usar condiciones con los atributos de clave del ndice.
Debe proporcionar el nombre y valor de la clave de particin del ndice como una condicin EQ. Si lo
desea, puede proporcionar una segunda condicin referida a la clave de ordenacin del ndice.
Cada entrada KeyConditions consta de un nombre de atributo que se va a comparar, junto con lo
siguiente:
Las comparaciones de valores String de tipo mayor que, igual que o menor que se basan en Unicode
con la codificacin UTF-8 binaria. Por ejemplo, a es mayor que A y a es mayor que B.
Al comparar valores de tipo Binary, DynamoDB trata cada byte de los datos binarios como sin signo.
ComparisonOperator: comparador para evaluar atributos; por ejemplo, igual que, mayor que, menor
que, etc.
EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que
{"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.
LT : Menor que.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que
{"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.
GT : Mayor que.
AttributeValueList puede contener una sola entrada AttributeValue de tipo String, Number
o Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que
{"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.
BEGINS_WITH: comprueba si hay un prefijo.
AttributeValueList puede contener un solo AttributeValue de tipo String o Binary (no de tipo
Number ni Set). El atributo de destino de la comparacin debe ser un valor de tipo String o Binary (no
de tipo Number ni Set).
BETWEEN: mayor o igual que el primer valor y menor o igual que el segundo valor.
AttributeValueList debe contener dos entradas AttributeValue del mismo tipo, que puede
ser String, Number o Binary (pero no de tipo Set). Un atributo de destino coincide si el valor de destino
es mayor o igual que el primer componente y menor o igual que el segundo componente. Si un
elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud,
el valor no coincide. Por ejemplo, {"S":"6"} no se compara con {"N":"6"}. {"N":"6"} tampoco
se compara con {"NS":["6", "2", "1"]}.
QueryFilter
En una operacin Query, QueryFilter es una condicin que evala los resultados de la consulta
despus de que se hayan ledo los elementos y devuelve nicamente los valores deseados.
Note
QueryFilter se aplica despus de haber ledo los elementos; el proceso de filtrado no consume
ninguna unidad de capacidad de lectura adicional.
Tenga en cuenta que QueryFilter no admite atributos de clave. No puede definir una condicin de filtro
en una clave de particin ni de ordenacin.
Cada entrada QueryFilter consta de un nombre de atributo que se va a comparar, junto con lo
siguiente:
Las comparaciones de valores String de tipo mayor que, igual que o menor que se basan en la
codificacin UTF-8 binaria. Por ejemplo, a es mayor que A y a es mayor que B.
Al comparar valores de tipo Binary, DynamoDB trata cada byte de los datos binarios como sin signo.
Para obtener ms informacin sobre cmo especificar los tipos de datos en JSON, consulte API de bajo
nivel de DynamoDB (p. 192).
ComparisonOperator: comparador que permite evaluar los atributos. Por ejemplo, igual que, mayor
que, menor que, etc.
ScanFilter
En una operacin Scan, ScanFilter es una condicin que evala los resultados del examen y devuelve
nicamente los valores deseados.
Note
Cada entrada ScanFilter consta de un nombre de atributo que se va a comparar, junto con lo siguiente:
Las comparaciones de valores String de tipo mayor que, igual que o menor que se basan en la
codificacin UTF-8 binaria. Por ejemplo, a es mayor que A y a es mayor que B.
Al comparar valores de tipo Binary, DynamoDB trata cada byte de los datos binarios como sin signo.
Para obtener ms informacin sobre cmo especificar los tipos de datos en JSON, consulte API de bajo
nivel de DynamoDB (p. 192).
ComparisonOperator: comparador que permite evaluar los atributos. Por ejemplo, igual que, mayor
que, menor que, etc.
"AttributeValueList":[ {"S":"Rock"} ],
"ComparisonOperator": "EQ"
}
}'
En las nuevas aplicaciones deben utilizarse parmetros de expresin en su lugar. Para obtener
ms informacin, consulte Uso de expresiones en DynamoDB (p. 352).
Condiciones simples
Con los valores de los atributos, puede escribir condiciones para realizar comparaciones con los atributos
de la tabla. Una condicin siempre se evala en true o false y consta de:
En las siguientes secciones se describen los distintos operadores de comparacin, adems de ejemplos
de cmo utilizarlos en las condiciones.
Utilice estos operadores para comprobar si un atributo existe o no. Dado que no hay ningn valor que
comparar, no especifique AttributeValueList.
Ejemplo
...
"Dimensions": {
ComparisonOperator: "NOT_NULL"
}
...
AttributeValueList puede contener un solo valor de tipo String, Number, Binary, String Set,
Number Set o Binary Set. Si un elemento contiene un valor de un tipo distinto del especificado en la
solicitud, el valor no coincide. Por ejemplo, la cadena no "3" no es igual que el nmero 3. Tampoco el
nmero 3 es igual que el conjunto de nmeros [3, 2, 1].
NE: es true si un atributo no es igual que un valor.
AttributeValueList puede contener un solo valor de tipo String, Number, Binary, String Set,
Number Set o Binary Set. Si un elemento contiene un valor de un tipo distinto del especificado en la
solicitud, el valor no coincide.
LE: es true si un atributo es menor o igual que un valor.
AttributeValueList puede contener un solo valor de tipo String, Number o Binary (no un conjunto).
Si un elemento contiene un AttributeValue de un tipo distinto del especificado en la solicitud, el valor
no coincide.
LT: es true si un atributo es menor que un valor.
AttributeValueList puede contener un solo valor de tipo String, Number o Binary (no un conjunto).
Si un elemento contiene un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.
GE: es true si un atributo es mayor o igual que un valor.
AttributeValueList puede contener un solo valor de tipo String, Number o Binary (no un conjunto).
Si un elemento contiene un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.
GT: es true si un atributo es mayor que un valor.
AttributeValueList puede contener un solo valor de tipo String, Number o Binary (no un conjunto).
Si un elemento contiene un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.
CONTAINS: es true si un valor est presente en un conjunto o si un valor contiene otro valor.
AttributeValueList puede contener un solo valor de tipo String, Number o Binary (no un conjunto).
Si el atributo de destino de la comparacin es de tipo String, entonces el operador comprueba si hay
una subcadena coincidente. Si el atributo de destino de la comparacin es de tipo Binary, entonces el
operador busca una subsecuencia del destino que coincida con la entrada. Si el atributo de destino de
la comparacin es un conjunto, entonces el operador se evala en true si encuentra una coincidencia
exacta con cualquier miembro del conjunto.
NOT_CONTAINS: es true si un valor no est presente en un conjunto o si un valor no contiene otro valor.
AttributeValueList puede contener un solo valor de tipo String, Number o Binary (no un conjunto).
Si el atributo de destino de la comparacin es de tipo String, entonces el operador comprueba la
ausencia de una subcadena coincidente. Si el atributo de destino de la comparacin es de tipo Binary,
entonces el operador busca la ausencia de una subsecuencia del destino que coincida con la entrada.
Si el atributo de destino de la comparacin es un conjunto, entonces el operador se evala en true si no
encuentra una coincidencia exacta con cualquier miembro del conjunto.
BEGINS_WITH: es true si los primeros caracteres de un atributo coinciden con el valor proporcionado.
No use este operador para comparar nmeros.
AttributeValueList puede contener un solo valor de tipo String o Binary (no de tipo Number o Set).
El atributo de destino de la comparacin debe ser un valor de tipo String o Binary (no de tipo Number ni
un conjunto).
Use estos operadores para comparar un atributo con un valor. Debe especificar una lista
AttributeValueList compuesta por un solo valor. Para la mayora de los operadores, este debe ser un
valor escalar; sin embargo, los operadores EQ y NE tambin admiten conjuntos.
Ejemplos
...
"Price": {
ComparisonOperator: "GT",
AttributeValueList: [ {"N":100"} ]
}
...
...
"ProductCategory": {
ComparisonOperator: "BEGINS_WITH",
AttributeValueList: [ {"S":"Bo"} ]
}
...
...
"Color": {
ComparisonOperator: "EQ",
AttributeValueList: [
[ {"S":"Black"}, {"S":"Red"}, {"S":"Green"} ]
]
}
...
Note
Al comparar datos de tipo Set, el orden de las entradas carece de relevancia. DynamoDB
devolver solo los elementos con el mismo conjunto de valores, independientemente del orden
en que los especifique en la solicitud.
AttributeValueList debe contener dos entradas del mismo tipo, que puede ser String, Number o
Binary (pero no un conjunto). Un atributo de destino coincide si el valor de destino es mayor o igual que
el primer componente y menor o igual que el segundo componente. Si un elemento contiene un valor de
un tipo distinto del especificado en la solicitud, el valor no coincide.
Use este operador para determinar si un valor de atributo est dentro de un intervalo.
AttributeValueList debe contener dos entradas escalares del mismo tipo: String, Number o Binary.
Ejemplo
La siguiente expresin se evala en true si el precio de un producto est comprendido entre 100 y 200.
...
"Price": {
ComparisonOperator: "BETWEEN",
AttributeValueList: [ {"N":"100"}, {"N":"200"} ]
}
...
AttributeValueList puede contener una o varias entradas de tipo String, Number o Binary (no un
conjunto). Estos atributos se comparan con un atributo existente que no sea de tipo Set de un elemento.
Si cualquier entrada del conjunto de entrada est presente en el atributo del elemento, la expresin se
evala en true.
AttributeValueList puede contener uno o varios valores de tipo String, Number o Binary (no un
conjunto). El atributo de destino de la comparacin debe ser del mismo tipo y valor exactos para que se
produzca la coincidencia. Un valor de tipo String nunca coincide con un valor de tipo String Set.
Use este operador para determinar si el valor suministrado est contenido en una lista. Puede especificar
cualquier nmero de valores escalares en AttributeValueList, pero todos ellos deben ser del mismo
tipo de datos.
Ejemplo
...
"Id": {
ComparisonOperator: "IN",
AttributeValueList: [ {"N":"201"}, {"N":"203"}, {"N":"205"} ]
}
...
De forma predeterminada, cuando se especifica ms de una condicin, todas ellas deben evaluarse
en true para que la expresin completa se evale en true. Es decir, se lleva a cabo una operacin AND
implcita.
Ejemplo
La siguiente expresin se evala en true si un producto es un libro que tiene al menos 600pginas. Deben
evaluarse en true las dos condiciones, puesto que implcitamente se les aplica el operador AND.
...
"ProductCategory": {
ComparisonOperator: "EQ",
AttributeValueList: [ {"S":"Book"} ]
},
"PageCount": {
ComparisonOperator: "GE",
AttributeValueList: [ {"N":600"} ]
}
...
Puede utilizar ConditionalOperator (p. 828) para aclarar que se llevar a cabo una operacin AND. En el
siguiente ejemplo, el comportamiento es el mismo que en el caso anterior.
...
"ConditionalOperator" : "AND",
"ProductCategory": {
"ComparisonOperator": "EQ",
"AttributeValueList": [ {"N":"Book"} ]
},
"PageCount": {
"ComparisonOperator": "GE",
"AttributeValueList": [ {"N":600"} ]
}
...
Tambin puede establecer ConditionalOperator en OR, en cuyo caso al menos una de las
condiciones deber evaluarse en true.
Ejemplo
La siguiente expresin se evala en true si un producto es una bicicleta de montaa, es de una marca
concreta o su precio es mayor que 100.
...
ConditionalOperator : "OR",
"BicycleType": {
"ComparisonOperator": "EQ",
"AttributeValueList": [ {"S":"Mountain" ]
},
"Brand": {
"ComparisonOperator": "EQ",
"AttributeValueList": [ {"S":"Brand-Company A" ]
},
"Price": {
"ComparisonOperator": "GT",
"AttributeValueList": [ {"N":"100"} ]
}
...
Note
En una expresin compleja, las condiciones se procesan por orden, desde la primera hasta la
ltima.
No se puede utilizar AND y OR en la misma expresin.
DynamoDB contina admitiendo las opciones Value y Exists. Sin embargo, solo permiten comprobar
una condicin de desigualdad o si un atributo existe. Recomendamos usar ComparisonOperator y
Example
DeleteItem permite comprobar si un libro est descatalogado y eliminarlo nicamente si se cumple esta
condicin. A continuacin se muestra un ejemplo de la AWS CLI en el que se usa una condicin heredada:
Example
Una operacin PutItem permite proteger los datos para evitar que se sobrescriba un elemento existente
que tenga los mismos atributos de clave principal. A continuacin se muestra un ejemplo en el que se usa
una condicin heredada:
}' \
--expected '{
"Id": { "ComparisonOperator": "NULL" }
}'
Note
Para las condiciones del mapa Expected, no use las opciones Value y Exists heredadas
con ComparisonOperator y AttributeValueList. Si lo hace, se producir un error en la
escritura condicional.
BatchGetItem
BatchWriteItem
CreateTable
DeleteItem
DeleteTable
DescribeLimits
DescribeTable
DescribeTimeToLive
GetItem
ListTables
ListTagsOfResource
PutItem
Query
Scan
TagResource
UpdateItem
UpdateTable
UpdateTimeToLive
UntagResource
Las nuevas aplicaciones deben utilizar la versin actual del API (2012-08-10). Para obtener ms
informacin, consulte Versin actual del API de bajo nivel (2012-08-10) (p. 842).
Note
Temas
BatchGetItem (p. 843)
BatchWriteItem (p. 848)
CreateTable (p. 853)
DeleteItem (p. 858)
DeleteTable (p. 862)
DescribeTables (p. 865)
GetItem (p. 868)
ListTables (p. 870)
PutItem (p. 872)
Consulta (p. 878)
Examen (p. 887)
UpdateItem (p. 899)
UpdateTable (p. 905)
BatchGetItem
Important
Descripcin
La operacin BatchGetItem devuelve los atributos de varios elementos de varias tablas mediante sus
claves primarias. El nmero mximo de elementos que pueden recuperarse en una nica operacin
es de 100. Adems, el nmero de elementos recuperados est restringido por un lmite de tamao de
1MB. Si se supera el lmite de tamao de respuesta o se devuelve un resultado parcial por haberse
excedido el desempeo provisionado de la tabla o debido a un error de procesamiento interno, DynamoDB
devuelve un valor UnprocessedKeys para que pueda reintentar la operacin comenzando por el
siguiente elemento que desea obtener. DynamoDB ajusta automticamente el nmero de elementos
que se devuelven por pgina para aplicar este lmite. Por ejemplo, aunque solicite que se recuperen
100elementos con un tamao individual de 50KB cada uno, el sistema devolver 20elementos y un valor
de UnprocessedKeys correspondiente para que pueda obtener la siguiente pgina de resultados. Si lo
desea, la aplicacin puede incluir su propia lgica para ensamblar las pginas de resultados en un nico
conjunto.
BatchGetItem recupera los elementos en paralelo para minimizar las latencias de respuesta.
Al disear la aplicacin, tenga en cuenta que DynamoDB no garantiza cmo se ordenarn los
atributos en la respuesta devuelta. Incluya en AttributesToGet los valores de clave principal
de los elementos de la solicitud para ayudar a analizar la respuesta por elementos.
Si los elementos solicitados no existen, no se devuelve nada en la respuesta para esos
elementos. Las solicitudes de elementos inexistentes consumen las unidades de capacidad de
lectura mnimas, segn el tipo de lectura. Para obtener ms informacin, consulte Tamao de los
elementos y consumo de unidades de capacidad (p. 307).
Solicitudes
Sintaxis
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.BatchGetItem
content-type: application/x-amz-json-1.0
{"RequestItems":
{"Table1":
{"Keys":
[{"HashKeyElement": {"S":"KeyValue1"}, "RangeKeyElement":{"N":"KeyValue2"}},
{"HashKeyElement": {"S":"KeyValue3"}, "RangeKeyElement":{"N":"KeyValue4"}},
{"HashKeyElement": {"S":"KeyValue5"}, "RangeKeyElement":{"N":"KeyValue6"}}],
"AttributesToGet":["AttributeName1", "AttributeName2", "AttributeName3"]},
"Table2":
{"Keys":
[{"HashKeyElement": {"S":"KeyValue4"}},
{"HashKeyElement": {"S":"KeyValue5"}}],
"AttributesToGet": ["AttributeName4", "AttributeName5", "AttributeName6"]
}
}
}
Tipo: String
Tipo: String
Tipo: Keys
Tipo: Array
Tipo: booleano
Respuestas
Sintaxis
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 855
{"Responses":
{"Table1":
{"Items":
[{"AttributeName1": {"S":"AttributeValue"},
"AttributeName2": {"N":"AttributeValue"},
"AttributeName3": {"SS":["AttributeValue", "AttributeValue", "AttributeValue"]}
},
{"AttributeName1": {"S": "AttributeValue"},
"AttributeName2": {"S": "AttributeValue"},
"AttributeName3": {"NS": ["AttributeValue", "AttributeValue", "AttributeValue"]}
}],
"ConsumedCapacityUnits":1},
"Table2":
{"Items":
[{"AttributeName1": {"S":"AttributeValue"},
"AttributeName2": {"N":"AttributeValue"},
"AttributeName3": {"SS":["AttributeValue", "AttributeValue", "AttributeValue"]}
},
{"AttributeName1": {"S": "AttributeValue"},
"AttributeName2": {"S": "AttributeValue"},
"AttributeName3": {"NS": ["AttributeValue", "AttributeValue","AttributeValue"]}
}],
"ConsumedCapacityUnits":1}
},
"UnprocessedKeys":
{"Table3":
{"Keys":
[{"HashKeyElement": {"S":"KeyValue1"}, "RangeKeyElement":{"N":"KeyValue2"}},
{"HashKeyElement": {"S":"KeyValue3"}, "RangeKeyElement":{"N":"KeyValue4"}},
{"HashKeyElement": {"S":"KeyValue5"}, "RangeKeyElement":{"N":"KeyValue6"}}],
"AttributesToGet":["AttributeName1", "AttributeName2", "AttributeName3"]}
}
}
Nombre Descripcin
Tipo: Map
Tipo: String
Tipo: Number
Tipo: Array
Nombre Descripcin
sobre claves principales, consulte Clave
principal (p. 6).
Tipo: booleano.
Errores especiales
Error Descripcin
Ejemplos
En los ejemplos siguientes se muestra una solicitud HTTP POST y su respuesta utilizando la operacin
BatchGetItem. Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitud de muestra
En el ejemplo siguiente se solicitan atributos de dos tablas diferentes.
{"RequestItems":
{"comp2":
{"Keys":
[{"HashKeyElement":{"S":"Julie"}},{"HashKeyElement":{"S":"Mingus"}}],
"AttributesToGet":["user","friends"]},
"comp1":
{"Keys":
[{"HashKeyElement":{"S":"Casey"},"RangeKeyElement":{"N":"1319509152"}},
{"HashKeyElement":{"S":"Dave"},"RangeKeyElement":{"N":"1319509155"}},
{"HashKeyElement":{"S":"Riley"},"RangeKeyElement":{"N":"1319509158"}}],
"AttributesToGet":["user","status"]}
}
Respuesta de ejemplo
El ejemplo siguiente es la respuesta.
HTTP/1.1 200 OK
x-amzn-RequestId: GTPQVRM4VJS792J1UFJTKUBVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 373
Date: Fri, 02 Sep 2011 23:07:39 GMT
{"Responses":
{"comp2":
{"Items":
[{"status":{"S":"online"},"user":{"S":"Casey"}},
{"status":{"S":"working"},"user":{"S":"Riley"}},
{"status":{"S":"running"},"user":{"S":"Dave"}}],
"ConsumedCapacityUnits":1.5},
"comp2":
{"Items":
[{"friends":{"SS":["Elisabeth", "Peter"]},"user":{"S":"Mingus"}},
{"friends":{"SS":["Dave", "Peter"]},"user":{"S":"Julie"}}],
"ConsumedCapacityUnits":1}
},
"UnprocessedKeys":{}
}
BatchWriteItem
Important
Esta seccin se refiere a la versin 2011-12-05 del API, que est
obsoleta y no debe utilizarse para nuevas aplicaciones.
Para la documentacin sobre el API de bajo nivel actual, consulte la Amazon DynamoDB API
Reference.
Descripcin
Esta operacin permite colocar o eliminar varios elementos en una o varias tablas con una sola llamada.
Para cargar un elemento, puede utilizar PutItem; para eliminar un elemento, puede utilizar DeleteItem.
Sin embargo, si desea cargar o eliminar grandes cantidades de datos, como, por ejemplo, cargar grandes
cantidades de datos desde Amazon EMR (Amazon EMR) o migrar datos desde otra base de datos a
DynamoDB, BatchWriteItem ofrece una alternativa eficiente.
Si utiliza lenguajes como Java, puede usar subprocesos para cargar los elementos en paralelo. Esto
agrega complejidad a la aplicacin, porque debe encargarse de los subprocesos. Otros lenguajes no
admiten los subprocesos. Por ejemplo, si utiliza PHP, debe cargar o eliminar los elementos de uno en
uno. En ambos casos, BatchWriteItem proporciona una alternativa para procesar en paralelo las
operaciones de colocacin y eliminacin, por lo que aporta la potencia de un grupo de subprocesos sin
tener que aumentar la complejidad de la aplicacin.
Tenga en cuenta que cada una de las operaciones individuales de colocacin y eliminacin que se
especifican en una operacin BatchWriteItem cuesta lo mismo en trminos de unidades de capacidad
consumidas. No obstante, puesto que BatchWriteItem lleva a cabo las operaciones especificadas en
paralelo, se consigue una latencia menor. Cada una de las operaciones de eliminacin de elementos
inexistentes consumen una unidad de capacidad de escritura. Para obtener ms informacin sobre las
unidades de capacidad provisionadas, consulte Uso de tablas en DynamoDB (p. 301).
Nmero mximo de operaciones en una sola solicitud: puede especificar un mximo de 25operaciones
de colocacin o eliminacin en total; sin embargo, el tamao total de la solicitud no puede ser mayor que
1MB (la carga de HTTP).
Puede utilizar la operacin BatchWriteItem nicamente para colocar y eliminar elementos. No la
puede utilizar para actualizar los existentes.
No es una operacin atmica: las operaciones individuales especificadas en una operacin
BatchWriteItem son atmicas; sin embargo, BatchWriteItem en su conjunto es una operacin
basada en el principio "en la medida en que sea posible", no es atmica. Es decir, en una solicitud
BatchWriteItem, algunas operaciones podran realizarse correctamente y otras, no. Las operaciones
que presentan algn error se devuelven en el campo UnprocessedItems en la respuesta. Algunos
de estos errores podran deberse a que se haya superado el desempeo provisionado configurado
para la tabla, o a un error transitorio de la red, por ejemplo. Puede investigar y, si lo desea, reenviar las
solicitudes. Normalmente, se llama a BatchWriteItem en bucle, se comprueba en cada iteracin si
quedan elementos sin procesar y se enva una nueva solicitud BatchWriteItem con esos elementos
que faltan.
No se devuelven elementos: la operacin BatchWriteItem se ha diseado para cargar grandes
cantidades de datos de forma eficiente. No proporciona la sofisticacin que ofrecen PutItem y
DeleteItem. Por ejemplo, DeleteItem es compatible con el campo ReturnValues del cuerpo de la
solicitud para solicitar el elemento eliminado en la respuesta. En cambio, la operacin BatchWriteItem
no devuelve ningn elemento de respuesta.
A diferencia de PutItem y DeleteItem, BatchWriteItem no permite especificar condiciones para
solicitudes de escritura individuales de la operacin.
Los valores de los atributos no pueden ser null; los atributos de tipo cadena y binario deben tener una
longitud superior a cero; y los atributos de tipo conjunto no pueden estar vacos. Las solicitudes con
valores vacos se rechazan con la excepcin ValidationException.
DynamoDB rechaza toda la operacin de escritura por lotes si se cumple cualquiera de las siguientes
condiciones:
Solicitudes
Sintaxis
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.BatchGetItem
content-type: application/x-amz-json-1.0
{
"RequestItems" : RequestItems
}
RequestItems
{
"TableName1" : [ Request, Request, ... ],
"TableName2" : [ Request, Request, ... ],
...
}
Request ::=
PutRequest | DeleteRequest
PutRequest ::=
{
"PutRequest" : {
"Item" : {
"Attribute-Name1" : Attribute-Value,
"Attribute-Name2" : Attribute-Value,
...
}
}
}
DeleteRequest ::=
{
"DeleteRequest" : {
"Key" : PrimaryKey-Value
}
}
HashTypePK ::=
{
"HashKeyElement" : Attribute-Value
}
HashAndRangeTypePK
{
"HashKeyElement" : Attribute-Value,
"RangeKeyElement" : Attribute-Value,
}
Numeric ::=
{
"N": "Number"
}
String ::=
{
"S": "String"
}
Binary ::=
{
"B": "Base64 encoded binary data"
}
StringSet ::=
{
"SS": [ "String1", "String2", ... ]
}
NumberSet ::=
{
"NS": [ "Number1", "Number2", ... ]
}
BinarySet ::=
{
"BS": [ "Binary1", "Binary2", ... ]
}
En el cuerpo de la solicitud, el objeto JSON RequestItems describe las operaciones que se van a
realizar. Las operaciones se agrupan por tablas. Puede utilizar BatchWriteItem para actualizar o
eliminar varios elementos en varias tablas. Para cada solicitud de escritura especfica, debe identificar el
tipo de solicitud (PutItem o DeleteItem), seguido de informacin detallada sobre la operacin.
Para una solicitud PutRequest, se proporciona el elemento, es decir, una lista de atributos y sus
valores.
Para una solicitud DeleteRequest, se proporcionan el nombre y el valor de la clave principal.
Respuestas
Sintaxis
A continuacin encontrar la sintaxis del cuerpo JSON devuelto en la respuesta.
{
"Responses" : ConsumedCapacityUnitsByTable
"UnprocessedItems" : RequestItems
}
ConsumedCapacityUnitsByTable
{
"TableName1" : { "ConsumedCapacityUnits", : NumericValue },
"TableName2" : { "ConsumedCapacityUnits", : NumericValue },
...
}
RequestItems
This syntax is identical to the one described in the JSON syntax in the request.
Errores especiales
No hay errores especficos de esta operacin.
Ejemplos
En el siguiente ejemplo se muestra una solicitud HTTP POST y la respuesta de una operacin
BatchWriteItem. En la solicitud se especifican las siguientes operaciones en las tablas Reply y Thread:
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.BatchGetItem
content-type: application/x-amz-json-1.0
{
"RequestItems":{
"Reply":[
{
"PutRequest":{
"Item":{
"ReplyDateTime":{
"S":"2012-04-03T11:04:47.034Z"
},
"Id":{
"S":"DynamoDB#DynamoDB Thread 5"
}
}
}
},
{
"DeleteRequest":{
"Key":{
"HashKeyElement":{
"S":"DynamoDB#DynamoDB Thread 4"
},
"RangeKeyElement":{
"S":"oops - accidental row"
}
}
}
}
],
"Thread":[
{
"PutRequest":{
"Item":{
"ForumName":{
"S":"DynamoDB"
},
"Subject":{
"S":"DynamoDB Thread 5"
}
}
}
}
]
}
}
Respuesta de ejemplo
En la respuesta del siguiente ejemplo se muestra una operacin de colocacin que se ha realizado
correctamente en las tablas Thread y Reply, y una operacin que no se ha podido realizar en la tabla
Reply (por ejemplo, porque se ha aplicado una limitacin controlada por haberse superado el desempeo
provisionado de la tabla). Observe lo siguiente en la respuesta de JSON:
El objeto Responses muestra que se ha consumido una unidad de capacidad en cada tabla, Thread y
Reply, debido a sendas operaciones de colocacin llevadas a cabo en ellas.
El objeto UnprocessedItems muestra la operacin de eliminacin que no se pudo realizar en la
tabla Reply. A continuacin, puede emitir una nueva llamada a BatchWriteItem para repetir estas
solicitudes sin procesar.
HTTP/1.1 200 OK
x-amzn-RequestId: G8M9ANLOE5QA26AEUHJKJE0ASBVV4KQNSO5AEMVJF66Q9ASUAAJG
Content-Type: application/x-amz-json-1.0
Content-Length: 536
Date: Thu, 05 Apr 2012 18:22:09 GMT
{
"Responses":{
"Thread":{
"ConsumedCapacityUnits":1.0
},
"Reply":{
"ConsumedCapacityUnits":1.0
}
},
"UnprocessedItems":{
"Reply":[
{
"DeleteRequest":{
"Key":{
"HashKeyElement":{
"S":"DynamoDB#DynamoDB Thread 4"
},
"RangeKeyElement":{
"S":"oops - accidental row"
}
}
}
}
]
}
}
CreateTable
Important
Esta seccin se refiere a la versin 2011-12-05 del API, que est
obsoleta y no debe utilizarse para nuevas aplicaciones.
Para la documentacin sobre el API de bajo nivel actual, consulte la Amazon DynamoDB API
Reference.
Descripcin
La operacin CreateTable agrega una nueva tabla a la cuenta.
El nombre de la tabla debe ser nico para la cuenta de AWS que emite la solicitud y la regin de AWS que
recibe la solicitud a las que estn asociadas (por ejemplo, dynamodb.us-west-2.amazonaws.com). Cada
punto de enlace de DynamoDB es totalmente independiente. Por ejemplo, si tiene dos tablas denominadas
"MyTable", una en dynamodb.us-west-2.amazonaws.com y otra en dynamodb.us-west-1.amazonaws.com,
son completamente independientes y no comparten ningn dato.
La operacin CreateTable activa un flujo de trabajo asincrnico para comenzar a crear la tabla.
DynamoDB devuelve inmediatamente el estado de la tabla (CREATING) hasta que la tabla adquiere el
estado ACTIVE. Una vez que la tabla tiene el estado ACTIVE, puede llevar a cabo operaciones del plano
de datos.
Solicitudes
Sintaxis
{"TableName":"Table1",
"KeySchema":
{"HashKeyElement":{"AttributeName":"AttributeName1","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"AttributeName2","AttributeType":"N"}},
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":10}
}
Tipo: String
Tipo: Array
Tipo: Number
Tipo: Number
Respuestas
Sintaxis
HTTP/1.1 200 OK
x-amzn-RequestId: CSOC7TJPLR0OOKIRLGOHVAICUFVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 311
Date: Tue, 12 Jul 2011 21:31:03 GMT
{"TableDescription":
{"CreationDateTime":1.310506263362E9,
"KeySchema":
{"HashKeyElement":{"AttributeName":"AttributeName1","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"AttributeName2","AttributeType":"N"}},
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":10},
"TableName":"Table1",
"TableStatus":"CREATING"
}
}
Nombre Descripcin
Tipo: Number
Tipo: Array
Tipo: Number
Tipo: Number
Tipo: String
Nombre Descripcin
Use el API DescribeTables (p. 865) para
comprobar el estado de la tabla.
Tipo: String
Errores especiales
Error Descripcin
Ejemplos
En el siguiente ejemplo se crea una tabla con una clave principal compuesta que contiene una cadena
y un nmero. Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de tablas en
DynamoDB (p. 301).
Solicitud de muestra
{"TableName":"comp-table",
"KeySchema":
{"HashKeyElement":{"AttributeName":"user","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"time","AttributeType":"N"}},
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":10}
}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: CSOC7TJPLR0OOKIRLGOHVAICUFVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 311
Date: Tue, 12 Jul 2011 21:31:03 GMT
{"TableDescription":
{"CreationDateTime":1.310506263362E9,
"KeySchema":
{"HashKeyElement":{"AttributeName":"user","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"time","AttributeType":"N"}},
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":10},
"TableName":"comp-table",
"TableStatus":"CREATING"
}
}
Acciones relacionadas
DescribeTables (p. 865)
DeleteTable (p. 862)
DeleteItem
Important
Descripcin
Elimina un solo elemento de una tabla por su clave principal. Puede realizar una operacin de eliminacin
condicional que elimina el elemento si existe o si tiene un valor de atributo esperado.
Note
Si especifica DeleteItem sin atributos ni valores, se eliminan todos los atributos del elemento.
A menos que especifique condiciones, DeleteItem es una operacin idempotente; aunque se
ejecute varias veces en el mismo elemento o atributo no se obtiene una respuesta de error.
Las eliminaciones condicionales solo son tiles para eliminar elementos y atributos cuando se
cumplen determinadas condiciones. Si se cumplen las condiciones, DynamoDB lleva a cabo la
eliminacin. De lo contrario, el elemento no se elimina.
Puede llevar a cabo la comprobacin condicional esperada en un atributo por operacin.
Solicitudes
Sintaxis
{"TableName":"Table1",
"Key":
{"HashKeyElement":{"S":"AttributeValue1"},"RangeKeyElement":
{"N":"AttributeValue2"}},
"Expected":{"AttributeName3":{"Value":{"S":"AttributeValue3"}}},
"ReturnValues":"ALL_OLD"}
}
Tipo: String
Tipo: String
"Expected" :
{"Color":{"Exists":false}}
"Expected" :
{"Color":{"Exists":true},
{"Value":{"S":"Yellow"}}}
"Expected" :
{"Color":{"Value":
{"S":"Yellow"}}}
Note
Si especifica
{"Exists":true} sin
un valor de atributo que
comprobar, DynamoDB
devuelve un error.
Tipo: String
Respuestas
Sintaxis
HTTP/1.1 200 OK
x-amzn-RequestId: CSOC7TJPLR0OOKIRLGOHVAICUFVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 353
Date: Tue, 12 Jul 2011 21:31:03 GMT
{"Attributes":
{"AttributeName3":{"SS":["AttributeValue3","AttributeValue4","AttributeValue5"]},
"AttributeName2":{"S":"AttributeValue2"},
"AttributeName1":{"N":"AttributeValue1"}
},
"ConsumedCapacityUnits":1
}
Nombre Descripcin
Tipo: Number
Errores especiales
Error Descripcin
Ejemplos
Solicitud de muestra
{"TableName":"comp-table",
"Key":
{"HashKeyElement":{"S":"Mingus"},"RangeKeyElement":{"N":"200"}},
"Expected":
{"status":{"Value":{"S":"shopping"}}},
"ReturnValues":"ALL_OLD"
}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: U9809LI6BBFJA5N2R0TB0P017JVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 353
Date: Tue, 12 Jul 2011 22:31:23 GMT
{"Attributes":
{"friends":{"SS":["Dooley","Ben","Daisy"]},
"status":{"S":"shopping"},
"time":{"N":"200"},
"user":{"S":"Mingus"}
},
"ConsumedCapacityUnits":1
}
Acciones relacionadas
PutItem (p. 872)
DeleteTable
Important
Descripcin
La operacin DeleteTable elimina una tabla y todos sus elementos. Despus de una solicitud
DeleteTable, la tabla especificada se encuentra en estado DELETING hasta que DynamoDB completa la
eliminacin. Si la tabla est en estado ACTIVE, puede eliminarla. Si una tabla se encuentra en los estados
CREATING o UPDATING, entonces DynamoDB devuelve un error ResourceInUseException. Si la tabla
especificada no existe, DynamoDB devuelve una excepcin ResourceNotFoundException. Si la tabla
ya se encuentra en el estado DELETING, no se devuelve ningn error.
Note
DynamoDB podra continuar aceptando solicitudes de operaciones con el plano de datos, tales
como GetItem y PutItem, en una tabla que se encuentre en estado DELETING hasta que se
haya completado la eliminacin de la tabla.
Todas las tablas son nicas para la cuenta de AWS que emite la solicitud y la regin de AWS que recibe
la solicitud a las que estn asociadas (por ejemplo, dynamodb.us-west-1.amazonaws.com). Cada punto
de enlace de DynamoDB es totalmente independiente. Por ejemplo, si tiene dos tablas denominadas
"MyTable", una en dynamodb.us-west-2.amazonaws.com y otra en dynamodb.us-west-1.amazonaws.com,
son totalmente independientes y no comparten ningn dato; al eliminar una de ellas no se elimina la otra.
Solicitudes
Sintaxis
{"TableName":"Table1"}
Tipo: String
Respuestas
Sintaxis
HTTP/1.1 200 OK
x-amzn-RequestId: 4HONCKIVH1BFUDQ1U68CTG3N27VV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 311
Date: Sun, 14 Aug 2011 22:56:22 GMT
{"TableDescription":
{"CreationDateTime":1.313362508446E9,
"KeySchema":
{"HashKeyElement":{"AttributeName":"user","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"time","AttributeType":"N"}},
"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10},
"TableName":"Table1",
"TableStatus":"DELETING"
}
}
Nombre Descripcin
Tipo: Number
Nombre Descripcin
Tipo: Number
Tipo: Number
Tipo: String
Tipo: String
Errores especiales
Error Descripcin
Ejemplos
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.DeleteTable
content-type: application/x-amz-json-1.0
content-length: 40
{"TableName":"favorite-movies-table"}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: 4HONCKIVH1BFUDQ1U68CTG3N27VV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 160
Date: Sun, 14 Aug 2011 17:20:03 GMT
{"TableDescription":
{"CreationDateTime":1.313362508446E9,
"KeySchema":
{"HashKeyElement":{"AttributeName":"name","AttributeType":"S"}},
"TableName":"favorite-movies-table",
"TableStatus":"DELETING"
}
Acciones relacionadas
CreateTable (p. 853)
DescribeTables (p. 865)
DescribeTables
Important
Descripcin
Devuelve informacin sobre la tabla, incluido su estado actual, el esquema de clave principal y
el momento de creacin. Los resultados de DescribeTable presentan consistencia final. Si utiliza
DescribeTable demasiado pronto en el proceso de creacin de una tabla, DynamoDB devuelve una
excepcin ResourceNotFoundException. Si utiliza DescribeTable demasiado pronto en el proceso de
actualizacin de una tabla, los nuevos valores podran no estar disponibles inmediatamente.
Solicitudes
Sintaxis
{"TableName":"Table1"}
Tipo: String
Respuestas
Sintaxis
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
Content-Length: 543
{"Table":
{"CreationDateTime":1.309988345372E9,
ItemCount:1,
"KeySchema":
{"HashKeyElement":{"AttributeName":"AttributeName1","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"AttributeName2","AttributeType":"N"}},
"ProvisionedThroughput":{"LastIncreaseDateTime": Date, "LastDecreaseDateTime": Date,
"ReadCapacityUnits":10,"WriteCapacityUnits":10},
"TableName":"Table1",
"TableSizeBytes":1,
"TableStatus":"ACTIVE"
}
}
Nombre Descripcin
Tipo: String
Tipo: Number
Tipo: Array
Tipo: String
Nombre Descripcin
Tipo: Number
Errores especiales
No hay errores especficos de esta operacin.
Ejemplos
En los siguientes ejemplos se muestran una solicitud y una respuesta HTTP POST aplicando la operacin
DescribeTable a una tabla denominada "comp-table". La clave principal de la tabla es compuesta.
Solicitud de muestra
{"TableName":"users"}
Respuesta de ejemplo
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 543
{"Table":
{"CreationDateTime":1.309988345372E9,
"ItemCount":23,
"KeySchema":
{"HashKeyElement":{"AttributeName":"user","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"time","AttributeType":"N"}},
"ProvisionedThroughput":{"LastIncreaseDateTime": 1.309988345384E9,
"ReadCapacityUnits":10,"WriteCapacityUnits":10},
"TableName":"users",
"TableSizeBytes":949,
"TableStatus":"ACTIVE"
}
}
Acciones relacionadas
CreateTable (p. 853)
GetItem
Important
Esta seccin se refiere a la versin 2011-12-05 del API, que est
obsoleta y no debe utilizarse para nuevas aplicaciones.
Para la documentacin sobre el API de bajo nivel actual, consulte la Amazon DynamoDB API
Reference.
Descripcin
La operacin GetItem devuelve un conjunto de Attributes de un elemento que coincida con la clave
principal. Si no hay ningn elemento que coincida, GetItem no devuelve ningn dato.
De forma predeterminada, la operacin GetItem proporciona una lectura consistente final. Si las lecturas
consistentes finales no son aceptables en su aplicacin, use ConsistentRead. Aunque esta operacin
puede tardar ms que una lectura normal, siempre devuelve el ltimo valor actualizado. Para obtener ms
informacin, consulte Consistencia de lectura (p. 16).
Solicitudes
Sintaxis
{"TableName":"Table1",
"Key":
{"HashKeyElement": {"S":"AttributeValue1"},
"RangeKeyElement": {"N":"AttributeValue2"}
},
"AttributesToGet":["AttributeName3","AttributeName4"],
"ConsistentRead":Boolean
}
Tipo: String
Tipo: Array
Tipo: booleano
Respuestas
Sintaxis
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 144
{"Item":{
"AttributeName3":{"S":"AttributeValue3"},
"AttributeName4":{"N":"AttributeValue4"},
"AttributeName5":{"B":"dmFsdWU="}
},
"ConsumedCapacityUnits": 0.5
}
Nombre Descripcin
Tipo: Number
Errores especiales
No hay errores especficos de esta operacin.
Ejemplos
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitud de muestra
{"TableName":"comptable",
"Key":
{"HashKeyElement":{"S":"Julie"},
"RangeKeyElement":{"N":"1307654345"}},
"AttributesToGet":["status","friends"],
"ConsistentRead":true
}
Respuesta de ejemplo
Observe que el valor de ConsumedCapacityUnits es 1, ya que el parmetro opcional ConsistentRead se
ha establecido en true. Si ConsistentRead se establece en false (o no se especifica) para la misma
solicitud, la respuesta presentar consistencia final, en cuyo caso el valor de ConsumedCapacityUnits
sera 0,5.
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 72
{"Item":
{"friends":{"SS":["Lynda, Aaron"]},
"status":{"S":"online"}
},
"ConsumedCapacityUnits": 1
}
ListTables
Important
Descripcin
Muestra una matriz de todas las tablas asociadas con la cuenta y el punto de enlace actuales.
Cada punto de enlace de DynamoDB es totalmente independiente. Por ejemplo, si tiene dos tablas
denominadas "MyTable", una en dynamodb.us-west-2.amazonaws.com y otra en dynamodb.us-
east-1.amazonaws.com, son completamente independientes y no comparten ningn dato. La operacin
ListTables devuelve todos los nombres de las tablas asociadas con la cuenta que realiza la solicitud para el
punto de enlace que recibe la solicitud.
Solicitudes
Sintaxis
{"ExclusiveStartTableName":"Table1","Limit":3}
De forma predeterminada, la operacin ListTables solicita todos los nombres de las tablas asociadas con la
cuenta que realiza la solicitud para el punto de enlace que recibe la solicitud.
Tipo: String
Respuestas
Sintaxis
HTTP/1.1 200 OK
x-amzn-RequestId: S1LEK2DPQP8OJNHVHL8OU2M7KRVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 81
Date: Fri, 21 Oct 2011 20:35:38 GMT
{"TableNames":["Table1","Table2","Table3"], "LastEvaluatedTableName":"Table3"}
Nombre Descripcin
Tipo: Array
Nombre Descripcin
Tipo: String
Errores especiales
No hay errores especficos de esta operacin.
Ejemplos
En los ejemplos siguientes se muestra una solicitud HTTP POST y su respuesta utilizando la operacin
ListTables.
Solicitud de muestra
{"ExclusiveStartTableName":"comp2","Limit":3}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: S1LEK2DPQP8OJNHVHL8OU2M7KRVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 81
Date: Fri, 21 Oct 2011 20:35:38 GMT
{"LastEvaluatedTableName":"comp5","TableNames":["comp3","comp4","comp5"]}
Acciones relacionadas
DescribeTables (p. 865)
CreateTable (p. 853)
DeleteTable (p. 862)
PutItem
Important
Para la documentacin sobre el API de bajo nivel actual, consulte la Amazon DynamoDB API
Reference.
Descripcin
Crea un elemento nuevo o sustituye uno antiguo por otro nuevo (incluidos todos los atributos). Si ya
existe un elemento con la misma clave principal en la tabla especificada, el nuevo elemento sustituye por
completo al existente. Puede realizar una colocacin condicional (insertar un nuevo elemento solamente
si no existe otro con la clave principal especificada) o bien sustituir un elemento existente si sus atributos
tienen determinados valores.
Los valores de los atributos no pueden ser null; los atributos de tipo cadena y binario deben tener una
longitud superior a cero; y los atributos de tipo conjunto no pueden estar vacos. Las solicitudes con
valores vacos se rechazan con la excepcin ValidationException.
Note
Para garantizar que un nuevo elemento no sustituya un elemento existente, utilice una operacin
de colocacin condicional con Exists establecido en false para el o los atributos de clave
principal.
Para obtener ms informacin acerca del uso de PutItem, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitudes
Sintaxis
// This header is abbreviated.
// For a sample of a complete header, see API de bajo nivel de DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.PutItem
content-type: application/x-amz-json-1.0
{"TableName":"Table1",
"Item":{
"AttributeName1":{"S":"AttributeValue1"},
"AttributeName2":{"N":"AttributeValue2"},
"AttributeName5":{"B":"dmFsdWU="}
},
"Expected":{"AttributeName3":{"Value": {"S":"AttributeValue"}, "Exists":Boolean}},
"ReturnValues":"ReturnValuesConstant"}
Tipo: String
Tipo: String
"Expected" :
{"Color":{"Exists":false}}
"Expected" :
{"Color":{"Exists":true,
{"Value":{"S":"Yellow"}}}
De forma predeterminada, si se
utiliza el parmetro Expected
y se proporciona el valor de
Value, DynamoDB da por hecho
que el atributo existe y que posee
un valor que hay que sustituir.
Por lo tanto, no es preciso
especificar {"Exists":true},
porque se considera implcito.
Puede reducir la solicitud a:
"Expected" :
{"Color":{"Value":
{"S":"Yellow"}}}
Note
Si especifica
{"Exists":true} sin
un valor de atributo que
comprobar, DynamoDB
devuelve un error.
Tipo: String
Respuestas
Sintaxis
En el ejemplo de sintaxis siguiente se supone que la solicitud ha especificado un parmetro
ReturnValues de ALL_OLD; en caso contrario, la respuesta solo contiene la entrada
ConsumedCapacityUnits.
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 85
{"Attributes":
{"AttributeName3":{"S":"AttributeValue3"},
"AttributeName2":{"SS":"AttributeValue2"},
"AttributeName1":{"SS":"AttributeValue1"},
},
"ConsumedCapacityUnits":1
}
Nombre Descripcin
Nombre Descripcin
Tipo: Number
Errores especiales
Error Descripcin
Ejemplos
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.PutItem
content-type: application/x-amz-json-1.0
{"TableName":"comp5",
"Item":
{"time":{"N":"300"},
"feeling":{"S":"not surprised"},
"user":{"S":"Riley"}
},
"Expected":
{"feeling":{"Value":{"S":"surprised"},"Exists":true}}
"ReturnValues":"ALL_OLD"
}
Respuesta de ejemplo
HTTP/1.1 200
x-amzn-RequestId: 8952fa74-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 84
{"Attributes":
{"feeling":{"S":"surprised"},
"time":{"N":"300"},
"user":{"S":"Riley"}},
"ConsumedCapacityUnits":1
}
Acciones relacionadas
UpdateItem (p. 899)
DeleteItem (p. 858)
Consulta
Important
Descripcin
Una operacin Query obtiene los valores de uno o varios elementos y sus atributos mediante su clave
principal (Query solo est disponible para tablas con clave principal compuesta por una clave hash y
una clave de rango). Debe proporcionar un valor HashKeyValue especfico y delimitar el alcance de la
consulta mediante operadores de comparacin en el valor RangeKeyValue de la clave principal. Utilice el
parmetro ScanIndexForward para obtener los resultados por orden ascendente o descendente segn
su clave de rango.
Las consultas que no devuelven resultados consumen las unidades de capacidad de lectura mnimas,
segn el tipo de lectura.
Note
Si el nmero total de elementos que cumplen los parmetros de la consulta supera el lmite de
1MB, la consulta se detiene y se devuelven los resultados al usuario; en este caso, se facilita un
valor de LastEvaluatedKey para que pueda continuar la consulta en una operacin posterior.
A diferencia de las operaciones Scan, las operaciones Query nunca devuelven un conjunto de
resultados vaco y un valor de LastEvaluatedKey. El valor de LastEvaluatedKey solamente
se proporciona si los resultados superan 1MB o si se ha utilizado el parmetro Limit.
El resultado se puede establecer para una lectura consistente con el parmetro
ConsistentRead.
Solicitudes
Sintaxis
{"TableName":"Table1",
"Limit":2,
"ConsistentRead":true,
"HashKeyValue":{"S":"AttributeValue1":},
"RangeKeyCondition": {"AttributeValueList":
[{"N":"AttributeValue2"}],"ComparisonOperator":"GT"}
"ScanIndexForward":true,
"ExclusiveStartKey":{
"HashKeyElement":{"S":"AttributeName1"},
"RangeKeyElement":{"N":"AttributeName2"}
},
Tipo: String
Tipo: Array
Tipo: Number
Tipo: booleano
Tipo: booleano
Tipo: Map
Las comparaciones de
valores de cadenas de
tipo mayor que, igual
que o menor que se
basan en sus valores
segn el cdigo de
caracteres ASCII. Por
ejemplo, a es mayor
que A y aa es mayor
que B. Para obtener
una lista de valores de
cdigos, consulte http://
en.wikipedia.org/wiki/
ASCII#ASCII_printable_characters.
En el tipo Binary, al
comparar valores
binarios DynamoDB
trata cada byte como
datos sin signo; por
ejemplo, al evaluar
expresiones de
consulta.
LT : Menor que.
GT : Mayor que.
BEGINS_WITH: comprueba si
hay un prefijo.
Para BEGINS_WITH,
AttributeValueList
puede contener un solo
AttributeValue de tipo String
o Binary (no de tipo Number ni un
conjunto). El atributo de destino
de la comparacin debe ser un
valor de tipo String o Binary (no
de tipo Number ni un conjunto).
Para BETWEEN,
AttributeValueList
debe contener dos entradas
AttributeValue del mismo
tipo, que puede ser String,
Number o Binary (pero no un
conjunto). Un atributo de destino
coincide si el valor de destino
es mayor o igual que el primer
componente y menor o igual
que el segundo componente.
Si un elemento contiene un
AttributeValue de un tipo
distinto del especificado en la
solicitud, el valor no coincide.
Por ejemplo, {"S":"6"} no
se compara con {"N":"6"}.
{"N":"6"} tampoco se
compara con {"NS":["6",
"2", "1"]}.
Tipo: booleano
Tipo: HashKeyElement, o
bien HashKeyElement y
RangeKeyElement si se
trata de una clave principal
compuesta.
Respuestas
Sintaxis
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 308
{"Count":2,"Items":[{
"AttributeName1":{"S":"AttributeValue1"},
"AttributeName2":{"N":"AttributeValue2"},
"AttributeName3":{"S":"AttributeValue3"}
},{
"AttributeName1":{"S":"AttributeValue3"},
"AttributeName2":{"N":"AttributeValue4"},
"AttributeName3":{"S":"AttributeValue3"},
"AttributeName5":{"B":"dmFsdWU="}
}],
"LastEvaluatedKey":{"HashKeyElement":{"AttributeValue3":"S"},
"RangeKeyElement":{"AttributeValue4":"N"}
},
"ConsumedCapacityUnits":1
}
Nombre Descripcin
Tipo: Number
Tipo: Number
Errores especiales
Error Descripcin
Ejemplos
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de consultas (p. 425).
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.Query
content-type: application/x-amz-json-1.0
{"TableName":"1-hash-rangetable",
"Limit":2,
"HashKeyValue":{"S":"John"},
"ScanIndexForward":false,
"ExclusiveStartKey":{
"HashKeyElement":{"S":"John"},
"RangeKeyElement":{"S":"The Matrix"}
}
}
Respuesta de ejemplo
HTTP/1.1 200
x-amzn-RequestId: 3647e778-71eb-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 308
{"Count":2,"Items":[{
"fans":{"SS":["Jody","Jake"]},
"name":{"S":"John"},
"rating":{"S":"***"},
"title":{"S":"The End"}
},{
"fans":{"SS":["Jody","Jake"]},
"name":{"S":"John"},
"rating":{"S":"***"},
"title":{"S":"The Beatles"}
}],
"LastEvaluatedKey":{"HashKeyElement":{"S":"John"},"RangeKeyElement":{"S":"The Beatles"}},
"ConsumedCapacityUnits":1
}
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.Query
content-type: application/x-amz-json-1.0
{"TableName":"1-hash-rangetable",
"Limit":2,
"HashKeyValue":{"S":"Airplane"},
"RangeKeyCondition":{"AttributeValueList":[{"N":"1980"}],"ComparisonOperator":"EQ"},
"ScanIndexForward":false}
Respuesta de ejemplo
HTTP/1.1 200
x-amzn-RequestId: 8b9ee1ad-774c-11e0-9172-d954e38f553a
content-type: application/x-amz-json-1.0
content-length: 119
{"Count":1,"Items":[{
"fans":{"SS":["Dave","Aaron"]},
"name":{"S":"Airplane"},
"rating":{"S":"***"},
"year":{"N":"1980"}
}],
"ConsumedCapacityUnits":1
}
Acciones relacionadas
Examen (p. 887)
Examen
Important
Esta seccin se refiere a la versin 2011-12-05 del API, que est
obsoleta y no debe utilizarse para nuevas aplicaciones.
Para la documentacin sobre el API de bajo nivel actual, consulte la Amazon DynamoDB API
Reference.
Descripcin
La operacin Scan lleva a cabo un examen completo de una tabla y devuelve uno o varios elementos y
sus atributos. Proporcione un filtro ScanFilter para obtener resultados ms especficos.
Note
Si el nmero total de elementos examinados supera el lmite de 1MB, el examen se detiene y se
devuelven los resultados al usuario; en este caso, se facilita un valor de LastEvaluatedKey
para que pueda continuar el examen en una operacin posterior. Adems, los resultados incluyen
el nmero de elementos que superan el lmite. En un examen, puede suceder que ninguno de los
datos de la tabla cumplan los criterios de filtro.
El conjunto de resultados presenta consistencia final.
Solicitudes
Sintaxis
// This header is abbreviated.
// For a sample of a complete header, see API de bajo nivel de DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.Scan
content-type: application/x-amz-json-1.0
{"TableName":"Table1",
"Limit": 2,
"ScanFilter":{
"AttributeName1":{"AttributeValueList":
[{"S":"AttributeValue"}],"ComparisonOperator":"EQ"}
},
"ExclusiveStartKey":{
"HashKeyElement":{"S":"AttributeName1"},
"RangeKeyElement":{"N":"AttributeName2"}
},
Tipo: String
Tipo: Array
Tipo: Number
Tipo: booleano
Tipo: Un mapa de
AttributeValue a una
Condition.
Las comparaciones de
valores de cadenas de
tipo mayor que, igual
que o menor que se
basan en sus valores
segn el cdigo de
caracteres ASCII. Por
ejemplo, a es mayor
que A y aa es mayor
que B. Para obtener
una lista de valores de
cdigos, consulte http://
en.wikipedia.org/wiki/
ASCII#ASCII_printable_characters.
En el tipo Binary, al
comparar valores
binarios DynamoDB
trata cada byte como
datos sin signo; por
ejemplo, al evaluar
expresiones de
consulta.
LT : Menor que.
GT : Mayor que.
Para CONTAINS,
AttributeValueList
puede contener un solo
AttributeValue de tipo
String, Number o Binary (no
un conjunto). Si el atributo de
destino de la comparacin
es de tipo String, entonces la
operacin comprueba si hay
una subcadena coincidente.
Si el atributo de destino de la
comparacin es de tipo Binary,
entonces la operacin busca
una subsecuencia del destino
que coincida con la entrada.
Si el atributo de destino de la
comparacin es un conjunto
("SS", "NS" o "BS"), entonces la
operacin busca un miembro del
conjunto (no como subcadena).
NOT_CONTAINS: comprueba la
ausencia de una subsecuencia,
o la ausencia de un valor en un
conjunto.
Para NOT_CONTAINS,
AttributeValueList
puede contener un solo
AttributeValue de tipo
String, Number o Binary (no
un conjunto). Si el atributo de
destino de la comparacin es de
tipo String, entonces la operacin
comprueba la ausencia de
una subcadena coincidente.
Si el atributo de destino de la
comparacin es de tipo Binary,
entonces la operacin busca la
ausencia de una subsecuencia
del destino que coincida con la
entrada. Si el atributo de destino
de la comparacin es un conjunto
("SS", "NS" o "BS"), entonces
la operacin busca la ausencia
de un miembro del conjunto (no
como subcadena).
BEGINS_WITH: comprueba si
hay un prefijo.
Para BEGINS_WITH,
AttributeValueList
puede contener un solo
AttributeValue de tipo String
o Binary (no de tipo Number ni un
conjunto). El atributo de destino
de la comparacin debe ser un
valor de tipo String o Binary (no
de tipo Number ni un conjunto).
Para BETWEEN,
AttributeValueList
debe contener dos entradas
AttributeValue del mismo
tipo, que puede ser String,
Number o Binary (pero no un
conjunto). Un atributo de destino
coincide si el valor de destino
es mayor o igual que el primer
componente y menor o igual
que el segundo componente.
Si un elemento contiene un
AttributeValue de un tipo
distinto del especificado en la
solicitud, el valor no coincide.
Por ejemplo, {"S":"6"} no
se compara con {"N":"6"}.
{"N":"6"} tampoco se
compara con {"NS":["6",
"2", "1"]}.
Tipo: HashKeyElement, o
bien HashKeyElement y
RangeKeyElement si se
trata de una clave principal
compuesta.
Respuestas
Sintaxis
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 229
{"Count":2,"Items":[{
"AttributeName1":{"S":"AttributeValue1"},
"AttributeName2":{"S":"AttributeValue2"},
"AttributeName3":{"S":"AttributeValue3"}
},{
"AttributeName1":{"S":"AttributeValue4"},
"AttributeName2":{"S":"AttributeValue5"},
"AttributeName3":{"S":"AttributeValue6"},
"AttributeName5":{"B":"dmFsdWU="}
}],
"LastEvaluatedKey":
{"HashKeyElement":{"S":"AttributeName1"},
"RangeKeyElement":{"N":"AttributeName2"},
"ConsumedCapacityUnits":1,
"ScannedCount":2}
}
Nombre Descripcin
Nombre Descripcin
Tipo: Number
Tipo: Number
Tipo: Number
Errores especiales
Error Descripcin
Ejemplos
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de operaciones de
examen (p. 443).
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.Scan
content-type: application/x-amz-json-1.0
{"TableName":"1-hash-rangetable","ScanFilter":{}}
Respuesta de ejemplo
HTTP/1.1 200
x-amzn-RequestId: 4e8a5fa9-71e7-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 465
{"Count":4,"Items":[{
"date":{"S":"1980"},
"fans":{"SS":["Dave","Aaron"]},
"name":{"S":"Airplane"},
"rating":{"S":"***"}
},{
"date":{"S":"1999"},
"fans":{"SS":["Ziggy","Laura","Dean"]},
"name":{"S":"Matrix"},
"rating":{"S":"*****"}
},{
"date":{"S":"1976"},
"fans":{"SS":["Riley"]},"
name":{"S":"The Shaggy D.A."},
"rating":{"S":"**"}
},{
"date":{"S":"1985"},
"fans":{"SS":["Fox","Lloyd"]},
"name":{"S":"Back To The Future"},
"rating":{"S":"****"}
}],
"ConsumedCapacityUnits":0.5
"ScannedCount":4}
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.Scan
content-type: application/x-amz-json-1.0
content-length: 125
{"TableName":"comp5",
"ScanFilter":
{"time":
{"AttributeValueList":[{"N":"400"}],
"ComparisonOperator":"GT"}
}
}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: PD1CQK9QCTERLTJP20VALJ60TRVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 262
Date: Mon, 15 Aug 2011 16:52:02 GMT
{"Count":2,
"Items":[
{"friends":{"SS":["Dave","Ziggy","Barrie"]},
"status":{"S":"chatting"},
"time":{"N":"2000"},
"user":{"S":"Casey"}},
{"friends":{"SS":["Dave","Ziggy","Barrie"]},
"status":{"S":"chatting"},
"time":{"N":"2000"},
"user":{"S":"Fredy"}
}],
"ConsumedCapacityUnits":0.5
"ScannedCount":4
}
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.Scan
content-type: application/x-amz-json-1.0
{"TableName":"comp5",
"Limit":2,
"ScanFilter":
{"time":
{"AttributeValueList":[{"N":"400"}],
"ComparisonOperator":"GT"}
},
"ExclusiveStartKey":
{"HashKeyElement":{"S":"Fredy"},"RangeKeyElement":{"N":"2000"}}
}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: PD1CQK9QCTERLTJP20VALJ60TRVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 232
Date: Mon, 15 Aug 2011 16:52:02 GMT
{"Count":1,
"Items":[
{"friends":{"SS":["Jane","James","John"]},
"status":{"S":"exercising"},
"time":{"N":"2200"},
"user":{"S":"Roger"}}
],
"LastEvaluatedKey":{"HashKeyElement":{"S":"Riley"},"RangeKeyElement":{"N":"250"}},
"ConsumedCapacityUnits":0.5
"ScannedCount":2
}
Acciones relacionadas
Consulta (p. 878)
BatchGetItem (p. 843)
UpdateItem
Important
Descripcin
Permite editar los atributos de un elemento. Puede realizar una actualizacin condicional, es decir,
insertar un nuevo par nombre-valor de atributo si no existe, o bien sustituir un par de nombre-valor si tiene
determinados valores de atributo esperados.
Note
Los atributos de clave principal no se pueden actualizar mediante UpdateItem. En lugar de ello,
debe eliminar el elemento y utilizar PutItem para crear otro con los nuevos atributos.
La operacin UpdateItem incluye un parmetro Action, que define cmo realizar la actualizacin. Puede
poner, eliminar o agregar valores de atributos.
Los valores de los atributos no pueden ser null; los atributos de tipo cadena y binario deben tener una
longitud superior a cero; y los atributos de tipo conjunto no pueden estar vacos. Las solicitudes con
valores vacos se rechazan con la excepcin ValidationException.
PUT: agrega el atributo especificado. Si el atributo existe, se sustituye por el nuevo valor.
DELETE: si no se especifica ningn valor, esta accin elimina el atributo y su valor. Si se especifica un
conjunto de valores, entonces los valores del conjunto especificado se eliminan del conjunto anterior.
Por lo tanto, si el valor del atributo contiene [a,b,c] y la accin de eliminacin contiene [a,c], el valor del
atributo final es [b]. El tipo del valor especificado debe coincidir con el tipo de valor existente. No es
vlido especificar un conjunto vaco.
ADD: la accin de adicin se utiliza para nmeros o si el atributo de destino es un conjunto (incluidos los
conjuntos de cadena). ADD no funciona si el atributo de destino es un valor de cadena nica o un valor
escalar de tipo Binary. El valor especificado se suma a un valor numrico (se suma o se resta al valor
numrico existente) o se agrega como valor adicional a un conjunto de cadenas. Si se especifica un
conjunto de valores, los valores se agregan al conjunto existente. Por ejemplo, si el conjunto original es
[1,2] y el valor suministrado es [3], despus de la operacin de adicin el conjunto ser [1,2,3] y no [4,5].
Se produce un error si se especifica una accin Add para un atributo de tipo Set y el tipo de atributo
especificado no coincide con el tipo de conjunto existente.
Si utiliza ADD para un atributo que no existe, el atributo y sus valores se agregan al elemento.
PUT: crea un elemento nuevo con la clave principal especificada. A continuacin, agrega el atributo
especificado.
DELETE: no sucede nada.
ADD: crea un elemento con la clave principal y el nmero (o el conjunto de nmeros) suministrados para
el valor del atributo. No es vlido para los tipos de cadena o binario.
Note
Si utiliza ADD para sumar o restar de un valor numrico de un elemento que no exista antes
de la actualizacin, DynamoDB utilizar 0 como valor inicial. Adems, si actualiza un elemento
mediante ADD para sumar o restar de un valor numrico de un atributo que no exista antes de la
actualizacin (pero el elemento s exista), DynamoDB utilizar 0 como valor inicial. Por ejemplo,
si utiliza ADD para sumar +3 a un atributo que no exista antes de la actualizacin, DynamoDB
utilizar 0 para el valor inicial y el valor posterior a la actualizacin ser 3.
Para obtener ms informacin sobre cmo usar esta operacin, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitudes
Sintaxis
{"TableName":"Table1",
"Key":
{"HashKeyElement":{"S":"AttributeValue1"},
"RangeKeyElement":{"N":"AttributeValue2"}},
"AttributeUpdates":{"AttributeName3":{"Value":
{"S":"AttributeValue3_New"},"Action":"PUT"}},
"Expected":{"AttributeName3":{"Value":{"S":"AttributeValue3_Current"}}},
"ReturnValues":"ReturnValuesConstant"
}
Tipo: String
Tipo: String
Tipo: String
"Expected" :
{"Color":{"Exists":false}}
"Expected" :
{"Color":{"Exists":true},
{"Value":{"S":"Yellow"}}}
De forma predeterminada, si se
utiliza el parmetro Expected
y se proporciona el valor de
Value, DynamoDB da por hecho
que el atributo existe y que posee
un valor que hay que sustituir.
Por lo tanto, no es preciso
especificar {"Exists":true},
porque se considera implcito.
Puede reducir la solicitud a:
"Expected" :
{"Color":{"Value":
{"S":"Yellow"}}}
Note
Si especifica
{"Exists":true} sin
un valor de atributo que
comprobar, DynamoDB
devuelve un error.
Tipo: String
Respuestas
Sintaxis
En el ejemplo de sintaxis siguiente se supone que la solicitud ha especificado un parmetro
ReturnValues de ALL_OLD; en caso contrario, la respuesta solo contiene la entrada
ConsumedCapacityUnits.
HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0
content-length: 140
{"Attributes":{
"AttributeName1":{"S":"AttributeValue1"},
"AttributeName2":{"S":"AttributeValue2"},
"AttributeName3":{"S":"AttributeValue3"},
"AttributeName5":{"B":"dmFsdWU="}
},
"ConsumedCapacityUnits":1
}
Nombre Descripcin
Nombre Descripcin
especificado como algo distinto de NONE en la
solicitud.
Tipo: Number
Errores especiales
Error Descripcin
Ejemplos
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de elementos en
DynamoDB (p. 340).
Solicitud de muestra
// This header is abbreviated. For a sample of a complete header, see API de bajo nivel de
DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.UpdateItem
content-type: application/x-amz-json-1.0
{"TableName":"comp5",
"Key":
{"HashKeyElement":{"S":"Julie"},"RangeKeyElement":{"N":"1307654350"}},
"AttributeUpdates":
{"status":{"Value":{"S":"online"},
"Action":"PUT"}},
"Expected":{"status":{"Value":{"S":"offline"}}},
"ReturnValues":"ALL_NEW"
}
Respuesta de ejemplo
HTTP/1.1 200 OK
x-amzn-RequestId: 5IMHO7F01Q9P7Q6QMKMMI3R3QRVV4KQNSO5AEMVJF66Q9ASUAAJG
content-type: application/x-amz-json-1.0
content-length: 121
Date: Fri, 26 Aug 2011 21:05:00 GMT
{"Attributes":
{"friends":{"SS":["Lynda, Aaron"]},
"status":{"S":"online"},
"time":{"N":"1307654350"},
"user":{"S":"Julie"}},
"ConsumedCapacityUnits":1
}
Acciones relacionadas
PutItem (p. 872)
DeleteItem (p. 858)
UpdateTable
Important
Esta seccin se refiere a la versin 2011-12-05 del API, que est
obsoleta y no debe utilizarse para nuevas aplicaciones.
Para la documentacin sobre el API de bajo nivel actual, consulte la Amazon DynamoDB API
Reference.
Descripcin
Actualiza el desempeo provisionado de la tabla en cuestin. Se puede configurar el desempeo
de una tabla para facilitar su administracin; esto forma parte de la caracterstica de desempeo
provisionado de DynamoDB. Para obtener ms informacin, consulte Ajustes de desempeo de lecturas y
escrituras (p. 305).
Los valores de desempeo provisionado se pueden aumentar o reducir segn los mximos o mnimos
indicados en Lmites en DynamoDB (p. 765).
La tabla debe encontrarse en el estado ACTIVE para poder realizar correctamente esta operacin.
UpdateTable es una operacin asncrona; es decir, mientras se ejecuta la operacin, la tabla se mantiene
en el estado UPDATING. Mientras la tabla se encuentra en el estado UPDATING, sigue teniendo el
desempeo provisionado previo a la llamada. La nueva configuracin de desempeo provisionado no entra
en vigor hasta que la tabla vuelve al estado ACTIVE despus de la operacin UpdateTable.
Solicitudes
Sintaxis
// This header is abbreviated.
// For a sample of a complete header, see API de bajo nivel de DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.UpdateTable
content-type: application/x-amz-json-1.0
{"TableName":"Table1",
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":15}
}
Tipo: Array
Tipo: Number
Tipo: Number
Respuestas
Sintaxis
HTTP/1.1 200 OK
x-amzn-RequestId: CSOC7TJPLR0OOKIRLGOHVAICUFVV4KQNSO5AEMVJF66Q9ASUAAJG
Content-Type: application/json
Content-Length: 311
Date: Tue, 12 Jul 2011 21:31:03 GMT
{"TableDescription":
{"CreationDateTime":1.321657838135E9,
"KeySchema":
{"HashKeyElement":{"AttributeName":"AttributeValue1","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"AttributeValue2","AttributeType":"N"}},
"ProvisionedThroughput":
{"LastDecreaseDateTime":1.321661704489E9,
"LastIncreaseDateTime":1.321663607695E9,
"ReadCapacityUnits":5,
"WriteCapacityUnits":10},
"TableName":"Table1",
"TableStatus":"UPDATING"}}
Nombre Descripcin
Tipo: Number
Tipo: Array
Tipo: String
Tipo: String
Errores especiales
Error Descripcin
Ejemplos
Solicitud de muestra
{"TableName":"comp1",
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":15}
}
Respuesta de ejemplo
HTTP/1.1 200 OK
content-type: application/x-amz-json-1.0
content-length: 390
Date: Sat, 19 Nov 2011 00:46:47 GMT
{"TableDescription":
{"CreationDateTime":1.321657838135E9,
"KeySchema":
{"HashKeyElement":{"AttributeName":"user","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"time","AttributeType":"N"}},
"ProvisionedThroughput":
{"LastDecreaseDateTime":1.321661704489E9,
"LastIncreaseDateTime":1.321663607695E9,
"ReadCapacityUnits":5,
"WriteCapacityUnits":10},
"TableName":"comp1",
"TableStatus":"UPDATING"}
}
Acciones relacionadas
CreateTable (p. 853)
DescribeTables (p. 865)
DeleteTable (p. 862)
Clave de particin,
denominada tambin atributo
hash.
Clave de ordenacin,
denominada tambin atributo
de intervalo.
De forma predeterminada, la
operacin Scan de DynamoDB
usa las lecturas consistentes
finales. Si lo prefiere, puede
establecer el parmetro
ConsistentRead en
true para usar lecturas de
consistencia alta. Para obtener
ms informacin, consulte
Consistencia de lectura de
Scan (p. 446) y Scan en la
Amazon DynamoDB API
Reference.
Java: DynamoDBMappper
.NET: modelo de documento
y modelo de persistencia de
objetos