Sunteți pe pagina 1din 936

Amazon DynamoDB

Developer Guide
API Version 2012-08-10
Amazon DynamoDB Developer Guide

Amazon DynamoDB: Developer Guide


Copyright 2017 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.
Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's, in any manner
that is likely to cause confusion among customers, or in any manner that disparages or discredits Amazon. All other trademarks not
owned by Amazon are the property of their respective owners, who may or may not be affiliated with, connected to, or sponsored by
Amazon.
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

API Version 2012-08-10


iii
Amazon DynamoDB Developer Guide

Paso 1: Crear una tabla .................................................................................................... 93


Paso 2: Carga de datos de ejemplo .................................................................................... 94
Paso 3: Crear, leer, actualizar y eliminar elementos ............................................................... 96
Paso 4: Consultar y examinar los datos .............................................................................. 103
Paso 5: (Opcional) Eliminar la tabla ................................................................................... 106
Resumen ....................................................................................................................... 107
.NET y DynamoDB .................................................................................................................. 107
Requisitos previos ........................................................................................................... 108
Paso 1: Crear una tabla ................................................................................................... 108
Paso 2: Carga de datos de ejemplo ................................................................................... 110
Paso 3: Crear, leer, actualizar y eliminar elementos .............................................................. 113
Paso 4: Consultar y examinar los datos .............................................................................. 126
Paso 5: (Opcional) Eliminar la tabla ................................................................................... 134
Resumen ....................................................................................................................... 135
PHP y DynamoDB .................................................................................................................. 136
Requisitos previos ........................................................................................................... 136
Paso 1: Crear una tabla ................................................................................................... 137
Paso 2: Carga de datos de ejemplo ................................................................................... 138
Paso 3: Crear, leer, actualizar y eliminar elementos .............................................................. 140
Paso 4: Consultar y examinar los datos .............................................................................. 148
Paso 5: (Opcional) Eliminar la tabla ................................................................................... 153
Resumen ....................................................................................................................... 153
Python y DynamoDB ............................................................................................................... 154
Requisitos previos ........................................................................................................... 155
Paso 1: Crear una tabla ................................................................................................... 155
Paso 2: Carga de datos de ejemplo ................................................................................... 156
Paso 3: Crear, leer, actualizar y eliminar elementos .............................................................. 158
Paso 4: Consultar y examinar los datos .............................................................................. 165
Paso 5: (Opcional) Eliminar la tabla ................................................................................... 169
Resumen ....................................................................................................................... 169
Ruby y DynamoDB .................................................................................................................. 169
Requisitos previos ........................................................................................................... 170
Paso 1: Crear una tabla ................................................................................................... 170
Paso 2: Carga de datos de ejemplo ................................................................................... 171
Paso 3: Crear, leer, actualizar y eliminar elementos .............................................................. 173
Paso 4: Consultar y examinar los datos .............................................................................. 180
Paso 5: (Opcional) Eliminar la tabla ................................................................................... 184
Resumen ....................................................................................................................... 184
Programacin con DynamoDB .......................................................................................................... 186
Informacin general sobre la compatibilidad de los SDK de AWS con DynamoDB .............................. 186
Interfaces de programacin ...................................................................................................... 188
Interfaces de bajo nivel .................................................................................................... 188
Interfaces de documentos ................................................................................................ 189
Interfaz de persistencia de objetos ..................................................................................... 190
API de bajo nivel de DynamoDB ............................................................................................... 192
Formato de las solicitudes ................................................................................................ 193
Formato de respuesta ...................................................................................................... 194
Descriptores de tipos de datos .......................................................................................... 194
Datos numricos ............................................................................................................. 195
Datos de tipo Binary ........................................................................................................ 195
Control de errores ................................................................................................................... 196
Componentes de un error ................................................................................................. 196
Mensajes y cdigos de error ............................................................................................. 196
Control de errores en la aplicacin .................................................................................... 199
Reintentos de error y retardo exponencial ........................................................................... 200
Operaciones por lotes y control de errores .......................................................................... 201
Interfaces de programacin de nivel superior para DynamoDB ....................................................... 201

API Version 2012-08-10


iv
Amazon DynamoDB Developer Guide

Java: DynamoDBMapper .................................................................................................. 202


.NET: modelo de documento ............................................................................................ 240
.NET: modelo de persistencia de objetos ............................................................................ 262
Cmo ejecutar los ejemplos de cdigo ....................................................................................... 290
Carga de ejemplos de datos ............................................................................................. 291
Ejemplos de cdigo Java ................................................................................................. 296
Ejemplos de cdigo de .NET ............................................................................................. 298
Uso de DynamoDB ......................................................................................................................... 301
Uso de tablas ......................................................................................................................... 301
Operaciones bsicas con tablas ........................................................................................ 302
Ajustes de desempeo de lecturas y escrituras .................................................................... 305
Tamao de los elementos y consumo de unidades de capacidad ............................................ 307
Administracin de la capacidad de desempeo con Auto Scaling ............................................ 309
Etiquetado para DynamoDB .............................................................................................. 327
Uso de tablas: Java ....................................................................................................... 329
Uso de tablas: .NET ........................................................................................................ 334
Uso de elementos ................................................................................................................... 340
Lectura de un elemento ................................................................................................... 341
Escritura de un elemento ................................................................................................. 342
Valores devueltos ............................................................................................................ 344
Operaciones por lotes ...................................................................................................... 345
Contadores atmicos ....................................................................................................... 347
Escrituras condicionales ................................................................................................... 347
Uso de expresiones en DynamoDB ................................................................................... 352
Tiempo de vida ............................................................................................................... 377
Uso de elementos: Java ................................................................................................... 382
Uso de elementos: .NET .................................................................................................. 402
Uso de consultas .................................................................................................................... 425
Expresiones de condicin de clave .................................................................................... 425
Expresiones de filtro para Query ....................................................................................... 427
Limitacin del nmero de elementos del conjunto de resultados ............................................. 428
Paginacin de los resultados ............................................................................................ 428
Recuento de los elementos de los resultados ...................................................................... 430
Unidades de capacidad que Query consume ....................................................................... 430
Consistencia de lectura de Query ...................................................................................... 431
Consultas: Java .............................................................................................................. 431
Consultas: .NET .............................................................................................................. 436
Uso de operaciones de examen ................................................................................................ 443
Expresiones de filtro para Scan ......................................................................................... 443
Limitacin del nmero de elementos del conjunto de resultados ............................................. 444
Paginacin de los resultados ............................................................................................ 444
Recuento de los elementos de los resultados ...................................................................... 445
Unidades de capacidad que Scan consume ........................................................................ 446
Consistencia de lectura de Scan ....................................................................................... 446
Examen en paralelo ........................................................................................................ 447
Examen: Java ................................................................................................................. 448
Examen: .NET ................................................................................................................ 456
Uso de ndices ....................................................................................................................... 463
ndices secundarios globales ............................................................................................ 466
ndices secundarios locales .............................................................................................. 505
Uso de secuencias .................................................................................................................. 540
Puntos de enlace de Flujos de DynamoDB ......................................................................... 542
Habilitacin de una secuencia ........................................................................................... 542
Lectura y procesamiento de secuencias ............................................................................. 544
Flujos de DynamoDB y Tiempo de vida .............................................................................. 545
Uso de Flujos de DynamoDB Kinesis Adapter para procesar registros de secuencia ................... 546
Tutorial: API de bajo nivel de Flujos de DynamoDB .............................................................. 557

API Version 2012-08-10


v
Amazon DynamoDB Developer Guide

Replicacin entre regiones ............................................................................................... 563


Disparadores de Flujos de DynamoDB y AWS Lambda ......................................................... 564
Acceleration en memoria con DAX .................................................................................................... 573
Casos de uso de DAX ............................................................................................................. 574
Notas de uso .......................................................................................................................... 574
Conceptos .............................................................................................................................. 575
Procesamiento de solicitudes en DAX ................................................................................ 576
Cach de elementos ........................................................................................................ 577
Cach de consultas ......................................................................................................... 577
Componentes de los clsteres de DAX ...................................................................................... 578
Nodos ............................................................................................................................ 578
Clsteres ....................................................................................................................... 578
Regiones y zonas de disponibilidad ................................................................................... 579
Grupos de parmetros ..................................................................................................... 580
Security Groups .............................................................................................................. 580
ARN del clster .............................................................................................................. 580
Punto de enlace de clster ............................................................................................... 580
Puntos de enlace de nodos .............................................................................................. 580
Grupos de subredes ........................................................................................................ 581
Eventos ......................................................................................................................... 581
Maintenance Window ....................................................................................................... 581
Creacin de un clster de DAX ................................................................................................. 582
Creacin de un rol de servicio de DAX ............................................................................... 582
AWS CLI ....................................................................................................................... 583
Consola de administracin de AWS ................................................................................... 587
Modelos de consistencia de DAX y DynamoDB ........................................................................... 589
Consistencia entre los nodos de los clsteres de DAX .......................................................... 589
Comportamiento de la cach de elementos de DAX ............................................................. 590
Comportamiento de la cach de consultas de DAX .............................................................. 592
Lecturas de consistencia alta ............................................................................................ 592
Almacenamiento en cach negativo ................................................................................... 593
Estrategias de escritura .................................................................................................... 593
Uso del cliente de DAX en una aplicacin .................................................................................. 595
Tutorial: Ejecucin de un ejemplo de aplicacin ................................................................... 596
Modificacin de una aplicacin existente para que use DAX .................................................. 613
Administracin de clsteres de DAX .......................................................................................... 617
Permisos de IAM para administrar clsteres de DAX ............................................................ 617
Personalizacin de los ajustes de un clster de DAX ............................................................ 619
Configuracin de los ajustes de TTL .................................................................................. 620
Compatibilidad con el etiquetado en DAX ........................................................................... 621
Integracin con AWS CloudTrail ........................................................................................ 622
Eliminacin de un clster de DAX ...................................................................................... 622
Control de acceso a DAX ......................................................................................................... 623
Rol de servicio de IAM para DAX ...................................................................................... 623
Poltica de IAM que permite el acceso a un clster de DAX ................................................... 624
Caso prctico: Acceso a DAX y a DynamoDB ..................................................................... 625
Acceso a DynamoDB, pero no con DAX ............................................................................. 626
Acceso a DynamoDB y a DAX .......................................................................................... 628
Acceso a DynamoDB a travs de DAX, pero sin acceso directo a DynamoDB ........................... 632
Referencia de la API de DAX ................................................................................................... 634
Autenticacin y control de acceso ...................................................................................................... 635
Autenticacin .......................................................................................................................... 635
Control de acceso ................................................................................................................... 636
Informacin general sobre la administracin de acceso ................................................................. 637
Recursos y operaciones de Amazon DynamoDB .................................................................. 637
Titularidad de los recursos ................................................................................................ 638
Administracin del acceso a los recursos ............................................................................ 638

API Version 2012-08-10


vi
Amazon DynamoDB Developer Guide

Especificar elementos de poltica: acciones, efectos y entidades principales ............................. 639


Especificacin de condiciones en una poltica ...................................................................... 640
Uso de polticas basadas en identidad (polticas de IAM) .............................................................. 640
Permisos de la consola .................................................................................................... 641
Polticas administradas (predefinidas) de AWS para Amazon DynamoDB ................................. 641
Ejemplos de polticas administradas por el cliente ................................................................ 642
Referencia de permisos del API de DynamoDB ........................................................................... 648
Temas relacionados ........................................................................................................ 652
Uso de condiciones ................................................................................................................. 652
Informacin general ......................................................................................................... 652
Especificacin de condiciones: uso de claves de condicin .................................................... 655
Temas relacionados ........................................................................................................ 662
Uso de identidades web federadas ............................................................................................ 663
Recursos adicionales para identidades web federadas .......................................................... 663
Ejemplo de poltica para identidades web federadas ............................................................. 663
Preparacin para usar las identidades web federadas ........................................................... 665
Cmo escribir la aplicacin para usar las identidades web federadas ....................................... 666
Monitorizacin de DynamoDB ........................................................................................................... 669
Herramientas de monitorizacin ................................................................................................. 670
Herramientas automatizadas ............................................................................................. 670
Herramientas manuales .................................................................................................... 670
Monitorizacin con Amazon CloudWatch .................................................................................... 671
Dimensiones y mtricas ................................................................................................... 671
Uso de las mtricas ........................................................................................................ 685
Creacin de alarmas ....................................................................................................... 686
Registro de operaciones de DynamoDB mediante AWS CloudTrail ................................................. 688
Informacin de DynamoDB en CloudTrail ............................................................................ 688
Descripcin de las entradas de archivos log de DynamoDB ................................................... 689
Prcticas recomendadas para DynamoDB .......................................................................................... 695
Prcticas recomendadas para tablas .......................................................................................... 695
Prcticas recomendadas para elementos .................................................................................... 695
Prcticas recomendadas para consultas y exmenes ................................................................... 696
Prcticas recomendadas para los ndices secundarios locales ........................................................ 696
Prcticas recomendadas para los ndices secundarios globales ...................................................... 696
Prcticas recomendadas para las tablas ..................................................................................... 697
Diseo para distribuir de forma uniforme el acceso a los datos entre los elementos de las tablas ... 697
Comprensin del comportamiento de las particiones ............................................................. 699
Utilice la capacidad de rfaga con moderacin .................................................................... 703
Distribuya la actividad de escritura al cargar los datos .......................................................... 703
Comprensin de los patrones de acceso en los datos de serie temporal .................................. 704
Almacene en la cach los elementos populares ................................................................... 705
Tenga en cuenta la uniformidad de las cargas de trabajo al ajustar el desempeo provisionado .... 705
Pruebe la aplicacin a gran escala .................................................................................... 706
Prcticas recomendadas para los elementos ............................................................................... 707
Use tablas de uno a varios en lugar de atributos de tipo Set de gran tamao ............................ 707
Comprima los valores de atributos grandes ......................................................................... 708
Almacene los valores de atributos grandes en Amazon S3 .................................................... 708
Divida los atributos grandes entre varios elementos .............................................................. 709
Prcticas recomendadas para consultar y examinar datos ............................................................. 710
Consideraciones sobre el desempeo de los exmenes ........................................................ 710
Evite los picos repentinos en la actividad de lectura ............................................................. 710
Cmo sacar partido de los exmenes en paralelo ................................................................ 712
Prcticas recomendadas para los ndices secundarios locales ........................................................ 713
Utilice los ndices con moderacin ..................................................................................... 713
Elija con cautela las proyecciones ..................................................................................... 713
Optimice las consultas frecuentes para evitar las recuperaciones ............................................ 714
Saque partido de los ndices dispersos .............................................................................. 714

API Version 2012-08-10


vii
Amazon DynamoDB Developer Guide

Vigile la expansin de las colecciones de elementos ............................................................ 715


Prcticas recomendadas para los ndices secundarios globales ...................................................... 715
Elija una clave que proporcione cargas de trabajo uniformes .................................................. 715
Saque partido de los ndices dispersos .............................................................................. 716
Utilice un ndice secundario global para realizar bsquedas rpidas ........................................ 716
Cree una rplica de lectura consistente final ....................................................................... 716
Integracin con otros servicios de AWS .............................................................................................. 718
Puntos de enlace de Amazon VPC para DynamoDB .................................................................... 718
Tutorial: Uso de un punto de conexin de la VPC para DynamoDB ......................................... 720
Integracin con Amazon Cognito ............................................................................................... 725
Integracin con Amazon Redshift .............................................................................................. 726
Integracin con Amazon EMR ................................................................................................... 727
Informacin general ......................................................................................................... 728
Tutorial: Uso de Amazon DynamoDB y Apache Hive ............................................................ 728
Crear una tabla externa en Hive ........................................................................................ 735
Procesamiento de instrucciones de HiveQL ......................................................................... 737
Consulta de datos en DynamoDB ...................................................................................... 738
Copia de datos en y desde Amazon DynamoDB .................................................................. 740
Ajuste del desempeo ..................................................................................................... 751
Integracin con AWS Data Pipeline ........................................................................................... 755
Requisitos previos para exportar e importar datos ................................................................ 757
Exportacin de datos de DynamoDB a Amazon S3 .............................................................. 761
Importacin de datos de Amazon S3 a DynamoDB .............................................................. 761
Solucin de problemas ..................................................................................................... 763
Plantillas predefinidas para AWS Data Pipeline y DynamoDB ................................................. 763
Lmites en DynamoDB ..................................................................................................................... 765
Unidades de capacidad y desempeo provisionado ...................................................................... 765
Tamaos de unidades de capacidad .................................................................................. 765
Descripcin de los lmites de desempeo aprovisionados predeterminados ............................... 765
Aumento de desempeo provisionado ................................................................................ 766
Reduccin de desempeo provisionado .............................................................................. 766
Tablas ................................................................................................................................... 767
Tamao de la tabla ......................................................................................................... 767
Tablas por cuenta ........................................................................................................... 767
ndices secundarios ................................................................................................................. 767
ndices secundarios por tabla ............................................................................................ 767
Atributos de ndice secundario proyectados por tabla ............................................................ 767
Claves de particin y claves de ordenacin ................................................................................. 767
Longitud de la clave de particin ....................................................................................... 767
Valores de clave de particin ............................................................................................ 768
Longitud de la clave de ordenacin ................................................................................... 768
Valores de clave de ordenacin ........................................................................................ 768
Reglas de nomenclatura ........................................................................................................... 768
Nombres de las tablas y de los ndices secundarios ............................................................. 768
Nombres de los atributos ................................................................................................. 768
Tipos de datos ........................................................................................................................ 769
Cadena .......................................................................................................................... 769
Nmero ......................................................................................................................... 769
Binary ............................................................................................................................ 769
Elementos .............................................................................................................................. 769
Tamao de elemento ....................................................................................................... 769
Tamao de los elementos en las tablas con ndices secundarios locales .................................. 769
Atributos ................................................................................................................................ 770
Pares de nombre-valor de los atributos por elemento ........................................................... 770
Nmero de valores de una lista, un mapa o un conjunto ....................................................... 770
Valores de los atributos ................................................................................................... 770
Profundidad de los atributos anidados ................................................................................ 770

API Version 2012-08-10


viii
Amazon DynamoDB Developer Guide

Parmetros de expresin ......................................................................................................... 770


Longitudes ..................................................................................................................... 770
Operadores y operandos .................................................................................................. 770
Palabras reservadas ........................................................................................................ 771
Flujos de DynamoDB ............................................................................................................... 771
Lectores simultneos de un fragmento en Flujos de DynamoDB ............................................. 771
Capacidad de escritura mxima de una tabla con Streams habilitado ...................................... 771
DynamoDB Accelerator (DAX) ................................................................................................... 771
Disponibilidad en las regiones de AWS .............................................................................. 771
Nodos ............................................................................................................................ 772
Grupos de parmetros ..................................................................................................... 772
Grupos de subredes ........................................................................................................ 772
Lmites especficos de API ....................................................................................................... 772
Apndice ........................................................................................................................................ 773
Ejemplos de tablas y datos ....................................................................................................... 773
Ejemplos de archivos de datos ......................................................................................... 774
Creacin de ejemplos de tablas y carga de datos ........................................................................ 783
Creacin de ejemplos de tablas y carga de datos: Java ........................................................ 783
Creacin de ejemplos de tablas y carga de datos: .NET ........................................................ 790
Ejemplo de aplicacin con el AWS SDK para Python (Boto) .......................................................... 798
Paso 1: Implementar y probar localmente ........................................................................... 799
Paso2: Examinar el modelo de datos y los detalles de implementacin ................................... 802
Paso3: Implementar en produccin ................................................................................... 809
Paso 4: Eliminar recursos ................................................................................................. 815
Amazon DynamoDB Storage Backend for Titan ........................................................................... 815
Palabras reservadas en DynamoDB ........................................................................................... 815
Parmetros condicionales heredados ......................................................................................... 824
AttributesToGet ............................................................................................................... 825
AttributeUpdates .............................................................................................................. 826
ConditionalOperator ......................................................................................................... 828
Expected ........................................................................................................................ 828
KeyConditions ................................................................................................................. 832
QueryFilter ..................................................................................................................... 833
ScanFilter ....................................................................................................................... 835
Escritura de condiciones con parmetros heredados ............................................................. 836
Versin actual del API de bajo nivel (2012-08-10) ........................................................................ 842
Versin anterior del API de bajo nivel (2011-12-05) ...................................................................... 842
BatchGetItem .................................................................................................................. 843
BatchWriteItem ............................................................................................................... 848
CreateTable .................................................................................................................... 853
DeleteItem ...................................................................................................................... 858
DeleteTable .................................................................................................................... 862
DescribeTables ............................................................................................................... 865
GetItem ......................................................................................................................... 868
ListTables ...................................................................................................................... 870
PutItem .......................................................................................................................... 872
Consulta ........................................................................................................................ 878
Examen ......................................................................................................................... 887
UpdateItem ..................................................................................................................... 899
UpdateTable ................................................................................................................... 905
Historial de revisin ......................................................................................................................... 909

API Version 2012-08-10


ix
Amazon DynamoDB Developer Guide

Qu es Amazon DynamoDB?

Bienvenido a la Gua para desarrolladores de 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.

Le recomendamos que comience leyendo las secciones siguientes:

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:

Programacin con DynamoDB y los SDK de AWS (p. 186)

API Version 2012-08-10


1
Amazon DynamoDB Developer Guide
Funcionamiento

Uso de DynamoDB (p. 301)

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.

Amazon DynamoDB: funcionamiento


En las secciones siguientes se incluye informacin general sobre los componentes del servicio de Amazon
DynamoDB y las interacciones entre ellos.

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)

Componentes bsicos de DynamoDB


En DynamoDB se trabaja principalmente con tablas, elementos y atributos. Una tabla es una coleccin
de elementos y cada elemento es una coleccin de atributos. DynamoDB utiliza claves principales
para identificar de forma exclusiva cada uno de los elementos de la tabla e ndices secundarios para
proporcionar mayor flexibilidad a la hora de realizar consultas. Puede utilizar Flujos de DynamoDB para
capturar los eventos de modificacin de datos en las tablas de DynamoDB.

En DynamoDB se aplican algunos lmites. Para obtener ms informacin, consulte Lmites en


DynamoDB (p. 765).

Temas
Tablas, elementos y atributos (p. 3)
Clave principal (p. 6)
ndices secundarios (p. 7)

API Version 2012-08-10


2
Amazon DynamoDB Developer Guide
Componentes bsicos

Flujos de DynamoDB (p. 9)

Tablas, elementos y atributos


A continuacin, se indican los componentes bsicos de DynamoDB:

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.

API Version 2012-08-10


3
Amazon DynamoDB Developer Guide
Componentes bsicos

Tenga en cuenta lo siguiente en relacin con la tabla People:

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.

API Version 2012-08-10


4
Amazon DynamoDB Developer Guide
Componentes bsicos

Tenga en cuenta lo siguiente en relacin con la tabla Music:

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.

API Version 2012-08-10


5
Amazon DynamoDB Developer Guide
Componentes bsicos

Para obtener ms informacin, consulte Uso de tablas en DynamoDB (p. 301).

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.

DynamoDB admite dos tipos distintos de clave principal:

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.

DynamoDB admite dos tipos de ndices:

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.

API Version 2012-08-10


7
Amazon DynamoDB Developer Guide
Componentes bsicos

Tenga en cuenta lo siguiente en relacin con el ndice GenreAlbumTitle:

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.

API Version 2012-08-10


8
Amazon DynamoDB Developer Guide
Componentes bsicos

DynamoDB mantiene los ndices automticamente. Al agregar, actualizar o eliminar un elemento de


la tabla base, DynamoDB agrega, actualiza o elimina el elemento correspondiente en los ndices que
pertenecen a dicha tabla.
Al crear un ndice, se especifica qu atributos de la tabla base se copiarn, o proyectarn, en el ndice.
Como mnimo, DynamoDB proyecta en el ndice los atributos de clave de la tabla base. Esto es lo que
sucede con el ndice GenreAlbumTitle, en el que nicamente se proyectan los atributos de clave de la
tabla Music.

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.

API Version 2012-08-10


9
Amazon DynamoDB Developer Guide
API de DynamoDB

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)

API Version 2012-08-10


10
Amazon DynamoDB Developer Guide
API de DynamoDB

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

API Version 2012-08-10


11
Amazon DynamoDB Developer Guide
Reglas de nomenclatura y tipos de datos

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.

Reglas de nomenclatura y tipos de datos


En esta seccin se describen las reglas de nomenclatura de DynamoDB y los distintos tipos de datos
que DynamoDB admite. Existen lmites que se aplican los tipos de datos. Para obtener ms informacin,
consulte Tipos de datos (p. 769).

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.

A continuacin, se indican las reglas de nomenclatura de DynamoDB:

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

API Version 2012-08-10


12
Amazon DynamoDB Developer Guide
Reglas de nomenclatura y tipos de datos

A-Z
0-9
_ (guion bajo)
- (guion)
. (punto)
Los nombres de los atributos deben tener entre 1 y 255caracteres.

Palabras reservadas y caracteres especiales


DynamoDB tiene una lista de palabras reservadas y caracteres especiales. Para obtener una lista
completa de palabras reservadas de DynamoDB, consulte Palabras reservadas en DynamoDB (p. 815).
Tambin los siguientes caracteres tienen un significado especial en DynamoDB: # (almohadilla) y : (dos
puntos).

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:

API Version 2012-08-10


13
Amazon DynamoDB Developer Guide
Reglas de nomenclatura y tipos de datos

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

Para obtener ms informacin, consulte http://en.wikipedia.org/wiki/ISO_8601.

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.

Rango de valores positivos: de 1E-130 a 9.9999999999999999999999999999999999999E+125


Rango de valores negativos: de -9.9999999999999999999999999999999999999E+125 a -1E-130

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.

Para obtener ms informacin, consulte http://en.wikipedia.org/wiki/Unix_time.

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:

API Version 2012-08-10


14
Amazon DynamoDB Developer Guide
Reglas de nomenclatura y tipos de datos

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

Un atributo de tipo Boolean puede almacenar los valores true o false.

Null

Null representa un atributo con un estado desconocido o sin definir.

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:

FavoriteThings: ["Cookies", "Coffee", 3.14159]

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).

API Version 2012-08-10


15
Amazon DynamoDB Developer Guide
Consistencia de lectura

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.

En el siguiente ejemplo se muestra un conjunto de cadenas, un conjunto de nmeros y un conjunto de


valores binarios:

["Black", "Green" ,"Red"]

[42.2, -19, 7.5, 3.14]

["U3Vubnk=", "UmFpbnk=", "U25vd3k="]

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

API Version 2012-08-10


16
Amazon DynamoDB Developer Guide
Capacidad de desempeo

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.

DynamoDB admite las lecturas consistentes finales y de consistencia alta.

Lecturas consistentes finales

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.

Lecturas de consistencia alta

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.

Capacidad de desempeo para lecturas y escrituras


Temas
Funcin Auto Scaling de DynamoDB (p. 18)
Desempeo provisionado (p. 19)
Capacidad reservada (p. 19)

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.

La capacidad de desempeo se especifica en unidades de capacidad de lectura y de escritura:

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.

API Version 2012-08-10


17
Amazon DynamoDB Developer Guide
Capacidad de desempeo

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.

DynamoDB proporciona los siguientes mecanismos para administrar el desempeo:

Funcin Auto Scaling de DynamoDB


Desempeo provisionado
Capacidad reservada

Funcin Auto Scaling de DynamoDB


La funcin Auto Scaling de DynamoDB administra activamente la capacidad de desempeo de las tablas
y los ndices secundarios globales. Con Auto Scaling, se define un rango (los lmites superior e inferior) de
unidades de capacidad de lectura y escritura. Tambin se definir un porcentaje de objetivo de utilizacin
comprendido en ese rango. La funcin Auto Scaling de DynamoDB intenta mantener el objetivo de
utilizacin aunque la carga de trabajo de la aplicacin aumente o disminuya.

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.

API Version 2012-08-10


18
Amazon DynamoDB Developer Guide
Capacidad de desempeo

Para obtener ms informacin, consulte Administracin automtica de la capacidad de desempeo con la


funcin Auto Scaling de DynamoDB (p. 309).

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:

3 KB / 4 KB = 0,75, o 1unidad de capacidad de lectura

En este caso, deber establecer el nivel de desempeo provisionado de la tabla en 80unidades de


capacidad de lectura:

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

En este caso, es conveniente establecer el nivel de desempeo de escritura provisionado de la tabla en


100unidades de capacidad de escritura:

1unidad de capacidad de escritura por elemento 100escrituras por segundo = 100unidades de


capacidad de escritura

Para obtener ms informacin, consulte Tamao de los elementos y consumo de unidades de


capacidad (p. 307).

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).

API Version 2012-08-10


19
Amazon DynamoDB Developer Guide
Partitions y distribucin de datos

Partitions y distribucin de datos


DynamoDB almacena los datos en las particiones. Una particin es una asignacin de almacenamiento
a una tabla que se sustenta en discos de estado slido (SSD) y se replica automticamente en varias
zonas de disponibilidad de una regin de AWS. DynamoDB se encarga de todo lo que concierne a la
administracin de las particiones para que usted no tenga que ocuparse de ello.

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.

DynamoDB asigna particiones adicionales a una tabla en las siguientes situaciones:

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.

Distribucin de datos: clave de particin


Si la tabla tiene una clave principal simple (solo clave de particin), DynamoDB almacenar y recuperar
cada elemento basndose en su valor de clave de particin.

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.

API Version 2012-08-10


20
Amazon DynamoDB Developer Guide
Partitions y distribucin de datos

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).

Distribucin de datos: clave de particin y clave de ordenacin


Si la tabla tiene una clave principal compuesta (clave de particin y clave de ordenacin), DynamoDB
calcula el valor hash de la clave de particin del mismo modo que se describe en Distribucin de datos:
clave de particin (p. 20). Sin embargo, almacena todos los elementos que tienen el mismo valor
de clave de particin en ubicaciones fsicamente contiguas, ordenadas segn el valor de la clave de
ordenacin.

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.

API Version 2012-08-10


21
Amazon DynamoDB Developer Guide
Partitions y distribucin de datos

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).

API Version 2012-08-10


22
Amazon DynamoDB Developer Guide
De SQL a NoSQL

Note

En una tabla de DynamoDB, no existe ningn lmite superior respecto al nmero de


valores diferentes de clave de ordenacin por cada valor de clave de particin. Si necesita
almacenar muchos miles de millones de elementos Dog en la tabla Pets, DynamoDB asigna
automticamente almacenamiento suficiente para satisfacer este requisito.

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

API Version 2012-08-10


23
Amazon DynamoDB Developer Guide
SQL o NoSQL?

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:

Caracterstica Sistema de bases de datos Amazon DynamoDB


relacionales (RDBMS)

Cargas de trabajo ptimas Consultas ad-hoc; Aplicaciones a escala Web,


almacenamiento de datos; OLAP tales como redes sociales,
(procesamiento analtico online). juegos, intercambio de contenido
multimedia o Internet de las
cosas (IoT).

Modelo de datos El modelo relacional requiere un DynamoDB no utiliza ningn


esquema bien definido, cuyos esquema. Cada tabla debe
datos estn normalizados en tener una clave principal para
tablas, filas y columnas. Adems, identificar cada elemento de
se definen todas las relaciones datos de forma exclusiva, pero
entre las tablas, las columnas, no existen restricciones similares
los ndices y otros componentes para otros atributos que no son
de las bases de datos. de clave. DynamoDB puede
administrar datos estructurados o
semiestructurados, incluidos los
documentos JSON.

Acceso a los datos SQL (Structured Query Puede utilizar la Consola de


Language) es el lenguaje administracin de AWS o la AWS
de consulta estndar para CLI para trabajar con DynamoDB
almacenar y recuperar datos. y llevar a cabo tareas ad-hoc.
Las bases de datos relacionales Las aplicaciones pueden sacar
ofrecen un amplio conjunto de partido de los kits de desarrollo
herramientas que simplifican el de software (SDK, por sus siglas
desarrollo de las aplicaciones en ingls) de AWS para trabajar
basadas en bases de datos, pero con DynamoDB a travs de
en todas estas herramientas se interfaces basadas en objetos,
utiliza SQL. centradas en documentos o de
bajo nivel.

Desempeo Las bases de datos relacionales DynamoDB est optimizado


estn optimizadas para el para la computacin, por lo
almacenamiento, de modo que, que el desempeo depende
por lo general, su desempeo principalmente del hardware
depende del subsistema de subyacente y de la latencia de
disco. Los desarrolladores la red. Al tratarse de un servicio
y administradores de bases administrado, DynamoDB
de datos deben optimizar las desvincula al desarrollador y
consultas, los ndices y la a sus aplicaciones de estos
estructura de las tablas para detalles de implementacin, para
lograr el mximo desempeo. que pueda centrarse en disear y
crear aplicaciones slidas de alto
desempeo.

Escalado Resulta ms fcil de escalar DynamoDB se ha diseado


con un hardware ms rpido. para ser escalable por medio
Adems, es posible que las de clsteres de hardware
tablas de la base de datos distribuidos. Este diseo permite

API Version 2012-08-10


24
Amazon DynamoDB Developer Guide
Acceso a la base de datos

Caracterstica Sistema de bases de datos Amazon DynamoDB


relacionales (RDBMS)
abarquen varios hosts en un obtener un desempeo mejorado
sistema distribuido, pero para ello sin aumentar la latencia. Los
se requiere una mayor inversin. clientes especificar sus requisitos
Las bases de datos relacionales de desempeo y DynamoDB
presentan tamaos mximos en asigna recursos suficientes para
atencin al nmero y al tamao satisfacer estos requisitos. No
de los archivos, lo que impone hay lmite en cuanto al nmero
lmites mximos de escalabilidad. de elementos por tabla, ni al
tamao total de dicha tabla.

Acceso a la base de datos


Para que la aplicacin pueda obtener acceso a una base de datos, previamente se debe autenticar con el
fin de verificar que tiene permiso para usarla y autorizar para que la aplicacin nicamente pueda llevar a
cabo aquellas acciones para cuya ejecucin tiene permiso.

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:

Caracterstica Sistema de bases de datos Amazon DynamoDB


relacionales (RDBMS)

Herramientas para obtener La mayora de las bases de En la mayora de los casos, el


acceso a la base de datos datos relacionales ofrecen una desarrollador debe escribir el
interfaz de lnea de comandos cdigo de aplicacin. Tambin
(CLI), que permite especificar puede usar la Consola de
instrucciones SQL ad-hoc y administracin de AWS o la AWS

API Version 2012-08-10


25
Amazon DynamoDB Developer Guide
Acceso a la base de datos

Caracterstica Sistema de bases de datos Amazon DynamoDB


relacionales (RDBMS)
ver los resultados de forma Command Line Interface (AWS
inmediata. CLI) para enviar solicitudes
ad-hoc a DynamoDB y ver los
resultados.

Conexin a la base de datos Un programa de aplicacin DynamoDB es un servicio web y


establece y mantiene una las interacciones con l no tienen
conexin de red con la base estado. Las aplicaciones no
de datos. Cuando la aplicacin tienen que mantener conexiones
finaliza, termina la conexin. de red persistentes. En lugar
de ello, la interaccin con
DynamoDB se produce mediante
solicitudes y respuestas
HTTP(S).

Autenticacin Una aplicacin no puede Cada solicitud de DynamoDB


conectarse a la base de datos debe ir acompaada de una firma
hasta que se ha autenticado. criptogrfica, que autentica esa
El RDBMS puede llevar a cabo solicitud concreta. Los SDK de
la autenticacin por s mismo, AWS proporcionan toda la lgica
o bien delegar esta tarea en el necesaria para crear firmas y
sistema operativo host o en un firmar solicitudes. Para obtener
servicio de directorio. ms informacin, consulte Firma
de solicitudes de la API de AWS
en AWS General Reference.

Autorizacin Las aplicaciones solo pueden En DynamoDB, la autorizacin


llevar a cabo aquellas acciones se administra mediante AWS
para las cuales tienen permiso. Identity and Access Management
Los administradores de bases (IAM). Puede escribir una poltica
de datos o los propietarios de las de IAM que conceda permisos
aplicaciones pueden utilizar las para un recurso de DynamoDB
instrucciones GRANT y REVOKE (por ejemplo, una tabla) y, a
de SQL para controlar el acceso continuacin, permitir a los
a los objetos de base de datos usuarios y los roles de IAM
(tales como las tablas), los que utilicen esa poltica. IAM
datos (como las filas de una tambin presenta control de
tabla) o la capacidad de emitir acceso preciso a los elementos
determinadas instrucciones de de datos individuales contenidos
SQL. en las tablas de DynamoDB.
Para obtener ms informacin,
consulte Autenticacin y
control de acceso de Amazon
DynamoDB (p. 635).

Envo de una solicitud La aplicacin emite una La aplicacin enva solicitudes


instruccin de SQL para todas HTTP(S) a DynamoDB. Las
las operaciones de base de solicitudes contienen el nombre
datos que quiere realizar. Al de la operacin de DynamoDB
recibir la instruccin de SQL, el que hay que realizar, junto con
RDBMS comprueba su sintaxis, los parmetros. DynamoDB
crea un plan para realizar la ejecuta la solicitud de forma
operacin y, a continuacin, inmediata.
ejecuta el plan.

API Version 2012-08-10


26
Amazon DynamoDB Developer Guide
Creacin de una tabla

Caracterstica Sistema de bases de datos Amazon DynamoDB


relacionales (RDBMS)

Recepcin de una respuesta El RDBMS devuelve los DynamoDB devuelve una


resultados de la instruccin de respuesta HTTP(S) que contiene
SQL. Si se produce un error, el los resultados de la operacin. Si
RDBMS devuelve un estado de se produce un error, DynamoDB
error y un mensaje. devuelve un estado de error de
HTTP y uno o varios mensajes.

Creacin de una tabla


Las tablas son las estructuras de datos fundamentales tanto en las bases de datos relacionales como en
DynamoDB. Un sistema de administracin de bases de datos relacionales (RDBMS) requiere que se defina
el esquema de la tabla al crearla. En cambio, las tablas de DynamoDB no tienen esquemas. Por lo tanto,
salvo la clave principal, no hay que definir ningn atributo ni tipo de datos en el momento de crear la tabla.

SQL
Use la instruccin CREATE TABLE para crear una tabla, como se muestra en el ejemplo siguiente.

CREATE TABLE Music (


Artist VARCHAR(20) NOT NULL,
SongTitle VARCHAR(30) NOT NULL,
AlbumTitle VARCHAR(25),
Year INT,
Price FLOAT,
Genre VARCHAR(10),
Tags TEXT,
PRIMARY KEY(Artist, SongTitle)
);

La clave principal de esta tabla consta de Artist y SongTitle.

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.

Muchas implementaciones de SQL permiten definir especificaciones de almacenamiento de la tabla en la


propia instruccin CREATE TABLE. A menos que se indique otra cosa, la tabla se crea con los ajustes de
almacenamiento predeterminados. En un entorno de produccin, un administrador de base de datos puede
ayudar a determinar los parmetros de almacenamiento ptimos.

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

API Version 2012-08-10


27
Amazon DynamoDB Developer Guide
Obtencin de informacin sobre una tabla

}
],
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).

Debe proporcionar los siguientes parmetros a CreateTable:

TableName: nombre de la tabla.


KeySchema: atributos que se utilizan para la clave principal. Para obtener ms informacin, consulte
Tablas, elementos y atributos (p. 3) y Clave principal (p. 6).
AttributeDefinitions: tipos de datos de los atributos del esquema de claves.
ProvisionedThroughput: nmero de lecturas y escrituras por segundo que se requieren para esta
tabla. DynamoDB reserva recursos de almacenamiento y del sistema suficientes para cumplir en todo
momento los requisitos de desempeo. Puede usar la accin UpdateTable para cambiar estos valores
ms adelante si fuera preciso. No es necesario especificar los requisitos de almacenamiento de una
tabla, porque DynamoDB se encarga de administrar todas las asignaciones del almacenamiento.

Note

Para obtener ejemplos de cdigo en los que se utiliza CreateTable, consulte Introduccin a
DynamoDB (p. 55).

Obtencin de informacin sobre una tabla


Puede comprobar que una tabla se ha creado de acuerdo con sus especificaciones. En una base de datos
relacional, se muestra el esquema completo de la tabla. Las tablas de DynamoDB no tienen esquema, por
lo que solo se muestran los atributos de clave principal.

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:

+------------+-------------+------+-----+---------+-------+

API Version 2012-08-10


28
Amazon DynamoDB Developer Guide
Escritura de datos en una tabla

| Field | Type | Null | Key | Default | Extra |


+------------+-------------+------+-----+---------+-------+
| Artist | varchar(20) | NO | PRI | NULL | |
| SongTitle | varchar(30) | NO | PRI | NULL | |
| AlbumTitle | varchar(25) | YES | | NULL | |
| Year | int(11) | YES | | NULL | |
| Price | float | YES | | NULL | |
| Genre | varchar(10) | YES | | NULL | |
| Tags | text | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+

La clave principal de esta tabla consta de Artist y SongTitle.

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"
}

La respuesta de DescribeTable tiene este aspecto:

{
"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.

Escritura de datos en una tabla


Las tablas de las bases de datos relacionales contienen filas de datos. Las filas constan de columnas.

Las tablas de DynamoDB contienen elementos. Los elementos constan de atributos.

En esta seccin se describe cmo escribir una fila (o un elemento) en una tabla.

API Version 2012-08-10


29
Amazon DynamoDB Developer Guide
Escritura de datos 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:

INSERT INTO Music


(Artist, SongTitle, AlbumTitle,
Year, Price, Genre,
Tags)
VALUES(
'No One You Know', 'Call Me Today', 'Somewhat Famous',
2015, 2.14, 'Country',
'{"Composers": ["Smith", "Jones","Davis"],"LengthInSeconds": 214}'
);

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.

API Version 2012-08-10


30
Amazon DynamoDB Developer Guide
Escritura de datos en una tabla

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).

A continuacin se muestran algunos otros ejemplos de PutItem.

{
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"
}
}
}

API Version 2012-08-10


31
Amazon DynamoDB Developer Guide
Lectura de datos de una tabla

TableName: "Music",
Item: {
"Artist": "The Acme Band",
"SongTitle": "Look Out, World",
"AlbumTitle":"The Buck Starts Here",
"Price": 0.99,
"Genre": "Rock"
}
}

Note

Adems de PutItem, Amazon DynamoDB admite la accin BatchWriteItem para escribir


varios elementos a la vez.

Lectura de datos de una tabla


Con SQL, se utiliza la instruccin SELECT para recuperar una o varias filas de una tabla. Se utiliza la
clusula WHERE para determinar qu datos se devuelven.

DynamoDB ofrece las siguientes operaciones para leer los datos:

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)

Lectura de un elemento usando su clave principal


Un patrn de acceso habitual de acceso a las bases de datos consiste en leer un nico elemento de una
tabla. Es preciso especificar la clave principal del elemento que se desea.

API Version 2012-08-10


32
Amazon DynamoDB Developer Guide
Lectura de datos de una tabla

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:

SELECT AlbumTitle, Year, Price


FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'

Observe que la clave principal de esta tabla consta de Artist y SongTitle.

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"
}

Observe que la clave principal de esta tabla consta de Artist y SongTitle.

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).

API Version 2012-08-10


33
Amazon DynamoDB Developer Guide
Lectura de datos de una tabla

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).

Consulta de una tabla


Otro patrn de acceso habitual consiste en leer varios elementos de una tabla, segn los criterios de
consulta.

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 a single song, by primary key */

SELECT * FROM Music


WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today';

/* Return all of the songs by an artist */

SELECT * FROM Music


WHERE Artist='No One You Know';

/* Return all of the songs by an artist, matching first part of title */

SELECT * FROM Music


WHERE Artist='No One You Know' AND SongTitle LIKE '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 */

SELECT * FROM Music


WHERE Artist='No One You Know' AND SongTitle LIKE '%Today%'
AND Price < 1.00;

Observe que la clave principal de esta tabla consta de Artist y SongTitle.

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).)

API Version 2012-08-10


34
Amazon DynamoDB Developer Guide
Lectura de datos de una tabla

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.

En DynamoDB, debe usar ExpressionAttributeValues como marcador de posicin en los


parmetros de las expresiones (tales como KeyConditionExpression y FilterExpression). Esto
es anlogo al uso de las variables de vnculo de las bases de datos relacionales, que se sustituyen en la
instruccin SELECT por los valores reales en tiempo de ejecucin.

Observe que la clave principal de esta tabla consta de Artist y SongTitle.

A continuacin encontrar algunos ejemplos de Query en DynamoDB:

// Return a single song, by primary key

{
TableName: "Music",
KeyConditionExpression: "Artist = :a and SongTitle = :t",
ExpressionAttributeValues: {
":a": "No One You Know",
":t": "Call Me Today"
}
}

// Return all of the songs by an artist

{
TableName: "Music",
KeyConditionExpression: "Artist = :a",
ExpressionAttributeValues: {
":a": "No One You Know"
}
}

// Return all of the songs by an artist, matching first part of title

{
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

API Version 2012-08-10


35
Amazon DynamoDB Developer Guide
Lectura de datos de una tabla

}
}

Note

Para obtener ejemplos de cdigo en los que se utiliza Query, consulte Introduccin a
DynamoDB (p. 55).

Examen de una tabla


En SQL, una instruccin SELECT sin clusula WHERE devuelve todas las filas de la tabla. En DynamoDB, la
operacin Scan hace lo mismo. En ambos casos, puede recuperar todos los elementos o solo algunos de
ellos.

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 (*).

Estos son algunos ejemplos:

/* Return all of the data in the table */


SELECT * FROM Music;

/* Return all of the values for Artist and Title */


SELECT Artist, Title FROM Music;

DynamoDB
DynamoDB proporciona la accin Scan, cuyo funcionamiento es parecido. Estos son algunos ejemplos:

// Return all of the data in the table


{
TableName: "Music"
}

// Return all of the values for Artist and Title


{
TableName: "Music",
ProjectionExpression: "Artist, Title"
}

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.

API Version 2012-08-10


36
Amazon DynamoDB Developer Guide
Administracin de ndices

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.

En MySQL, puede crear un ndice como se indica a continuacin:

CREATE INDEX GenreAndPriceIndex


ON Music (genre, price);

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.

DynamoDB admite dos tipos de ndices:

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.

API Version 2012-08-10


37
Amazon DynamoDB Developer Guide
Administracin de ndices

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
}
}
}
]
}

Debe proporcionar los siguientes parmetros a UpdateTable:

TableName: tabla a la que se asociar el ndice.


AttributeDefinitions: tipos de datos de los atributos de esquema de claves del ndice.
GlobalSecondaryIndexUpdates: detalles sobre el ndice que se desea crear.
IndexName: nombre del ndice.
KeySchema: atributos utilizados para la clave principal del ndice.
Projection: atributos de la tabla que se copian en el ndice. En este caso, ALL significa que se
copian todos los atributos.
ProvisionedThroughput: nmero de lecturas y escrituras por segundo que se requieren para este
ndice. Este valor es independiente de los ajustes de desempeo provisionado de la tabla.

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).

Consulta y examen de un ndice


SQL
En una base de datos relacional, no se trabajar directamente con los ndices. En lugar de ello, se consultan
las tablas mediante instrucciones SELECT y el optimizador de consultas utiliza los ndices, si los hay.

API Version 2012-08-10


38
Amazon DynamoDB Developer Guide
Administracin de ndices

Un optimizador de consultas es un componente del sistema de administracin de bases de datos


relacionales (RDBMS) que se encarga de evaluar los ndices disponibles y determinar si se pueden utilizar
para agilizar la consulta. Si los ndices pueden utilizarse para agilizar una consulta, el RDBMS obtiene
acceso al ndice en primer lugar y, a continuacin, lo utiliza para localizar los datos en la tabla.

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.

/* All of the rock songs */

SELECT * FROM Music


WHERE Genre = 'Rock';

/* All of the cheap country songs */

SELECT Artist, SongTitle, Price FROM Music


WHERE Genre = 'Country' AND Price < 0.50;

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.

A continuacin se muestran algunas consultas de GenreAndPriceIndex en DynamoDB. El esquema de


claves de este ndice consta de Genre y Price.

// All of the rock songs

{
TableName: "Music",
IndexName: "GenreAndPriceIndex",
KeyConditionExpression: "Genre = :genre",
ExpressionAttributeValues: {
":genre": "Rock"
},
};

// All of the cheap country songs

{
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:

// Return all of the data in the index

API Version 2012-08-10


39
Amazon DynamoDB Developer Guide
Modificacin de los datos de una tabla

{
TableName: "Music",
IndexName: "GenreAndPriceIndex"
}

Modificacin de los datos de una tabla


El lenguaje SQL proporciona la instruccin UPDATE para modificar datos. DynamoDB utiliza la operacin
UpdateItem para llevar a cabo tareas semejantes.

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.

A continuacin se muestra un ejemplo:

{
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 sustituye el elemento completo, no atributos individuales.

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",

API Version 2012-08-10


40
Amazon DynamoDB Developer Guide
Eliminacin de datos de una tabla

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).

Eliminacin de datos de una tabla


En SQL, se utiliza la instruccin DELETE para eliminar una o varias filas de una tabla. DynamoDB utiliza la
operacin DeleteItem para eliminar los elementos de uno en uno.

API Version 2012-08-10


41
Amazon DynamoDB Developer Guide
Eliminacin de una tabla

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:

DELETE FROM Music


WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';

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:

DELETE FROM Music WHERE Artist = 'The Acme Band'

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).

Eliminacin de una tabla


En SQL, se utiliza la instruccin DROP TABLE para eliminar una tabla. En DynamoDB, se utiliza la
operacin DeleteTable.

API Version 2012-08-10


42
Amazon DynamoDB Developer Guide
Eliminacin de una tabla

SQL
Cuando ya no necesita una tabla y se desea descartarla de forma permanente, se utiliza la instruccin
DROP TABLE de SQL:

DROP TABLE Music;

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).

API Version 2012-08-10


43
Amazon DynamoDB Developer Guide
Configuracin de la versin de
DynamoDB local (descargable)

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)

Configuracin de la versin de DynamoDB local


(descargable)
La versin descargable de DynamoDB le permite crear y probar aplicaciones localmente sin obtener
acceso al servicio web de DynamoDB. En lugar de ello, se utiliza una base de datos autnoma que reside
en el equipo. Cuando est listo para implementar la aplicacin en un entorno de produccin, puede realizar
algunos cambios mnimos en el cdigo para que este utilice el servicio web de DynamoDB.

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)

Descargar y ejecutar DynamoDB en su equipo


La versin descargable de DynamoDB se suministra como un archivo .jar ejecutable. La aplicacin se
ejecuta en Windows, Linux, macOS X y otras plataformas compatibles con Java.

API Version 2012-08-10


44
Amazon DynamoDB Developer Guide
Descargar y ejecutar DynamoDB en su equipo

Siga estos pasos para configurar y ejecutar DynamoDB en el equipo:

1. Puede descargar DynamoDB gratuitamente en uno de estos enlaces:

Regin Enlaces de descarga Sumas de comprobacin

Regin Asia Pacfico (Mumbai) .tar.gz | .zip .tar.gz.sha256 | .zip.sha256

Regin Asia Pacfico (Singapur) .tar.gz | .zip .tar.gz.sha256 | .zip.sha256

Regin Asia Pacfico (Tokio) .tar.gz | .zip .tar.gz.sha256 | .zip.sha256

Regin UE (Frncfort) .tar.gz | .zip .tar.gz.sha256 | .zip.sha256

Regin Amrica del Sur (So .tar.gz | .zip .tar.gz.sha256 | .zip.sha256


Paulo)

Regin EE.UU. Oeste (Oregn) .tar.gz | .zip .tar.gz.sha256 | .zip.sha256

La versin de DynamoDB descargable est disponible en Apache Maven. Para obtener ms


informacin, consulte DynamoDB (versin descargable) y Apache Maven (p. 45) ms adelante en
este tema. DynamoDB tambin est disponible como parte de AWS Toolkit for Eclipse. Para obtener
ms informacin, consulte AWS Toolkit For Eclipse.
Important

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:

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

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

Despus de realizar estos pasos, puede comenzar a escribir aplicaciones.

DynamoDB (versin descargable) y Apache Maven


Para utilizar DynamoDB en la aplicacin como dependencia:

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

El repositorio aws-dynamodb-examples de GitHub contiene ejemplos para iniciar y detener DynamoDB


Local en un programa de Java y usar DynamoDB Local en pruebas de JUnit.

Opciones de la lnea de comandos


Puede usar las siguientes opciones de lnea de comandos con la versin descargable de DynamoDB:

-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

API Version 2012-08-10


46
Amazon DynamoDB Developer Guide
Configuracin del punto de enlace local

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

DynamoDB utiliza el puerto 8000 de forma predeterminada. Si el puerto 8000 no est


disponible, este comando genera una excepcin. Puede usar la opcin -port para especificar
otro nmero de puerto. 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
-sharedDb: DynamoDB utiliza un solo archivo de base de datos, en lugar de archivos distintos para
cada credencial y regin. Si especifica -sharedDb, todos los clientes de DynamoDB interaccionan con
el mismo conjunto de tablas, con independencia de su configuracin de regin y credenciales.

Configuracin del punto de enlace local


De forma predeterminada, los SDK y las herramientas de AWS utilizan los puntos de enlace del servicio
web de Amazon DynamoDB. Para utilizar los SDK y las herramientas con la versin descargable de
DynamoDB, debe especificar el punto de enlace local:

http://localhost:8000

AWS Command Line Interface


Puede utilizar la AWS Command Line Interface para interactuar con la versin de DynamoDB descargable.
Por ejemplo, puede utilizarla para realizar todos los pasos de Creacin de tablas y carga de ejemplos de
datos (p. 291).

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:

aws dynamodb list-tables --endpoint-url http://localhost:8000

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:

API Version 2012-08-10


47
Amazon DynamoDB Developer Guide
Notas de uso

Java: configuracin de la regin y el punto de enlace de AWS (p. 298)


.NET: configuracin de la regin y el punto de enlace de AWS (p. 300)

Note

Para ver ejemplos en otros lenguajes de programacin, consulte Introduccin a


DynamoDB (p. 55).

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.

Diferencias entre la versin descargable de DynamoDB y el


servicio web de DynamoDB
La versin descargable de DynamoDB se ha desarrollado nicamente para tareas de desarrollo
y comprobacin. Por el contrario, el servicio web de DynamoDB es un servicio administrado con
caractersticas de escalabilidad, disponibilidad y durabilidad que resulta ideal para utilizarlo en produccin.

La versin descargable de DynamoDB se diferencia del servicio web en lo siguiente:

En el cliente no se admiten las regiones ni las cuentas de AWS especficas.


Los ajustes de desempeo aprovisionado se omiten en la versin descargable de DynamoDB, aunque la
operacin CreateTable los requiera. Para CreateTable, puede especificar cualquier cifra que desee
de desempeo aprovisionado de lectura y escritura, si bien estas cifras no se utilizarn. Puede llamar a
UpdateTable tantas veces como desee al da. Sin embargo, se omiten los cambios en los valores de
desempeo aprovisionado.
Las operaciones Scan se llevan a cabo secuencialmente. No se admiten los exmenes en paralelo. Los
parmetros Segment y TotalSegments de la operacin Scan se pasan por alto.
La velocidad de las operaciones de lectura y escritura en los datos de la tabla solamente se ve limitada
por la velocidad del equipo. Las operaciones CreateTable, UpdateTable y DeleteTable se llevan

API Version 2012-08-10


48
Amazon DynamoDB Developer Guide
Configuracin de DynamoDB (servicio web)

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.

Configuracin de DynamoDB (servicio web)


Para usar el servicio web de Amazon DynamoDB:

1. Suscrbase a AWS. (p. 49)


2. Obtenga una clave de acceso de AWS (p. 50) (usada para obtener acceso a DynamoDB mediante
programacin).
Note

Si solo va a interaccionar con DynamoDB a travs de la Consola de administracin de AWS,


no se requiere la clave de acceso de AWS, en cuyo caso puede ir directamente a Uso de la
consola (p. 51).
3. Configure sus credenciales (p. 50) (utilizadas para obtener acceso a DynamoDB).

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.

Para inscribirse en AWS

1. Abra https://aws.amazon.com/ y despus elija Create an AWS Account.


2. Siga las instrucciones en lnea.

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

Obtener una clave de acceso de AWS


Para poder tener acceso a DynamoDB mediante programacin o a travs de la AWS Command Line
Interface, debe disponer de una clave de acceso de AWS. No necesita una clave de acceso si piensa
utilizar solamente la consola de DynamoDB.

Para obtener acceso al ID de la clave de acceso y a la clave de acceso secreta de un usuario de


IAM

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.

1. Abra la consola de IAM.


2. En el panel de navegacin, seleccione Users.
3. Seleccione su nombre de usuario de IAM (no la casilla de verificacin).
4. Elija la pestaa Security credentials y, a continuacin, seleccione Create access key.
5. Para ver la nueva clave de acceso, elija Show. Sus credenciales tendrn el aspecto siguiente:

ID de clave de acceso: AKIAIOSFODNN7EXAMPLE


Clave de acceso secreta: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
6. Para descargar el par de claves, elija Download .csv file. Almacene las claves en un lugar seguro.

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

Qu es IAM? en la Gua del usuario de IAM


AWS Security Credentials en AWS General Reference

Configuracin de las credenciales


Para poder tener acceso a DynamoDB mediante programacin o a travs de la AWS CLI, debe configurar
sus credenciales para permitir la autorizacin para sus aplicaciones.

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).

API Version 2012-08-10


50
Amazon DynamoDB Developer Guide
Uso de la consola

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.

Pude utilizar la consola para hacer lo siguiente en DynamoDB:

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.

API Version 2012-08-10


51
Amazon DynamoDB Developer Guide
Uso de la CLI

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)

Descarga y configuracin de la AWS CLI


La AWS CLI est disponible en http://aws.amazon.com/cli. Se ejecuta en Windows, macOS o Linux.
Despus de descargar la AWS CLI, siga estos pasos para instalarla y configurarla:

1. Vaya a la AWS Command Line Interface Gua del usuario.


2. Siga las instrucciones de Instalacin de la AWS Command Line Interface y Configuracin de la AWS
CLI.

API Version 2012-08-10


52
Amazon DynamoDB Developer Guide
Uso de la AWS CLI con DynamoDB

Uso de la AWS CLI con DynamoDB


El formato de la lnea de comandos se compone de un nombre de operacin de DynamoDB seguido de los
parmetros de dicha operacin. La AWS CLI admite la sintaxis abreviada de los valores de los parmetros,
adems de JSON.

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.

aws dynamodb create-table \


--table-name Music \
--attribute-definitions \
AttributeName=Artist,AttributeType=S \
AttributeName=SongTitle,AttributeType=S \
--key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

Los comandos siguientes aaden nuevos elementos a la tabla. En estos ejemplos se usa una combinacin
de sintaxis abreviada y JSON.

aws dynamodb put-item \


--table-name Music \
--item \
'{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"},
"AlbumTitle": {"S": "Somewhat Famous"}}' \
--return-consumed-capacity TOTAL

aws dynamodb put-item \


--table-name Music \
--item '{ \
"Artist": {"S": "Acme Band"}, \
"SongTitle": {"S": "Happy Day"}, \
"AlbumTitle": {"S": "Songs About Life"} }' \
--return-consumed-capacity TOTAL

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"
}
}

API Version 2012-08-10


53
Amazon DynamoDB Developer Guide
Uso de la AWS CLI con la versin
descargable de DynamoDB

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:

aws dynamodb query --table-name Music --key-conditions file://key-conditions.json

Uso de la AWS CLI con la versin descargable de


DynamoDB
La AWS CLI tambin puede interactuar con DynamoDB (versin descargable) que se ejecuta en su equipo.
Para ello, agregue el parmetro siguiente a cada comando:

--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:

aws dynamodb list-tables --endpoint-url http://localhost:8000

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.

Uso del API


Puede utilizar la Consola de administracin de AWS y la AWS Command Line Interface para trabajar de
manera interactiva con Amazon DynamoDB. Sin embargo, para sacar el mximo partido de DynamoDB,
puede escribir el cdigo de aplicacin mediante los SDK de AWS.

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).

API Version 2012-08-10


54
Amazon DynamoDB Developer Guide
Java y DynamoDB

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.

API Version 2012-08-10


55
Amazon DynamoDB Developer Guide
Requisitos previos

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.

Paso 1: Crear una tabla


En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los
siguientes atributos:

year: clave de particin. El valor de ScalarAttributeType es N si es numrico.


title: clave de ordenacin. El valor de ScalarAttributeType es S si es de cadena.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesCreateTable {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

String tableName = "Movies";

API Version 2012-08-10


56
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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" : ...,

API Version 2012-08-10


57
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

"title" : ...,
"info" : { ... }
},

...

En los datos de JSON, tenga en cuenta lo siguiente:

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.

A continuacin, se muestra un ejemplo de datos de pelculas:

{
"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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en el directorio actual.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Despus de descargar los datos de ejemplo, puede ejecutar el programa siguiente para rellenar la tabla
Movies.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.

API Version 2012-08-10


58
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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;

public class MoviesLoadData {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

JsonParser parser = new JsonFactory().createParser(new File("moviedata.json"));

JsonNode rootNode = new ObjectMapper().readTree(parser);


Iterator<JsonNode> iter = rootNode.iterator();

ObjectNode currentNode;

while (iter.hasNext()) {
currentNode = (ObjectNode) iter.next();

int year = currentNode.path("year").asInt();


String title = currentNode.path("title").asText();

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.

API Version 2012-08-10


59
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

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)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla Movies.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java.

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesItemOps01 {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

int year = 2015;


String title = "The Big New Movie";

final Map<String, Object> infoMap = new HashMap<String, Object>();


infoMap.put("plot", "Nothing happens at all.");
infoMap.put("rating", 0);

try {
System.out.println("Adding a new item...");

API Version 2012-08-10


60
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

PutItemOutcome outcome = table


.putItem(new Item().withPrimaryKey("year", year, "title",
title).withMap("info", infoMap));

System.out.println("PutItem succeeded:\n" + outcome.getPutItemResult());

}
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.

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
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.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesItemOps02 {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))

API Version 2012-08-10


61
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

int year = 2015;


String title = "The Big New Movie";

GetItemSpec spec = new GetItemSpec().withPrimaryKey("year", year, "title",


title);

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());
}

}
}

2. Compile y ejecute el programa.

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo updateItem para modificar un elemento existente. Puede actualizar los valores
de los atributos existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

{
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"]
}
}

API Version 2012-08-10


62
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
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.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;

public class MoviesItemOps03 {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

int year = 2015;


String title = "The Big New Movie";

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("year",


year, "title", title)
.withUpdateExpression("set info.rating = :r, info.plot=:p, info.actors=:a")
.withValueMap(new ValueMap().withNumber(":r", 5.5).withString(":p",
"Everything happens all at once.")
.withList(":a", Arrays.asList("Larry", "Moe", "Curly")))
.withReturnValues(ReturnValue.UPDATED_NEW);

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.

API Version 2012-08-10


63
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo updateItem para aumentar
o reducir el valor de un atributo existente sin interferir con las dems solicitudes de escritura. Todas las
solicitudes de escritura se aplican en el orden en que se reciben.

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.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesItemOps04 {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

int year = 2015;


String title = "The Big New Movie";

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("year",


year, "title", title)
.withUpdateExpression("set info.rating = info.rating + :val")
.withValueMap(new ValueMap().withNumber(":val",
1)).withReturnValues(ReturnValue.UPDATED_NEW);

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());
}
}
}

2. Compile y ejecute el programa.

API Version 2012-08-10


64
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar UpdateItem con una condicin. Si la condicin se evala en
true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento de pelcula se actualiza solamente si hay ms de tres actores.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesItemOps05 {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

int year = 2015;


String title = "The Big New Movie";

UpdateItemSpec updateItemSpec = new UpdateItemSpec()


.withPrimaryKey(new PrimaryKey("year", year, "title",
title)).withUpdateExpression("remove info.actors[0]")
.withConditionExpression("size(info.actors) > :num").withValueMap(new
ValueMap().withNumber(":num", 3))
.withReturnValues(ReturnValue.UPDATED_NEW);

// Conditional update (we expect this to fail)


try {
System.out.println("Attempting a conditional update...");
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());
}
}
}

API Version 2012-08-10


65
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

2. Compile y ejecute el programa.

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

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:

.withConditionExpression("size(info.actors) >= :num")

Ahora, la condicin es mayor o igual que 3 en lugar de mayor que 3.


4. Compile y ejecute el programa. Ahora, la operacin UpdateItem debera realizarse correctamente.

Paso 3.6: Eliminar un elemento


Puede utilizar el mtodo deleteItem para eliminar un elemento especificando su clave principal. Tambin
puede incluir una instruccin ConditionExpression para evitar que se elimine el elemento si no se
cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesItemOps06 {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

int year = 2015;


String title = "The Big New Movie";

DeleteItemSpec deleteItemSpec = new DeleteItemSpec()


.withPrimaryKey(new PrimaryKey("year", year, "title",
title)).withConditionExpression("info.rating <= :val")
.withValueMap(new ValueMap().withNumber(":val", 5.0));

API Version 2012-08-10


66
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

// Conditional delete (we expect this to fail)

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());
}
}
}

2. Compile y ejecute el programa.

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


3. Modifique el programa para eliminar la condicin de DeleteItemSpec.

DeleteItemSpec deleteItemSpec = new DeleteItemSpec()


.withPrimaryKey(new PrimaryKey("year", 2015, "title", "The Big New Movie"));

4. Compile y ejecute el programa. Ahora, la eliminacin se llevar a cabo correctamente porque se ha


eliminado la condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin. La clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

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)

Paso 4.1: Consultar


El cdigo incluido en este paso lleva a cabo las siguientes consultas:

API Version 2012-08-10


67
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

Recuperar todas las pelculas estrenadas el ao (year) 1985.


Recuperar todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo (title) comience por las
letras de la "A" a la "L".

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesQuery {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

HashMap<String, String> nameMap = new HashMap<String, String>();


nameMap.put("#yr", "year");

HashMap<String, Object> valueMap = new HashMap<String, Object>();


valueMap.put(":yyyy", 1985);

QuerySpec querySpec = new QuerySpec().withKeyConditionExpression("#yr


= :yyyy").withNameMap(nameMap)
.withValueMap(valueMap);

ItemCollection<QueryOutcome> items = null;


Iterator<Item> iterator = null;
Item item = null;

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"));
}

API Version 2012-08-10


68
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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");

querySpec.withProjectionExpression("#yr, title, info.genres, info.actors[0]")


.withKeyConditionExpression("#yr = :yyyy and title between :letter1
and :letter2").withNameMap(nameMap)
.withValueMap(valueMap);

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).

API Version 2012-08-10


69
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

Paso 4.2: Examinar


El mtodo scan lee cada uno de los elementos de la tabla y devuelve todos los datos de la tabla. Puede
proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, el filtro solo se aplica despus de haber examinado
toda la tabla.

El programa siguiente examina la tabla Movies en su totalidad, que contiene aproximadamente


5000elementos. El examen especifica el filtro opcional que permite recuperar solamente las pelculas de la
dcada de 1950 (aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesScan {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

ScanSpec scanSpec = new ScanSpec().withProjectionExpression("#yr, title,


info.rating")
.withFilterExpression("#yr between :start_yr and :end_yr").withNameMap(new
NameMap().with("#yr", "year"))
.withValueMap(new ValueMap().withNumber(":start_yr",
1950).withNumber(":end_yr", 1959));

try {
ItemCollection<ScanOutcome> items = table.scan(scanSpec);

Iterator<Item> iter = items.iterator();


while (iter.hasNext()) {
Item item = iter.next();
System.out.println(item.toString());
}

}
catch (Exception e) {

API Version 2012-08-10


70
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

System.err.println("Unable to scan the table:");


System.err.println(e.getMessage());
}
}
}

En el cdigo, observe lo siguiente:

ProjectionExpression especifica los atributos que se desea obtener en el resultado del


examen.
FilterExpression especifica una condicin que devuelve solamente los elementos que cumplen
la condicin. Todos los dems elementos se descartan.
2. Compile y ejecute el programa.

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).

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

1. Copie y pegue el siguiente programa en su entorno de desarrollo de Java:

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.

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;

public class MoviesDeleteTable {

public static void main(String[] args) throws Exception {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Movies");

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());

API Version 2012-08-10


71
Amazon DynamoDB Developer Guide
Resumen

}
}
}

2. Compile y ejecute el programa.

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.

Modificacin del cdigo para utilizar el servicio de DynamoDB


Debe cambiar el punto de enlace en la aplicacin para usar el servicio de DynamoDB.

1. Elimine la importacin siguiente:

import com.amazonaws.client.builder.AwsClientBuilder;

2. A continuacin, vaya a AmazonDynamoDB en el cdigo:

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:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withRegion(Regions.REGION)
.build();

Por ejemplo, si desea obtener acceso a la us-west-2 region, tendra que hacer lo siguiente:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withRegion(Regions.US_WEST_2)
.build();

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:

API Version 2012-08-10


72
Amazon DynamoDB Developer Guide
Requisitos previos

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.

Para habilitar CORS

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:

1. Descargue el siguiente archivo: MoviesJavaScript.zip.


2. Extraiga el archivo MoviesJavaScript.html del archivo comprimido.
3. Modifique el archivo MoviesJavaScript.html para que utilice su punto de enlace.
4. Ejecute el archivo MoviesJavaScript.html.

API Version 2012-08-10


73
Amazon DynamoDB Developer Guide
Paso 1: Crear una tabla

Paso 1: Crear una tabla


En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los
siguientes atributos:

year: clave de particin. El valor de AttributeType es N si es numrico.


title: clave de ordenacin. El valor de AttributeType es S si es de cadena.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesCreateTable.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"
});

var dynamodb = new AWS.DynamoDB();

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
}
};

dynamodb.createTable(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML = "Unable to create table: "
+ "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "Created table: " + "\n" +
JSON.stringify(data, undefined, 2);
}
});
}

</script>
</head>

API Version 2012-08-10


74
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

<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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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" : { ... }
},

...

En los datos de JSON, tenga en cuenta lo siguiente:

year y title se utilizan como valores de atributos de clave principal de la tabla Movies.

API Version 2012-08-10


75
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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.

A continuacin, se muestra un ejemplo de datos de pelculas:

{
"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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en el directorio actual.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Despus de descargar los datos de ejemplo, puede ejecutar el programa siguiente para rellenar la tabla
Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesLoadData.html:

<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",

API Version 2012-08-10


76
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

// 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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

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>

API Version 2012-08-10


77
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

2. Abra el archivo MoviesLoadData.html en el navegador.


3. Elija Browse y cargue el archivo moviedata.json.

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

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)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps01.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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

function createItem() {
var params = {
TableName :"Movies",
Item:{
"year": 2015,
"title": "The Big New Movie",
"info":{
"plot": "Nothing happens at all.",
"rating": 0
}
}
};

API Version 2012-08-10


78
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

docClient.put(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML = "Unable to add item: " +
"\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "PutItem succeeded: " +
"\n" + JSON.stringify(data, undefined, 2);
}
});
}

</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.

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps02.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",

API Version 2012-08-10


79
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

// 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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

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>

2. Abra el archivo MoviesItemOps02.html en el navegador.


3. Elija Read Item.

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo update para modificar un elemento. Puede actualizar los valores de los atributos
existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

{
year: 2015,
title: "The Big New Movie",

API Version 2012-08-10


80
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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"]
}
}

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps03.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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

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"
};

docClient.update(params, function(err, data) {


if (err) {

API Version 2012-08-10


81
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

document.getElementById('textarea').innerHTML = "Unable to update item: " +


"\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "UpdateItem succeeded: " +
"\n" + JSON.stringify(data, undefined, 2);
}
});
}

</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.

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo update para aumentar o
reducir el valor de un atributo sin interferir con las dems solicitudes de escritura. Todas las solicitudes de
escritura se aplican en el orden en que se reciben.

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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps04.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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

API Version 2012-08-10


82
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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"
};

docClient.update(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML = "Unable to update rating: "
+ "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "Increase Rating succeeded:
" + "\n" + JSON.stringify(data, undefined, 2);
}
});
}

</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>

2. Abra el archivo MoviesItemOps04.html en el navegador.


3. Elija Increase Rating.

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar UpdateItem con una condicin. Si la condicin se evala en
true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento se actualiza solamente si hay ms de tres actores en la pelcula.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps05.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',

API Version 2012-08-10


83
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

// 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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

function conditionalUpdate() {
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";

// Conditional update (will fail)


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"
};

docClient.update(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML = "The conditional update
failed: " + "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "The conditional update
succeeded: " + "\n" + JSON.stringify(data, undefined, 2);
}
});
}

</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>

2. Abra el archivo MoviesItemOps05.html en el navegador.


3. Elija Conditional Update.

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional update failed

API Version 2012-08-10


84
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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:

ConditionExpression: "size(info.actors) >= :num",

Ahora, la condicin es mayor o igual que 3 en lugar de mayor que 3.


5. Ejecute el programa de nuevo. Ahora, la operacin updateItem debera realizarse correctamente.

Paso 3.6: Eliminar un elemento


Puede utilizar el mtodo delete para eliminar un elemento especificando su clave principal. Tambin
puede incluir una instruccin ConditionExpression para evitar que se elimine el elemento si no se
cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps06.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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

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
}
};

docClient.delete(params, function(err, data) {

API Version 2012-08-10


85
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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>

2. Abra el archivo MoviesItemOps06.html en el navegador.


3. Elija Conditional Delete.

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional delete failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


4. Modifique el programa para eliminar la condicin de params.

var params = {
TableName:table,
Key:{
"title":title,
"year":year
}
};

5. Ejecute el programa de nuevo. La eliminacin se llevar a cabo correctamente porque se ha eliminado


la condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin; la clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

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.

API Version 2012-08-10


86
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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)

Paso 4.1: Consulta de todas las pelculas estrenadas durante un


ao
El programa incluido en este paso recupera todas las pelculas estrenadas en el ao (year) 1985.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery01.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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

function queryData() {
document.getElementById('textarea').innerHTML += "Querying for movies from 1985.";

var params = {
TableName : "Movies",
KeyConditionExpression: "#yr = :yyyy",
ExpressionAttributeNames:{
"#yr": "year"
},
ExpressionAttributeValues: {
":yyyy":1985
}
};

docClient.query(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML += "Unable to query. Error: "
+ "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML += "Querying for movies from
1985: " + "\n" + JSON.stringify(data, undefined, 2);
}
});

API Version 2012-08-10


87
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

</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

ExpressionAttributeNames 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. Por este motivo, se utiliza el nombre de
atributo de expresin #yr.
ExpressionAttributeValues permite sustituir valores. Se utiliza porque no se pueden
utilizar literales en ninguna expresin, incluida KeyConditionExpression. Por este motivo,
se utiliza el valor de atributo de expresin :yyyy.
2. Abra el archivo MoviesQuery01.html en el navegador.
3. Elija Query.

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).

Paso 4.2: Consulta de todas las pelculas estrenadas durante un


ao con unos ttulos determinados
El programa incluido en este paso recupera todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo
(title) comienza por las letras de la "A" a la "L".

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery02.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"

API Version 2012-08-10


88
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

});

var docClient = new AWS.DynamoDB.DocumentClient();

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"
}
};

docClient.query(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML += "Unable to query. Error: "
+ "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML += "Querying for movies
from 1992 - titles A-L, with genres and lead actor: " + "\n" + JSON.stringify(data,
undefined, 2);
}
});
}

</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>

2. Abra el archivo MoviesQuery02.html en el navegador.


3. Elija Query.

Paso 4.3: Examinar


El mtodo scan lee cada uno de los elementos de la tabla y devuelve todos los datos de la tabla. Puede
proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, el filtro solo se aplica despus de haber examinado
toda la tabla.

El programa siguiente examina la tabla Movies en su totalidad, que contiene aproximadamente


5000elementos. El examen especifica el filtro opcional que permite recuperar solamente las pelculas de la
dcada de 1950 (aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesScan.html:

<html>
<head>

API Version 2012-08-10


89
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

<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"
});

var docClient = new AWS.DynamoDB.DocumentClient();

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);

function onScan(err, data) {


if (err) {
document.getElementById('textarea').innerHTML += "Unable to scan the table:
" + "\n" + JSON.stringify(err, undefined, 2);
} else {
// Print all the movies
document.getElementById('textarea').innerHTML += "Scan succeeded. " + "\n";
data.Items.forEach(function(movie) {
document.getElementById('textarea').innerHTML += movie.year + ": " +
movie.title + " - rating: " + movie.info.rating + "\n";
});

// Continue scanning if we have more movies (per scan 1MB limitation)


document.getElementById('textarea').innerHTML += "Scanning for more..." +
"\n";
params.ExclusiveStartKey = data.LastEvaluatedKey;
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>

API Version 2012-08-10


90
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

</body>
</html>

En el cdigo, observe lo siguiente:

ProjectionExpression especifica los atributos que se desea obtener en el resultado del


examen.
FilterExpression especifica una condicin que devuelve solamente los elementos que cumplen
la condicin. Todos los dems elementos se descartan.
2. Abra el archivo MoviesScan.html en el navegador.
3. Seleccione Scan.

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).

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

1. Copie y pegue el siguiente programa en un archivo denominado MoviesDeleteTable.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"
});

var dynamodb = new AWS.DynamoDB();

function deleteMovies() {
var params = {
TableName : "Movies"
};

dynamodb.deleteTable(params, function(err, data) {


if (err) {
document.getElementById('textarea').innerHTML = "Unable to delete table: "
+ "\n" + JSON.stringify(err, undefined, 2);
} else {
document.getElementById('textarea').innerHTML = "Table deleted.";
}
});
}

API Version 2012-08-10


91
Amazon DynamoDB Developer Guide
Resumen

</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>

2. Abra el archivo MoviesDeleteTable.html en el navegador.


3. Elija Delete Table.

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.

Actualizacin de la regin de configuracin de AWS para utilizar


el servicio web de DynamoDB
Para usar el servicio web de DynamoDB, debe actualizar la regin de su aplicacin. Tambin debe
asegurarse de que Amazon Cognito est disponible en la misma regin, para que los scripts del navegador
se puedan autenticar correctamente.

AWS.config.update({region: "aws-region"});

Por ejemplo, si desea utilizar la regin us-west-2, establezca la regin siguiente:

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.

Configuracin de las credenciales de AWS en los archivos


mediante Amazon Cognito
La manera recomendada de obtener las credenciales de AWS para las aplicaciones web y para mviles
es utilizar Amazon Cognito. Amazon Cognito le evita tener que codificar de forma rgida las credenciales
de AWS en los archivos. Amazon Cognito utiliza los roles de AWS Identity and Access Management (IAM)
con el fin de generar credenciales temporales para los usuarios autenticados y no autenticados de las
aplicaciones.

Para obtener ms informacin, consulte Configuracin de las credenciales de AWS en los archivos
mediante Amazon Cognito (p. 725).

API Version 2012-08-10


92
Amazon DynamoDB Developer Guide
Node.js y DynamoDB

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.

Paso 1: Crear una tabla


En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los
siguientes atributos:

year: clave de particin. El valor de AttributeType es N si es numrico.


title: clave de ordenacin. El valor de AttributeType es S si es de cadena.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesCreateTable.js.

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var dynamodb = new AWS.DynamoDB();

var params = {
TableName : "Movies",
KeySchema: [
{ AttributeName: "year", KeyType: "HASH"}, //Partition key
{ AttributeName: "title", KeyType: "RANGE" } //Sort key
],
AttributeDefinitions: [
{ AttributeName: "year", AttributeType: "N" },

API Version 2012-08-10


93
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

{ AttributeName: "title", AttributeType: "S" }


],
ProvisionedThroughput: {
ReadCapacityUnits: 10,
WriteCapacityUnits: 10
}
};

dynamodb.createTable(params, function(err, data) {


if (err) {
console.error("Unable to create table. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("Created table. Table description JSON:", JSON.stringify(data,
null, 2));
}
});

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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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" : { ... }

API Version 2012-08-10


94
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

},

...

En los datos de JSON, tenga en cuenta lo siguiente:

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.

A continuacin, se muestra un ejemplo de datos de pelculas:

{
"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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en el directorio actual.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Despus de descargar los datos de ejemplo, puede ejecutar el programa siguiente para rellenar la tabla
Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesLoadData.js:

var AWS = require("aws-sdk");


var fs = require('fs');

API Version 2012-08-10


95
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

console.log("Importing movies into DynamoDB. Please wait.");

var allMovies = JSON.parse(fs.readFileSync('moviedata.json', 'utf8'));


allMovies.forEach(function(movie) {
var params = {
TableName: "Movies",
Item: {
"year": movie.year,
"title": movie.title,
"info": movie.info
}
};

docClient.put(params, function(err, data) {


if (err) {
console.error("Unable to add movie", movie.title, ". Error JSON:",
JSON.stringify(err, null, 2));
} else {
console.log("PutItem succeeded:", movie.title);
}
});
});

2. Para ejecutar el programa, escriba el siguiente comando:

node MoviesLoadData.js

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

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)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps01.js:

var AWS = require("aws-sdk");

AWS.config.update({

API Version 2012-08-10


96
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

var table = "Movies";

var year = 2015;


var title = "The Big New Movie";

var params = {
TableName:table,
Item:{
"year": year,
"title": title,
"info":{
"plot": "Nothing happens at all.",
"rating": 0
}
}
};

console.log("Adding a new item...");


docClient.put(params, function(err, data) {
if (err) {
console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Added item:", JSON.stringify(data, null, 2));
}
});

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

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps02.js:

var AWS = require("aws-sdk");

API Version 2012-08-10


97
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient()

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) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
}
});

2. Para ejecutar el programa, escriba el siguiente comando:

node MoviesItemOps02.js

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo update para modificar un elemento existente. Puede actualizar los valores de los
atributos existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}

A lo siguiente:

{
year: 2015,

API Version 2012-08-10


98
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

title: "The Big New Movie",


info: {
plot: "Everything happens all at once.",
rating: 5.5,
actors: ["Larry", "Moe", "Curly"]
}
}

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps03.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient()

var table = "Movies";

var year = 2015;


var title = "The Big New Movie";

// Update the item, unconditionally,

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"
};

console.log("Updating the item...");


docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
}
});

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

API Version 2012-08-10


99
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo update para aumentar o
reducir el valor de un atributo existente sin interferir con las dems solicitudes de escritura. Todas las
solicitudes de escritura se aplican en el orden en que se reciben.

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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps04.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient()

var table = "Movies";

var year = 2015;


var title = "The Big New Movie";

// Increment an atomic counter

var params = {
TableName:table,
Key:{
"year": year,
"title": title
},
UpdateExpression: "set info.rating = info.rating + :val",
ExpressionAttributeValues:{
":val":1
},
ReturnValues:"UPDATED_NEW"
};

console.log("Updating the item...");


docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
}
});

2. Para ejecutar el programa, escriba el siguiente comando:

node MoviesItemOps04.js

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar UpdateItem con una condicin. Si la condicin se evala en
true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento se actualiza solamente si hay ms de tres actores en la pelcula.

API Version 2012-08-10


100
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps05.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient()

var table = "Movies";

var year = 2015;


var title = "The Big New Movie";

// Conditional update (will fail)

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"
};

console.log("Attempting a conditional update...");


docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
}
});

2. Para ejecutar el programa, escriba el siguiente comando:

node MoviesItemOps05.js

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

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:

ConditionExpression: "size(info.actors) >= :num",

Ahora, la condicin es mayor o igual que 3 en lugar de mayor que 3.


4. Ejecute el programa de nuevo. Ahora, la operacin updateItem debera realizarse correctamente.

API Version 2012-08-10


101
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.6: Eliminar un elemento


Puede utilizar el mtodo delete para eliminar un elemento especificando su clave principal. Tambin
puede incluir una instruccin ConditionExpression para evitar que se elimine el elemento si no se
cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps06.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

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
}
};

console.log("Attempting a conditional delete...");


docClient.delete(params, function(err, data) {
if (err) {
console.error("Unable to delete item. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("DeleteItem succeeded:", JSON.stringify(data, null, 2));
}
});

2. Para ejecutar el programa, escriba el siguiente comando:

node MoviesItemOps06.js

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


3. Modifique el programa para eliminar la condicin de params.

var params = {
TableName:table,
Key:{
"title":title,

API Version 2012-08-10


102
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

"year":year
}
};

4. Ejecute el programa de nuevo. Ahora, la eliminacin se llevar a cabo correctamente porque se ha


eliminado la condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin; la clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

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)

Paso 4.1: Consulta de todas las pelculas estrenadas durante un


ao
El programa incluido en este paso recupera todas las pelculas estrenadas en el ao (year) 1985.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery01.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

console.log("Querying for movies from 1985.");

var params = {
TableName : "Movies",
KeyConditionExpression: "#yr = :yyyy",
ExpressionAttributeNames:{
"#yr": "year"

API Version 2012-08-10


103
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

},
ExpressionAttributeValues: {
":yyyy":1985
}
};

docClient.query(params, function(err, data) {


if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) {
console.log(" -", item.year + ": " + item.title);
});
}
});

Note

ExpressionAttributeNames permite sustituir nombres. Lo utilizamos porque year es


una palabra reservada en DynamoDB, por lo que no se puede utilizar directamente en una
expresin, lo que incluye KeyConditionExpression. Utilizamos el nombre de atributo de
expresin #yr para solucionar el problema.
ExpressionAttributeValues permite sustituir valores. Lo utilizamos
porque no se pueden utilizar literales en ninguna una expresin, lo que incluye
KeyConditionExpression. Utilizamos el valor de atributo de expresin :yyyy para
solucionar el problema.
2. Para ejecutar el programa, escriba el siguiente comando:

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).

Paso 4.2: Consulta de todas las pelculas estrenadas durante un


ao con unos ttulos determinados
El programa incluido en este paso recupera todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo
(title) comienza por las letras de la "A" a la "L".

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery02.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

console.log("Querying for movies from 1992 - titles A-L, with genres and lead actor");

var params = {

API Version 2012-08-10


104
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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"
}
};

docClient.query(params, function(err, data) {


if (err) {
console.log("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) {
console.log(" -", item.year + ": " + item.title
+ " ... " + item.info.genres
+ " ... " + item.info.actors[0]);
});
}
});

2. Para ejecutar el programa, escriba el siguiente comando:

node MoviesQuery02.js

Paso 4.3: Examinar


El mtodo scan lee cada uno de los elementos de la tabla y devuelve todos los datos de la tabla. Puede
proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, el filtro solo se aplica despus de haber examinado
toda la tabla.

El programa siguiente examina la tabla Movies en su totalidad, que contiene aproximadamente


5000elementos. El examen especifica el filtro opcional que permite recuperar solamente las pelculas de la
dcada de 1950 (aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesScan.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

var params = {
TableName: "Movies",
ProjectionExpression: "#yr, title, info.rating",
FilterExpression: "#yr between :start_yr and :end_yr",
ExpressionAttributeNames: {
"#yr": "year",
},
ExpressionAttributeValues: {

API Version 2012-08-10


105
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

":start_yr": 1950,
":end_yr": 1959
}
};

console.log("Scanning Movies table.");


docClient.scan(params, onScan);

function onScan(err, data) {


if (err) {
console.error("Unable to scan the table. Error JSON:", JSON.stringify(err,
null, 2));
} else {
// print all the movies
console.log("Scan succeeded.");
data.Items.forEach(function(movie) {
console.log(
movie.year + ": ",
movie.title, "- rating:", movie.info.rating);
});

// continue scanning if we have more movies, because


// scan can retrieve a maximum of 1MB of data
if (typeof data.LastEvaluatedKey != "undefined") {
console.log("Scanning for more...");
params.ExclusiveStartKey = data.LastEvaluatedKey;
docClient.scan(params, onScan);
}
}
}

En el cdigo, observe lo siguiente:

ProjectionExpression especifica los atributos que se desea obtener en el resultado del


examen.
FilterExpression 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:

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).

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

1. Copie y pegue el siguiente programa en un archivo denominado MoviesDeleteTable.js:

var AWS = require("aws-sdk");

AWS.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
});

API Version 2012-08-10


106
Amazon DynamoDB Developer Guide
Resumen

var dynamodb = new AWS.DynamoDB();

var params = {
TableName : "Movies"
};

dynamodb.deleteTable(params, function(err, data) {


if (err) {
console.error("Unable to delete table. Error JSON:", JSON.stringify(err, null,
2));
} else {
console.log("Deleted table. Table description JSON:", JSON.stringify(data,
null, 2));
}
});

2. Para ejecutar el programa, escriba el siguiente comando:

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.

Modificacin del cdigo para utilizar el servicio de DynamoDB


Debe cambiar el punto de enlace en la aplicacin para usar el servicio de DynamoDB. Para ello, realice las
siguientes modificaciones en el cdigo:

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.

API Version 2012-08-10


107
Amazon DynamoDB Developer Guide
Requisitos previos

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>:

PM> Install-Package AWSSDK.DynamoDBv2

Paso 1: Crear una tabla


El modelo de documento del AWS SDK para .NET no se proporciona para la creacin de tablas,
por lo que tendr que utilizar API de bajo nivel. Para obtener ms informacin, consulte Uso de
tablas: .NET (p. 334).

En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los
siguientes atributos:

year: clave de particin. El valor de AttributeType es N si es numrico.


title: clave de ordenacin. El valor de AttributeType es S si es de cadena.

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

API Version 2012-08-10


108
Amazon DynamoDB Developer Guide
Paso 1: Crear una tabla

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;
}

// Build a 'CreateTableRequest' for the new table


CreateTableRequest createRequest = new CreateTableRequest
{
TableName = "Movies",
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "year",
AttributeType = "N"
},
new AttributeDefinition
{
AttributeName = "title",
AttributeType = "S"
}
},
KeySchema = new List<KeySchemaElement>()
{
new KeySchemaElement
{
AttributeName = "year",
KeyType = "HASH"
},
new KeySchemaElement
{
AttributeName = "title",
KeyType = "RANGE"
}
},
};

// Provisioned-throughput settings are required even though


// the local test version of DynamoDB ignores them
createRequest.ProvisionedThroughput = new ProvisionedThroughput(1, 1);

// Using the DynamoDB client, make a synchronous CreateTable request


CreateTableResponse createResponse;
try

API Version 2012-08-10


109
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

{
createResponse = client.CreateTable(createRequest);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create the new table; " +
ex.Message);
PauseForDebugWindow();
return;
}

// Report the status of the new table...


Console.WriteLine("\n\n Created the \"Movies\" table successfully!\n
Status of the new table: '{0}'", createResponse.TableDescription.TableStatus);
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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).

API Version 2012-08-10


110
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en la carpeta bin/Debug del proyecto
DynamoDB_intro de Visual Studio.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Cree un programa que cargue datos de pelculas en la tabla que ha creado en el paso 1.

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>:

PM> Install-Package Newtonsoft.Json

2. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

using System;
using System.Collections.Generic;
using System.IO;

API Version 2012-08-10


111
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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);
}

// Now, create a Table object for the specified table


Table table;
try
{
table = Table.LoadTable(client, tableName);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return (null);
}
return (table);
}

public static void Main(string[] args)


{
// First, read in the JSON data from the moviedate.json file
StreamReader sr = null;
JsonTextReader jtr = null;
JArray movieArray = null;
try
{
sr = new StreamReader("moviedata.json");
jtr = new JsonTextReader(sr);
movieArray = (JArray)JToken.ReadFrom(jtr);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: could not read from the 'moviedata.json'
file, because: " + ex.Message);
PauseForDebugWindow();
return;

API Version 2012-08-10


112
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

}
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();
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

3. Ahora, compile el proyecto. Para ello, djelo en modo de depuracin y ejectelo.

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

API Version 2012-08-10


113
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla Movies.

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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;
}

// Create a Document representing the movie item to be written to the table


Document document = new Document();
document["year"] = 2015;
document["title"] = "The Big New Movie";
document["info"] = Document.FromJson("{\"plot\" : \"Nothing happens at all.
\",\"rating\" : 0}");

// Use Table.PutItem to write the document item to the table


try
{
table.PutItem(document);
Console.WriteLine("\nPutItem succeeded.\n");
}
catch (Exception ex)
{
Console.WriteLine("\n Error: Table.PutItem failed because: " +
ex.Message);
PauseForDebugWindow();
return;

API Version 2012-08-10


114
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

}
}

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);
}

// Now, create a Table object for the specified table


Table table = null;
try
{
table = Table.LoadTable(client, tableName);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return (null);
}
return (table);
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

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.

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",

API Version 2012-08-10


115
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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.

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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);
}
}

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);

API Version 2012-08-10


116
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

// Now, create a Table object for the specified table


Table table = null;
try
{
table = Table.LoadTable(client, tableName);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return (null);
}
return (table);
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

2. Compile y ejecute el programa.

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo UpdateItem para modificar un elemento existente. Puede actualizar los valores
de los atributos existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

{
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"]
}

API Version 2012-08-10


117
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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;
}

// Create an UpdateItemRequest to modify two existing nested attributes


// and add a new one
UpdateItemRequest updateRequest = new UpdateItemRequest()
{
TableName = "Movies",
Key = new Dictionary<string, AttributeValue>
{
{ "year", new AttributeValue {
N = "2015"
} },
{ "title", new AttributeValue {
S = "The Big New Movie"
}}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":r", new AttributeValue {
N = "5.5"
} },
{ ":p", new AttributeValue {
S = "Everything happens all at once!"
} },
{ ":a", new AttributeValue {
SS = { "Larry","Moe","Curly" }
} }
},
UpdateExpression = "SET info.rating = :r, info.plot = :p, info.actors
= :a",
ReturnValues = "UPDATED_NEW"
};

// Use AmazonDynamoDBClient.UpdateItem to update the specified attributes


UpdateItemResponse uir = null;
try
{

API Version 2012-08-10


118
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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");
}

public static AmazonDynamoDBClient GetLocalClient()


{
// 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);
}
return (client);
}

public static void DisplayMovieItem(AmazonDynamoDBClient client, string year,


string title)
{
// Create Primitives for the HASH and RANGE portions of the primary key
Primitive hash = new Primitive(year, true);
Primitive range = new Primitive(title, false);

Table table = null;


try
{
table = Table.LoadTable(client, "Movies");
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return;
}
Document document = table.GetItem(hash, range);
Console.WriteLine("\n The movie record looks like this: \n" +
document.ToJsonPretty());
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();

API Version 2012-08-10


119
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

}
}
}

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.

En la expresin UpdateExpression se definen todas las actualizaciones que se van a


llevar a cabo en el elemento.
Al establecer el campo ReturnValues en "UPDATED_NEW", est solicitando que
DynamoDB devuelva en la respuesta solamente los atributos actualizados.
2. Compile y ejecute el programa.

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo UpdateItem para aumentar
o reducir el valor de un atributo existente sin interferir con las dems solicitudes de escritura. Todas las
solicitudes de escritura se aplican en el orden en que se reciben.

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:

UpdateExpression = "SET info.rating = info.rating + :inc",

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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;
}

API Version 2012-08-10


120
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

// Create an UpdateItemRequest to modify two existing nested attributes


// and add a new one
UpdateItemRequest updateRequest = new UpdateItemRequest()
{
TableName = "Movies",
Key = new Dictionary<string, AttributeValue>
{
{ "year", new AttributeValue {
N = "2015"
} },
{ "title", new AttributeValue {
S = "The Big New Movie"
}}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":inc", new AttributeValue {
N = "1"
} }
},
UpdateExpression = "SET info.rating = info.rating + :inc",
ReturnValues = "UPDATED_NEW"
};

// Use AmazonDynamoDBClient.UpdateItem to update the specified attributes


UpdateItemResponse uir = null;
try
{
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");
}

public static AmazonDynamoDBClient GetLocalClient()


{
// 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);
}
return (client);
}

public static void DisplayMovieItem(AmazonDynamoDBClient client, string year,


string title)

API Version 2012-08-10


121
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

{
// Create Primitives for the HASH and RANGE portions of the primary key
Primitive hash = new Primitive(year, true);
Primitive range = new Primitive(title, false);

Table table = null;


try
{
table = Table.LoadTable(client, "Movies");
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return;
}
Document document = table.GetItem(hash, range);
Console.WriteLine("\n The movie record looks like this: \n" +
document.ToJsonPretty());
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

2. Compile y ejecute el programa.

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar UpdateItem con una condicin. Si la condicin se evala en
true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento se actualiza solamente si hay ms de tres actores en la pelcula.

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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)

API Version 2012-08-10


122
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

{
PauseForDebugWindow();
return;
}

// Create an UpdateItemRequest to modify two existing nested attributes


// and add a new one
UpdateItemRequest updateRequest = new UpdateItemRequest()
{
TableName = "Movies",
Key = new Dictionary<string, AttributeValue>
{
{ "year", new AttributeValue {
N = "2015"
} },
{ "title", new AttributeValue {
S = "The Big New Movie"
} }
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":n", new AttributeValue {
N = "3"
} }
},
ConditionExpression = "size(info.actors) > :n",
UpdateExpression = "REMOVE info.actors",
ReturnValues = "UPDATED_NEW"
};

// Use AmazonDynamoDBClient.UpdateItem to update the specified attributes


UpdateItemResponse uir = null;
try
{
uir = client.UpdateItem(updateRequest);
}
catch (Exception ex)
{
Console.WriteLine("\nError: UpdateItem failed, because:\n " +
ex.Message);
if (uir != null)
Console.WriteLine(" Status code was " +
uir.HttpStatusCode.ToString());
PauseForDebugWindow();
return;
}
if (uir.HttpStatusCode != System.Net.HttpStatusCode.OK)
{
PauseForDebugWindow();
return;
}

// Get the item from the table and display it to validate that the update
succeeded
DisplayMovieItem(client, "2015", "The Big New Movie");
}

public static AmazonDynamoDBClient GetLocalClient()


{
// 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);

API Version 2012-08-10


123
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create a DynamoDB client; " +
ex.Message);
return (null);
}
return (client);
}

public static void DisplayMovieItem(AmazonDynamoDBClient client, string year,


string title)
{
// Create Primitives for the HASH and RANGE portions of the primary key
Primitive hash = new Primitive(year, true);
Primitive range = new Primitive(title, false);

Table table = null;


try
{
table = Table.LoadTable(client, "Movies");
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return;
}
Document document = table.GetItem(hash, range);
Console.WriteLine("\n The movie record looks like this: \n" +
document.ToJsonPretty());
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

2. Compile y ejecute el programa.

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

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:

{ ":n", new AttributeValue { N = "2" } }

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.

API Version 2012-08-10


124
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.6: Eliminar un elemento


Puede utilizar la operacin Table.DeleteItem para eliminar un elemento especificando su clave
principal. Opcionalmente, puede indicar una condicin en el parmetro DeleteItemOperationConfig
para evitar que se elimine el elemento si no se cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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;

// Create the condition


DeleteItemOperationConfig opConfig = new DeleteItemOperationConfig();
lopConfig.ConditionalExpression = new Expression();
opConfig.ConditionalExpression.ExpressionAttributeValues[":val"] = "5.0";
opConfig.ConditionalExpression.ExpressionStatement = "info.rating <= :val";

// Delete this item


try
{
table.DeleteItem(2015, "The Big New Movie", opConfig);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: Could not delete the movie item with
year={0}, title=\"{1}\"\n Reason: {2}.",
2015, "The Big New Movie", ex.Message);
}

// Try to retrieve it, to see if it has been deleted


Document document = table.GetItem(2015, "The Big New Movie");
if (document == null)
Console.WriteLine("\n The movie item with year={0}, title=\"{1}\" has
been deleted.",
2015, "The Big New Movie");
else
Console.WriteLine("\nRead back the item: \n" +
document.ToJsonPretty());

// Keep the console open if in Debug mode...


Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();

API Version 2012-08-10


125
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

Console.WriteLine();
}

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);
}

// Now, create a Table object for the specified table


Table table = null;
try
{
table = Table.LoadTable(client, tableName);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return (null);
}
return (table);
}
}
}

2. Compile y ejecute el programa.

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


3. Modifique el programa para eliminar la configuracin DeleteItemOperationConfig denominada
opConfig de la llamada a table.DeleteItem:

try { table.DeleteItem( 2015, "The Big New Movie" ); }

4. Compile y ejecute el programa. Ahora, la eliminacin se llevar a cabo correctamente porque se ha


eliminado la condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo Query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin; la clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

API Version 2012-08-10


126
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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)

Paso 4.1: Consultar


El cdigo C# incluido en este paso lleva a cabo las siguientes consultas:

Recupera todas las pelculas estrenadas el ao (year) 1985.


Recupera todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo (title) comience por las letras
de la "A" a la "L".

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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}";

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.1.1: Call Table.Query to initiate a query for all movies with
* year == 1985, using an empty filter expression.
*-----------------------------------------------------------------------*/
Search search;

API Version 2012-08-10


127
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

try
{
search = table.Query(1985, new Expression());
}
catch (Exception ex)
{
Console.WriteLine("\n Error: 1985 query failed because: " +
ex.Message);
PauseForDebugWindow();
return;
}

// Display the titles of the movies returned by this query


List<Document> docList = new List<Document>();
Console.WriteLine("\n All movies released in 1985:" +
"\n-----------------------------------------------");
do
{
try { docList = search.GetNextSet(); }
catch (Exception ex)
{
Console.WriteLine("\n Error: Search.GetNextStep failed because: " +
ex.Message);
break;
}
foreach (var doc in docList)
Console.WriteLine(" " + doc["title"]);
} while (!search.IsDone);

/*-----------------------------------------------------------------------
* 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;
}

// Display the movie information returned by this query


Console.WriteLine("\n\n Movies released in 1992 with titles between \"B\"
and \"Hzz\" (Document Model):" +

"\n-----------------------------------------------------------------------------");
docList = new List<Document>();
Document infoDoc;
do
{

API Version 2012-08-10


128
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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;
}

// Display the movie information returned by this query


Console.WriteLine("\n\n Movies released in 1992 with titles between \"M\"
and \"Tzz\" (low-level):" +

API Version 2012-08-10


129
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

"\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));
}
}

public static string GetDdbListAsString(List<AttributeValue> strList)


{
StringBuilder sb = new StringBuilder();
string str = null;
AttributeValue av;
for (int i = 0; i < strList.Count; i++)
{
av = strList[i];
if (av.S != null)
str = av.S;
else if (av.N != null)
str = av.N;
else if (av.SS != null)
str = string.Join(commaSep, av.SS.ToArray());
else if (av.NS != null)
str = string.Join(commaSep, av.NS.ToArray());
if (str != null)
{
if (i > 0)
sb.Append(commaSep);
sb.Append(str);
}
}
return (sb.ToString());
}

public static AmazonDynamoDBClient GetLocalClient()


{
// 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);
}
return (client);
}

public static Table GetTableObject(AmazonDynamoDBClient client, string


tableName)
{
Table table = null;
try
{
table = Table.LoadTable(client, tableName);
}

API Version 2012-08-10


130
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

catch (Exception ex)


{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return (null);
}
return (table);
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

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).

Paso 4.2: Examinar


El mtodo Scan lee cada uno de los elementos de la tabla y devuelve todos los datos de la tabla. Puede
proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, el filtro solo se aplica despus de haber examinado
toda la tabla.

El programa siguiente examina la tabla Movies en su totalidad, que contiene aproximadamente


5000elementos. El examen especifica el filtro opcional que permite recuperar solamente las pelculas de la
dcada de 1950 (aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

using System;
using System.Collections.Generic;

API Version 2012-08-10


131
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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);

// Display the movie information returned by this query


Console.WriteLine("\n\n Movies released in the 1950's (Document Model):" +
"\n--------------------------------------------------");
List<Document> docList = new List<Document>();
Document infoDoc;
string movieFormatString = " \"{0}\" ({1})-- lead actor: {2}, lead
director: {3}";
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"],
doc["year"],

API Version 2012-08-10


132
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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;
}

// Display the movie information returned by this scan


Console.WriteLine("\n\n Movies released in the 1960's (low-level):" +
"\n-------------------------------------------");
foreach (Dictionary<string, AttributeValue> item in sResponse.Items)
{
Dictionary<string, AttributeValue> info = item["info"].M;
Console.WriteLine(movieFormatString,
item["title"].S,
item["year"].N,
info["actors"].L[0].S,
info["directors"].L[0].S);
}
}

public static AmazonDynamoDBClient GetLocalClient()


{
// First, set up a DynamoDB client for DynamoDB Local
AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig();
ddbConfig.ServiceURL = "http://localhost:8000";
AmazonDynamoDBClient client;
try
{

API Version 2012-08-10


133
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

client = new AmazonDynamoDBClient(ddbConfig);


}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to create a DynamoDB client; " +
ex.Message);
return (null);
}
return (client);
}

public static Table GetTableObject(AmazonDynamoDBClient client, string


tableName)
{
Table table = null;
try
{
table = Table.LoadTable(client, tableName);
}
catch (Exception ex)
{
Console.WriteLine("\n Error: failed to load the 'Movies' table; " +
ex.Message);
return (null);
}
return (table);
}

public static void PauseForDebugWindow()


{
// Keep the console open if in Debug mode...
Console.Write("\n\n ...Press any key to continue");
Console.ReadKey();
Console.WriteLine();
}
}
}

En el cdigo, observe lo siguiente:

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).

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

API Version 2012-08-10


134
Amazon DynamoDB Developer Guide
Resumen

1. Copie y pegue el programa siguiente en el archivo Program.cs sustituyendo su contenido actual:

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!");
}

public static AmazonDynamoDBClient GetLocalClient()


{
// 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);
}
return (client);
}
}
}

2. Compile y ejecute el programa.

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.

API Version 2012-08-10


135
Amazon DynamoDB Developer Guide
PHP y DynamoDB

Modificacin del cdigo para utilizar el servicio de DynamoDB


Debe cambiar el punto de enlace en la aplicacin para usar el servicio de Amazon DynamoDB.

1. Para ello, elimine primero la lnea siguiente:

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.

Paso 1: Crear una tabla


En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los dos
atributos siguientes:

year: clave de particin. El valor de AttributeType es N si es numrico.


title: clave de ordenacin. El valor de AttributeType es S si es de cadena.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesCreateTable.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$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: ' .

API Version 2012-08-10


137
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

$result['TableDescription']['TableStatus'] ."\n";

} catch (DynamoDbException $e) {


echo "Unable to create table:\n";
echo $e->getMessage() . "\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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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" : { ... }
},

...

En los datos de JSON, tenga en cuenta lo siguiente:

year y title se utilizan como valores de atributos de clave principal de la tabla Movies.

API Version 2012-08-10


138
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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.

A continuacin, se muestra un ejemplo de datos de pelculas:

{
"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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en el directorio actual.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Despus de descargar los datos de ejemplo, puede ejecutar el programa siguiente para rellenar la tabla
Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesLoadData.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

API Version 2012-08-10


139
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();

$tableName = 'Movies';

$movies = json_decode(file_get_contents('moviedata.json'), true);

foreach ($movies as $movie) {

$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

La clase Marshaler de DynamoDB tiene mtodos para convertir documentos JSON


y matrices de PHP al formato de DynamoDB. En este programa, $marshaler-
>marshalJson($json) toma un documento JSON y lo convierte en un elemento de
DynamoDB.
2. Para ejecutar el programa, escriba el siguiente comando:

php MoviesLoadData.php

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

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

Paso 3.4: Incrementar un contador atmico (p. 145)


Paso 3.5: Actualizar un elemento (condicionalmente) (p. 146)
Paso 3.6: Eliminar un elemento (p. 147)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps01.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$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";

} catch (DynamoDbException $e) {


echo "Unable to add item:\n";
echo $e->getMessage() . "\n";
}

?>

API Version 2012-08-10


141
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps02.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$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
];

API Version 2012-08-10


142
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

try {
$result = $dynamodb->getItem($params);
print_r($result["Item"]);

} catch (DynamoDbException $e) {


echo "Unable to get item:\n";
echo $e->getMessage() . "\n";
}

?>

2. Para ejecutar el programa, escriba el siguiente comando:

php MoviesItemOps02.php

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo updateItem para modificar un elemento existente. Puede actualizar los valores
de los atributos existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

{
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"]
}
}

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps03.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

API Version 2012-08-10


143
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$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']);

} catch (DynamoDbException $e) {


echo "Unable to update item:\n";
echo $e->getMessage() . "\n";
}

?>

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

API Version 2012-08-10


144
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo updateItem para aumentar
o reducir el valor de un atributo existente sin interferir con las dems solicitudes de escritura. Todas las
solicitudes de escritura se aplican en el orden en que se reciben.

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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps04.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$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']);

} catch (DynamoDbException $e) {


echo "Unable to update item:\n";
echo $e->getMessage() . "\n";
}

API Version 2012-08-10


145
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

?>

2. Para ejecutar el programa, escriba el siguiente comando:

php MoviesItemOps04.php

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar UpdateItem con una condicin. Si la condicin se evala en
true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento se actualiza solamente si hay ms de tres actores en la pelcula.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps05.php.

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$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";

API Version 2012-08-10


146
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

print_r($result['Attributes']);

} catch (DynamoDbException $e) {


echo "Unable to update item:\n";
echo $e->getMessage() . "\n";
}

?>

2. Para ejecutar el programa, escriba el siguiente comando:

php MoviesItemOps05.php

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

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:

ConditionExpression="size(info.actors) >= :num",

Ahora, la condicin es mayor o igual que 3 en lugar de mayor que 3.


4. Ejecute el programa de nuevo. Ahora, la operacin UpdateItem debera realizarse correctamente.

Paso 3.6: Eliminar un elemento


Puede utilizar el mtodo deleteItem para eliminar un elemento especificando su clave principal. Tambin
puede incluir una instruccin ConditionExpression para evitar que se elimine el elemento si no se
cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps06.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();

$tableName = 'Movies';

$year = 2015;
$title = 'The Big New Movie';

$key = $marshaler->marshalJson('

API Version 2012-08-10


147
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

{
"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";

} catch (DynamoDbException $e) {


echo "Unable to delete item:\n";
echo $e->getMessage() . "\n";
}

?>

2. Para ejecutar el programa, escriba el siguiente comando:

php MoviesItemOps06.php

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


3. Modifique el programa para eliminar la condicin:

$params = [
'TableName' => $tableName,
'Key' => $key
];

4. Ejecute el programa. Ahora, la eliminacin se llevar a cabo correctamente porque se ha eliminado la


condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin. La clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

API Version 2012-08-10


148
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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)

Paso 4.1: Consulta de todas las pelculas estrenadas durante un


ao
El programa incluido en este paso recupera todas las pelculas estrenadas en el ao (year) 1985.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery01.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$dynamodb = $sdk->createDynamoDb();
$marshaler = new Marshaler();

$tableName = 'Movies';

$eav = $marshaler->marshalJson('
{
":yyyy": 1985
}
');

$params = [
'TableName' => $tableName,
'KeyConditionExpression' => '#yr = :yyyy',
'ExpressionAttributeNames'=> [ '#yr' => 'year' ],
'ExpressionAttributeValues'=> $eav
];

echo "Querying for movies from 1985.\n";

try {
$result = $dynamodb->query($params);

API Version 2012-08-10


149
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

echo "Query succeeded.\n";

foreach ($result['Items'] as $movie) {


echo $marshaler->unmarshalValue($movie['year']) . ': ' .
$marshaler->unmarshalValue($movie['title']) . "\n";
}

} catch (DynamoDbException $e) {


echo "Unable to query:\n";
echo $e->getMessage() . "\n";
}

?>

Note

ExpressionAttributeNames permite sustituir nombres. Lo utilizamos porque year es


una palabra reservada en DynamoDB, por lo que no se puede utilizar directamente en una
expresin, incluida KeyConditionExpression. Puede usar el nombre de atributo de
expresin #yr para solucionar el problema.
ExpressionAttributeValues permite sustituir valores. Lo utilizamos porque no se
pueden utilizar literales en ninguna expresin, incluida KeyConditionExpression.
Puede usar el valor de atributo de expresin :yyyy para solucionar el problema.
2. Para ejecutar el programa, escriba el siguiente comando:

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).

Paso 4.2: Consulta de todas las pelculas estrenadas durante un


ao con unos ttulos determinados
El programa incluido en este paso recupera todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo
(title) comienza por las letras de la "A" a la "L".

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery02.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$dynamodb = $sdk->createDynamoDb();

API Version 2012-08-10


150
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

$marshaler = new Marshaler();

$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);

echo "Query succeeded.\n";

foreach ($result['Items'] as $i) {


$movie = $marshaler->unmarshalItem($i);
print $movie['year'] . ': ' . $movie['title'] . ' ... ';

foreach ($movie['info']['genres'] as $gen) {


print $gen . ' ';
}

echo ' ... ' . $movie['info']['actors'][0] . "\n";


}

} catch (DynamoDbException $e) {


echo "Unable to query:\n";
echo $e->getMessage() . "\n";
}

?>

2. Para ejecutar el programa, escriba el siguiente comando:

php MoviesQuery02.php

Paso 4.3: Examinar


El mtodo scan lee todos los elementos de la tabla completa y devuelve todos los datos de la tabla.
Puede proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, el filtro solo se aplica despus de haber examinado
toda la tabla.

El programa siguiente examina la tabla Movies en su totalidad, que contiene aproximadamente


5000elementos. El examen especifica el filtro opcional que permite recuperar solamente las pelculas de la
dcada de 1950 (aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesScan.php:

API Version 2012-08-10


151
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\DynamoDb\Marshaler;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$dynamodb = $sdk->createDynamoDb();

$marshaler = new Marshaler();

//Expression attribute values


$eav = $marshaler->marshalJson('
{
":start_yr": 1950,
":end_yr": 1959
}
');

$params = [
'TableName' => 'Movies',
'ProjectionExpression' => '#yr, title, info.rating',
'FilterExpression' => '#yr between :start_yr and :end_yr',
'ExpressionAttributeNames'=> [ '#yr' => 'year' ],
'ExpressionAttributeValues'=> $eav
];

echo "Scanning Movies table.\n";

try {
while (true) {
$result = $dynamodb->scan($params);

foreach ($result['Items'] as $i) {


$movie = $marshaler->unmarshalItem($i);
echo $movie['year'] . ': ' . $movie['title'];
echo ' ... ' . $movie['info']['rating']
. "\n";
}

if (isset($result['LastEvaluatedKey'])) {
$params['ExclusiveStartKey'] = $result['LastEvaluatedKey'];
} else {
break;
}
}

} catch (DynamoDbException $e) {


echo "Unable to scan:\n";
echo $e->getMessage() . "\n";
}

?>

En el cdigo, observe lo siguiente:

API Version 2012-08-10


152
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

ProjectionExpression especifica los atributos que se desea obtener en el resultado del


examen.
FilterExpression 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:

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).

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

1. Copie y pegue el siguiente programa en un archivo denominado MoviesDeleteTable.php:

<?php
require 'vendor/autoload.php';

date_default_timezone_set('UTC');

use Aws\DynamoDb\Exception\DynamoDbException;

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

$dynamodb = $sdk->createDynamoDb();

$params = [
'TableName' => 'Movies'
];

try {
$result = $dynamodb->deleteTable($params);
echo "Deleted table.\n";

} catch (DynamoDbException $e) {


echo "Unable to delete table:\n";
echo $e->getMessage() . "\n";
}

?>

2. Para ejecutar el programa, escriba el siguiente comando:

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

API Version 2012-08-10


153
Amazon DynamoDB Developer Guide
Python y DynamoDB

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.

Modificacin del cdigo para utilizar el servicio de DynamoDB


Debe cambiar el punto de enlace en la aplicacin para usar el servicio de DynamoDB. Para ello, busque
las siguientes lneas en el cdigo:

$sdk = new Aws\Sdk([


'endpoint' => 'http://localhost:8000',
'region' => 'us-west-2',
'version' => 'latest'
]);

Elimine el parmetro endpoint para que el cdigo tenga el aspecto siguiente:

$sdk = new Aws\Sdk([


'region' => 'us-west-2',
'version' => 'latest'
]);

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):

'region' => 'us-west-2',

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

API Version 2012-08-10


154
Amazon DynamoDB Developer Guide
Requisitos previos

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.

Paso 1: Crear una tabla


En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los
siguientes atributos:

year: clave de particin. El valor de AttributeType es N si es numrico.


title: clave de ordenacin. El valor de AttributeType es S si es de cadena.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesCreateTable.py.

from __future__ import print_function # Python 2/3 compatibility


import boto3

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

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
}
)

print("Table status:", table.table_status)

API Version 2012-08-10


155
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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" : { ... }
},

...

En los datos de JSON, tenga en cuenta lo siguiente:

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.

API Version 2012-08-10


156
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

A continuacin, se muestra un ejemplo de datos de pelculas:

{
"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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en el directorio actual.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Despus de descargar los datos de ejemplo, puede ejecutar el programa siguiente para rellenar la tabla
Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesLoadData.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

with open("moviedata.json") as json_file:


movies = json.load(json_file, parse_float = decimal.Decimal)
for movie in movies:
year = int(movie['year'])
title = movie['title']
info = movie['info']

API Version 2012-08-10


157
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

print("Adding movie:", year, title)

table.put_item(
Item={
'year': year,
'title': title,
'info': info,
}
)

2. Para ejecutar el programa, escriba el siguiente comando:

python MoviesLoadData.py

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

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)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps01.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

title = "The Big New Movie"


year = 2015

API Version 2012-08-10


158
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps02.py.

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:

API Version 2012-08-10


159
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource("dynamodb", region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

title = "The Big New Movie"


year = 2015

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))

2. Para ejecutar el programa, escriba el siguiente comando:

python MoviesItemOps02.py

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo update_item para modificar un elemento existente. Puede actualizar los valores
de los atributos existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

{
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"]

API Version 2012-08-10


160
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

}
}

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps03.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

title = "The Big New Movie"


year = 2015

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

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo update_item para aumentar
o reducir el valor de un atributo existente sin interferir con las dems solicitudes de escritura. Todas las
solicitudes de escritura se aplican en el orden en que se reciben.
API Version 2012-08-10
161
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps04.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

title = "The Big New Movie"


year = 2015

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))

2. Para ejecutar el programa, escriba el siguiente comando:

python MoviesItemOps04.py

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar UpdateItem con una condicin. Si la condicin se evala en
true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento se actualiza solamente si hay ms de tres actores.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps05.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
from botocore.exceptions import ClientError
import json

API Version 2012-08-10


162
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

import decimal

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

title = "The Big New Movie"


year = 2015

# Conditional update (will fail)


print("Attempting conditional update...")

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))

2. Para ejecutar el programa, escriba el siguiente comando:

python MoviesItemOps05.py

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

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:

ConditionExpression="size(info.actors) >= :num",

Ahora, la condicin es mayor o igual que 3 en lugar de mayor que 3.


4. Ejecute el programa de nuevo. Ahora, la operacin UpdateItem debera realizarse correctamente.

API Version 2012-08-10


163
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Paso 3.6: Eliminar un elemento


Puede utilizar el mtodo delete_item para eliminar un elemento especificando su clave principal.
Tambin puede incluir una instruccin ConditionExpression para evitar que se elimine el elemento si
no se cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps06.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
from botocore.exceptions import ClientError
import json
import decimal

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

title = "The Big New Movie"


year = 2015

print("Attempting a conditional delete...")

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))

2. Para ejecutar el programa, escriba el siguiente comando:

python MoviesItemOps06.py

Debe producirse un error en el programa y mostrar el mensaje siguiente:

API Version 2012-08-10


164
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

The conditional request failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


3. Modifique el programa para eliminar la condicin de table.delete_item:

response = table.delete_item(
Key={
'year': year,
'title': title
}
)

4. Ejecute el programa. Ahora, la eliminacin se llevar a cabo correctamente porque se ha eliminado la


condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin. La clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

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)

Paso 4.1: Consulta de todas las pelculas estrenadas durante un


ao
El programa incluido en este paso recupera todas las pelculas estrenadas en el ao (year) 1985.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery01.py.

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal
from boto3.dynamodb.conditions import Key, Attr

API Version 2012-08-10


165
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

print("Movies from 1985")

response = table.query(
KeyConditionExpression=Key('year').eq(1985)
)

for i in response['Items']:
print(i['year'], ":", i['title'])

Note

El SDK de Boto 3 SDK crea una ConditionExpression automticamente cuando se


utilizan las funciones Key y Attr importadas de boto3.dynamodb.conditions. Tambin
puede especificar una ConditionExpression como una cadena.
Para obtener una lista de condiciones disponibles para DynamoDB, consulte DynamoDB
Conditions en Introduccin a AWS SDK para Python (Boto 3).
Para obtener ms informacin, consulte Expresiones de condicin (p. 360).
2. Para ejecutar el programa, escriba el siguiente comando:

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).

Paso 4.2: Consulta de todas las pelculas estrenadas durante un


ao con unos ttulos determinados
El programa incluido en este paso recupera todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo
(title) comienza por las letras de la "A" a la "L".

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery02.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal
from boto3.dynamodb.conditions import Key, Attr

# Helper class to convert a DynamoDB item to JSON.

API Version 2012-08-10


166
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

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))

2. Para ejecutar el programa, escriba el siguiente comando:

python MoviesQuery02.py

Paso 4.3: Examinar


El mtodo scan lee cada uno de los elementos de la tabla y devuelve todos los datos de la tabla. Puede
proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, el filtro solo se aplica despus de haber examinado
toda la tabla.

El programa siguiente examina la tabla Movies en su totalidad, que contiene aproximadamente


5000elementos. El examen especifica el filtro opcional que permite recuperar solamente las pelculas de la
dcada de 1950 (aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesScan.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3
import json
import decimal
from boto3.dynamodb.conditions import Key, Attr

# Helper class to convert a DynamoDB item to JSON.


class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

fe = Key('year').between(1950, 1959);

API Version 2012-08-10


167
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

pe = "#yr, title, info.rating"


# Expression Attribute Names for Projection Expression only.
ean = { "#yr": "year", }
esk = None

response = table.scan(
FilterExpression=fe,
ProjectionExpression=pe,
ExpressionAttributeNames=ean
)

for i in response['Items']:
print(json.dumps(i, cls=DecimalEncoder))

while 'LastEvaluatedKey' in response:


response = table.scan(
ProjectionExpression=pe,
FilterExpression=fe,
ExpressionAttributeNames= ean,
ExclusiveStartKey=response['LastEvaluatedKey']
)

for i in response['Items']:
print(json.dumps(i, cls=DecimalEncoder))

En el cdigo, observe lo siguiente:

ProjectionExpression especifica los atributos que se desea obtener en el resultado del


examen.
FilterExpression especifica una condicin que devuelve solamente los elementos que cumplen
la condicin. Todos los dems elementos se descartan.
El mtodo scan devuelve cada vez un subconjunto de los elementos, que se denomina "pgina". A
continuacin, el valor de LastEvaluatedKey de la respuesta se pasa al mtodo scan a travs del
parmetro ExclusiveStartKey. Cuando se devuelve la ltima pgina, LastEvaluatedKey no
forma parte de la respuesta.

Note

ExpressionAttributeNames permite sustituir nombres. Lo utilizamos porque year es


una palabra reservada en DynamoDB, por lo que no se puede utilizar directamente en una
expresin, incluida KeyConditionExpression. Puede usar el nombre de atributo de
expresin #yr para solucionar el problema.
ExpressionAttributeValues permite sustituir valores. Lo utilizamos porque no se
pueden utilizar literales en ninguna expresin, incluida KeyConditionExpression.
Puede usar el valor de atributo de expresin :yyyy para solucionar el problema.
2. Para ejecutar el programa, escriba el siguiente comando:

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).

API Version 2012-08-10


168
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

1. Copie y pegue el siguiente programa en un archivo denominado MoviesDeleteTable.py:

from __future__ import print_function # Python 2/3 compatibility


import boto3

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://


localhost:8000")

table = dynamodb.Table('Movies')

table.delete()

2. Para ejecutar el programa, escriba el siguiente comando:

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.

Modificacin del cdigo para utilizar el servicio de DynamoDB


Debe cambiar el punto de enlace en la aplicacin para usar el servicio de Amazon DynamoDB. Para ello,
modifique la lnea siguiente:

dynamodb = boto3.resource('dynamodb',endpoint_url="http://localhost:8000")

Por ejemplo, si desea usar la regin us-west-2:

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.

API Version 2012-08-10


169
Amazon DynamoDB Developer Guide
Requisitos previos

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. 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.

Paso 1: Crear una tabla


En este paso, se crea una tabla denominada Movies. La clave principal de la tabla se compone de los dos
atributos siguientes:

year: clave de particin. El valor de attribute_type es N si es numrico.


title: clave de ordenacin. El valor de attribute_type es S si es de cadena.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesCreateTable.rb:

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"
},

API Version 2012-08-10


170
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

{
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;

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to create table:"
puts "#{error.message}"
end

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).

Paso 2: Carga de datos de ejemplo


En este paso, se rellena la tabla Movies con ejemplos de datos.

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" : { ... }
},

API Version 2012-08-10


171
Amazon DynamoDB Developer Guide
Paso 2: Carga de datos de ejemplo

{
"year" : ...,
"title" : ...,
"info" : { ... }
},

...

En los datos de JSON, tenga en cuenta lo siguiente:

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.

A continuacin, se muestra un ejemplo de datos de pelculas:

{
"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"
]
}
}

Paso 2.1: Descargar el ejemplo de archivo de datos


1. Descargue el archivo de datos de ejemplo: moviedata.zip
2. Extraiga el archivo de datos (moviedata.json) del archivo comprimido.
3. Copie y pegue el archivo moviedata.json en el directorio actual.

Paso 2.2: Cargar los ejemplos de datos en la tabla Movies


Despus de descargar los datos de ejemplo, puede ejecutar el programa siguiente para rellenar la tabla
Movies.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesLoadData.rb:

API Version 2012-08-10


172
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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"]}"

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to add movie:"
puts "#{error.message}"
end
}

2. Para ejecutar el programa, escriba el siguiente comando:

ruby MoviesLoadData.rb

Paso 3: Crear, leer, actualizar y eliminar elementos


En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

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)

Paso 3.1: Crear un elemento nuevo


En este paso, agregamos un elemento nuevo a la tabla.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps01.rb:

API Version 2012-08-10


173
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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}"

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to add item:"
puts "#{error.message}"
end

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

Paso 3.2: Leer un elemento


En el programa anterior, hemos agregado el elemento siguiente a la tabla:

{
year: 2015,
title: "The Big New Movie",
info: {
plot: "Nothing happens at all.",
rating: 0
}
}

API Version 2012-08-10


174
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps02.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"

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"]

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to read item:"
puts "#{error.message}"
end

2. Para ejecutar el programa, escriba el siguiente comando:

ruby MoviesItemOps02.rb

Paso 3.3: Actualizar un elemento


Puede utilizar el mtodo update_item para modificar un elemento existente. Puede actualizar los valores
de los atributos existentes, as como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

Cambie el valor de los atributos existentes (rating, plot).


Agregue un nuevo atributo de lista (actors) al mapa info existente.

El elemento cambia de:

API Version 2012-08-10


175
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

{
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"]
}
}

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps03.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: "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}"

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to add item:"
puts "#{error.message}"
end

API Version 2012-08-10


176
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

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

Paso 3.4: Incrementar un contador atmico


DynamoDB admite los contadores atmicos, en los que se utiliza el mtodo update_item para aumentar
o reducir el valor de un atributo existente sin interferir con las dems solicitudes de escritura. Todas las
solicitudes de escritura se aplican en el orden en que se reciben.

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.

1. Copie y pegue el siguiente programa en un archivo denominado 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: "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}"

API Version 2012-08-10


177
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

end

2. Para ejecutar el programa, escriba el siguiente comando:

ruby MoviesItemOps04.rb

Paso 3.5: Actualizar un elemento (condicionalmente)


El programa siguiente muestra cmo usar update_item con una condicin. Si la condicin se evala
en true (verdadero), la actualizacin se lleva a cabo correctamente; de lo contrario, la actualizacin no se
realiza.

En este caso, el elemento se actualiza solamente si hay ms de tres actores.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps05.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

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to update item:"
puts "#{error.message}"
end

2. Para ejecutar el programa, escriba el siguiente comando:

ruby MoviesItemOps05.rb

API Version 2012-08-10


178
Amazon DynamoDB Developer Guide
Paso 3: Crear, leer, actualizar y eliminar elementos

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

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:

condition_expression: "size(info.actors) >= :num",

Ahora, la condicin es mayor o igual que 3 en lugar de mayor que 3.


4. Ejecute el programa de nuevo. Ahora, el mtodo update_item debera realizarse correctamente.

Paso 3.6: Eliminar un elemento


Puede utilizar el mtodo delete_item para eliminar un elemento especificando su clave principal.
Tambin puede incluir una instruccin condition_expression para evitar que se elimine el elemento si
no se cumple la condicin.

En el siguiente ejemplo, se intenta eliminar un elemento de pelcula determinado si su calificacin es igual


o menor que 5.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesItemOps06.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
},
condition_expression: "info.rating <= :val",
expression_attribute_values: {
":val" => 5
}
}

begin
result = dynamodb.delete_item(params)
puts "Deleted item."

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to update item:"
puts "#{error.message}"
end

API Version 2012-08-10


179
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

2. Para ejecutar el programa, escriba el siguiente comando:

ruby MoviesItemOps06.rb

Debe producirse un error en el programa y mostrar el mensaje siguiente:

The conditional request failed

Esto se debe a que la calificacin de esta pelcula concreta es mayor que 5.


3. Modifique el programa para eliminar la condicin:

params = {
table_name: "Movies",
key: {
year: year,
title: title
}
}

4. Ejecute el programa. Ahora, la eliminacin se llevar a cabo correctamente porque se ha eliminado la


condicin.

Paso 4: Consultar y examinar los datos


Puede utilizar el mtodo query para recuperar datos de una tabla. Debe especificar un valor de clave de
particin. La clave de ordenacin es opcional.

La clave principal de la tabla Movies consta de:

year: clave de particin. El tipo de atributo es Number.


title: clave de ordenacin. El tipo de atributo es String.

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)

Paso 4.1: Consulta de todas las pelculas estrenadas durante un


ao
El programa siguiente recupera todas las pelculas estrenadas en el ao (year) 1985.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesQuery01.rb:

API Version 2012-08-10


180
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

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
}
}

puts "Querying for movies from 1985.";

begin
result = dynamodb.query(params)
puts "Query succeeded."

result.items.each{|movie|
puts "#{movie["year"].to_i} #{movie["title"]}"
}

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to query table:"
puts "#{error.message}"
end

Note

expression_attribute_names permite sustituir nombres. Lo utilizamos porque year


es una palabra reservada en DynamoDB, por lo que no se puede utilizar directamente en
una expresin, incluida KeyConditionExpression. Puede usar el nombre de atributo de
expresin #yr para solucionar el problema.
expression_attribute_values permite sustituir valores. Lo utilizamos porque no se
pueden utilizar literales en ninguna expresin, incluida key_condition_expression.
Puede usar el valor de atributo de expresin :yyyy para solucionar el problema.
2. Para ejecutar el programa, escriba el siguiente comando:

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).

API Version 2012-08-10


181
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

Paso 4.2: Consulta de todas las pelculas estrenadas durante un


ao con unos ttulos determinados
El programa siguiente recupera todas las pelculas estrenadas el ao (year) 1992, cuyo ttulo (title)
comienza por las letras de la "A" a la "L".

1. Copie y pegue el siguiente programa en un archivo denominado 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.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 + " "
}

print " ... #{movie["info"]["actors"][0]}\n"


}

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to query table:"
puts "#{error.message}"
end

2. Para ejecutar el programa, escriba el siguiente comando:

ruby MoviesQuery02.rb

API Version 2012-08-10


182
Amazon DynamoDB Developer Guide
Paso 4: Consultar y examinar los datos

Paso 4.3: Examinar


El mtodo scan lee cada uno de los elementos de la tabla y devuelve todos los datos de la tabla. Puede
proporcionar una expresin filter_expression opcional para que solamente se devuelvan los
elementos que coinciden con los criterios. No obstante, tenga en cuenta que el filtro solo se aplica despus
de haber examinado toda la tabla.

El programa siguiente examina la tabla Movies, que contiene aproximadamente 5000elementos. El


examen especifica el filtro opcional que permite recuperar solamente las pelculas de la dcada de 1950
(aproximadamente 100elementos) y descartar todas las dems.

1. Copie y pegue el siguiente programa en un archivo denominado MoviesScan.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
}
}

puts "Scanning Movies table."

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?

puts "Scanning for more..."


params[:exclusive_start_key] = result.last_evaluated_key
end

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to scan:"
puts "#{error.message}"
end

En el cdigo, observe lo siguiente:

projection_expression especifica los atributos que se desea obtener en el resultado del


examen.

API Version 2012-08-10


183
Amazon DynamoDB Developer Guide
Paso 5: (Opcional) Eliminar la tabla

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).

Paso 5: (Opcional) Eliminar la tabla


Para eliminar la tabla Movies:

1. Copie y pegue el siguiente programa en un archivo denominado MoviesDeleteTable.rb:

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."

rescue Aws::DynamoDB::Errors::ServiceError => error


puts "Unable to delete table:"
puts "#{error.message}"
end

2. Para ejecutar el programa, escriba el siguiente comando:

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.

Modificacin del cdigo para utilizar el servicio de DynamoDB


Debe cambiar el punto de enlace en la aplicacin para usar el servicio de Amazon DynamoDB. Para ello,
busque las siguientes lneas en el cdigo:

API Version 2012-08-10


184
Amazon DynamoDB Developer Guide
Resumen

Aws.config.update({
region: "us-west-2",
endpoint: "http://localhost:8000"
})

Elimine el parmetro endpoint para que el cdigo tenga el aspecto siguiente:

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.

API Version 2012-08-10


185
Amazon DynamoDB Developer Guide
Informacin general sobre la compatibilidad
de los SDK de AWS con DynamoDB

Programacin con DynamoDB y los


SDK de AWS

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)

Informacin general sobre la compatibilidad de los


SDK de AWS con DynamoDB
En el siguiente diagrama se ofrece informacin general sobre la programacin de aplicaciones de
DynamoDB con los SDK de AWS.

API Version 2012-08-10


186
Amazon DynamoDB Developer Guide
Informacin general sobre la compatibilidad
de los SDK de AWS con DynamoDB

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:

Formatear las solicitudes HTTP(S) y serializar los parmetros de solicitud.


Generar una firma criptogrfica de cada solicitud.
Reenviar la solicitud a un punto de enlace de DynamoDB y recibir las respuestas de DynamoDB.
Extraer los resultados de esas respuestas.
Implementar la lgica de reintento bsica en caso de errores.

No es necesario escribir cdigo para ninguna de estas tareas.

API Version 2012-08-10


187
Amazon DynamoDB Developer Guide
Interfaces de programacin

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)

Interfaces de bajo nivel


Cada SDK de AWS especfico de un lenguaje ofrece una interfaz de bajo nivel para DynamoDB, con
mtodos que emulan del modo ms parecido posible las solicitudes del API de bajo nivel de DynamoDB.

API Version 2012-08-10


188
Amazon DynamoDB Developer Guide
Interfaces de documentos

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.

La clase com.amazonaws.services.dynamodbv2.AmazonDynamoDB implementa la interfaz de bajo


nivel de DynamoDB.

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;

public class MusicLowLevelDemo {

public static void main(String[] args) {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>();


key.put("Artist", new AttributeValue().withS("No One You Know"));
key.put("SongTitle", new AttributeValue().withS("Call Me Today"));

GetItemRequest request = new GetItemRequest()


.withTableName("Music")
.withKey(key);

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.

API Version 2012-08-10


189
Amazon DynamoDB Developer Guide
Interfaz de persistencia de objetos

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.

La clase com.amazonaws.services.dynamodbv2.document.DynamoDB implementa la interfaz de


documentos de DynamoDB. Observe que DynamoDB acta como encapsulador en torno al cliente de bajo
nivel (AmazonDynamoDB).

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;

public class MusicDocumentDemo {

public static void main(String[] args) {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB docClient = new DynamoDB(client);

Table table = docClient.getTable("Music");


GetItemOutcome outcome = table.getItemOutcome(
"Artist", "No One You Know",
"SongTitle", "Call Me Today");

int year = outcome.getItem().getInt("Year");


System.out.println("The song was released in " + year);

}
}

Interfaz de persistencia de objetos


Algunos SDK de AWS proporcionan una interfaz de persistencia de objetos en la que no se llevan a cabo
directamente operaciones del plano de datos. En lugar de ello, se crean objetos que representan los
elementos de las tablas y los ndices de DynamoDB y solamente se interacciona con estos objetos. Esto le
permite escribir cdigo orientado a objetos, en lugar de cdigo orientado a bases de datos.
Note

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).

En el siguiente programa de Java se utiliza la interfaz de persistencia de objetos DynamoDBMapper del


AWS SDK for Java. La clase MusicItem representa un elemento de la tabla Music.

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;

API Version 2012-08-10


190
Amazon DynamoDB Developer Guide
Interfaz de persistencia de objetos

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.

La clase com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper implementa


la interfaz de persistencia de objetos de DynamoDB. Observe que DynamoDBMapper acta como
encapsulador en torno al cliente de bajo nivel (AmazonDynamoDB).

package com.amazonaws.codesamples;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;

public class MusicMapperDemo {

public static void main(String[] args) {

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDBMapper mapper = new DynamoDBMapper(client);

MusicItem keySchema = new MusicItem();


keySchema.setArtist("No One You Know");
keySchema.setSongTitle("Call Me Today");

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());
}

API Version 2012-08-10


191
Amazon DynamoDB Developer Guide
API de bajo nivel de DynamoDB

API de bajo nivel de DynamoDB


Temas
Formato de las solicitudes (p. 193)
Formato de respuesta (p. 194)
Descriptores de tipos de datos (p. 194)
Datos numricos (p. 195)
Datos de tipo Binary (p. 195)

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.

API Version 2012-08-10


192
Amazon DynamoDB Developer Guide
Formato de las solicitudes

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.

Formato de las solicitudes


El API de bajo nivel de DynamoDB acepta solicitudes POST de HTTP(S) como informacin de entrada. Los
SDK de AWS construyen estas solicitudes automticamente.

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"}
}
}

Tenga en cuenta lo siguiente en relacin con esta solicitud:

El encabezado Authorization contiene la informacin necesaria para que DynamoDB autentique


la solicitud. Para obtener ms informacin, consulte Signing AWS API Requests y Signature Version 4
Signing Process en la Referencia general de Amazon Web Services.

API Version 2012-08-10


193
Amazon DynamoDB Developer Guide
Formato de respuesta

El encabezado X-Amz-Target contiene el nombre de una operacin de DynamoDB, GetItem.


Adems, va acompaada de la versin del API de bajo nivel, en este caso, 20120810.
La carga (cuerpo) de la solicitud contiene los parmetros de la operacin, en formato JSON. En la
operacin GetItem, los parmetros son TableName y Key.

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).

Descriptores de tipos de datos


El protocolo del API de bajo nivel de DynamoDB requiere que cada atributo vaya acompaado de un
descriptor del tipo de datos. Los descriptores de tipos de datos son tokens que indican a DynamoDB cmo
interpretar cada atributo.

API Version 2012-08-10


194
Amazon DynamoDB Developer Guide
Datos numricos

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).

A continuacin se muestra una lista completa de descriptores de tipos de datos de DynamoDB:

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.

Datos de tipo Binary


DynamoDB es compatible con los atributos binarios. Sin embargo, JSON no presenta compatibilidad nativa
con la codificacin de datos binarios. Para enviar datos binarios en una solicitud, es preciso codificarlos
en formato Base64. Al recibir la solicitud, DynamoDB decodifica los datos Base64 para que vuelvan a ser
binarios.

API Version 2012-08-10


195
Amazon DynamoDB Developer Guide
Control de errores

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:

Un cdigo de estado HTTP (por ejemplo, 400).


Un nombre de excepcin (por ejemplo, ResourceNotFoundException).
Un mensaje de error (por ejemplo, Requested resource not found: Table: tablename not
found).

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:

HTTP/1.1 400 Bad Request


x-amzn-RequestId: LDM6CJP8RMQ1FHKSC1RBVJFPNVV4KQNSO5AEMF66Q9ASUAAJG
Content-Type: application/x-amz-json-1.0
Content-Length: 240
Date: Thu, 15 Mar 2012 23:56:23 GMT

{"__type":"com.amazonaws.dynamodb.v20120810#ResourceNotFoundException",
"message":"Requested resource not found: Table: tablename not found"}

Mensajes y cdigos de error


A continuacin se muestra una lista de excepciones devueltas por DynamoDB, agrupados por su cdigo
de estado HTTP. Si la respuesta a Reintentar? es S, puede volver a enviar la misma solicitud. Si la
respuesta a Reintentar? es No, es preciso corregir el problema en el lado del cliente antes de volver a
enviar la solicitud.

API Version 2012-08-10


196
Amazon DynamoDB Developer Guide
Mensajes y cdigos de error

Cdigo de estado HTTP 400


El cdigo de estado HTTP 400 indica que existe un problema en la solicitud; por ejemplo, se ha producido
un error de autenticacin, faltan parmetros obligatorios o se ha superado el desempeo provisionado de
una tabla. Es preciso corregir el problema en la aplicacin antes de volver a enviar la solicitud.

AccessDeniedException

Mensaje: Access denied.

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

Mensaje: The conditional request failed.

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

Mensaje: The request signature does not conform to AWS standards.

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

Mensaje: Collection size exceeded.

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

Mensaje: Too many operations for a given subscriber.

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

API Version 2012-08-10


197
Amazon DynamoDB Developer Guide
Mensajes y cdigos de error

MissingAuthenticationTokenException

Mensaje: Request must contain a valid (registered) AWS Access Key ID.

La solicitud no inclua el encabezado de autorizacin necesario o el formato de este ltimo era


incorrecto. Consulte API de bajo nivel de DynamoDB (p. 192).

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

Mensaje: The resource which you are attempting to change is in use.

Ejemplo: Ha intentado volver a crear una tabla existente o eliminar una tabla que se encuentra en el
estado CREATING.

Reintentar? No

ResourceNotFoundException

Mensaje: Requested resource not found.

Ejemplo: La tabla que se ha solicitado no existe o se encuentra demasiado al principio del estado
CREATING.

Reintentar? No

ThrottlingException

Mensaje: Rate of requests exceeds the allowed throughput.

Esta excepcin puede devolverse si se lleva a cabo con demasiada rapidez una de las operaciones
siguientes: CreateTable, UpdateTable o DeleteTable.

Reintentar? S

UnrecognizedClientException

Mensaje: The Access Key ID or security token is invalid.

La firma de la solicitud es incorrecta. La causa ms probable es que un ID de clave de acceso o una


clave secreta de AWS sean incorrectos.

Reintentar? S

API Version 2012-08-10


198
Amazon DynamoDB Developer Guide
Control de errores en la aplicacin

ValidationException

Mensaje: Vara, segn el error concreto de que se trate.

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

Cdigo de estado HTTP 5xx


Un cdigo de estado HTTP 5xx indica un problema cuya resolucin corresponde a Amazon Web
Services. Puede ser un error transitorio, en cuyo caso puede reintentar la solicitud hasta que se ejecute
satisfactoriamente. En caso contrario, vaya al Panel de estado del servicio de AWS para comprobar si
existe algn problema funcional con el servicio.

Error interno del servidor (HTTP 500)

DynamoDB no pudo procesar la solicitud.

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.

Servicio no disponible (HTTP 503)

DynamoDB no est disponible en este momento. Debera tratarse de un estado temporal.

Reintentar? S

Control de errores en la aplicacin


Para que la aplicacin funcione sin problemas, es preciso agregar lgica que capture los errores y
responda a ellos. Los enfoques habituales incluyen el uso de bloques try-catch o instrucciones if-
then.

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.

Table table = dynamoDB.getTable("Movies");

try {
Item item = table.getItem("year", 1978, "title", "Superman");
if (item != null) {
System.out.println("Result: " + item);

API Version 2012-08-10


199
Amazon DynamoDB Developer Guide
Reintentos de error y retardo exponencial

} else {
//No such item exists in the table
System.out.println("Item not found");
}

} catch (AmazonServiceException ase) {


System.err.println("Could not complete operation");
System.err.println("Error Message: " + ase.getMessage());
System.err.println("HTTP Status: " + ase.getStatusCode());
System.err.println("AWS Error Code: " + ase.getErrorCode());
System.err.println("Error Type: " + ase.getErrorType());
System.err.println("Request ID: " + ase.getRequestId());

} catch (AmazonClientException ace) {


System.err.println("Internal error occured communicating with DynamoDB");
System.out.println("Error Message: " + ace.getMessage());
}

En este fragmento de cdigo, la construccin try-catch controla dos tipos de excepciones diferentes:

AmazonServiceException: se genera si la solicitud del cliente se ha transmitido correctamente a


DynamoDB, pero DynamoDB no ha podido procesarla y ha devuelto una respuesta de error.
AmazonClientException: se genera si el cliente no ha podido obtener una respuesta de un servicio o
s la ha obtenido pero no ha podido analizarla.

Reintentos de error y retardo exponencial


Numerosos componentes de una red, como los servidores DNS, los conmutadores o los balanceadores
de carga, entre otros, pueden generar errores en cualquier punto de la vida de una solicitud determinada.
La tcnica habitual para abordar estas respuestas de error en un entorno de red consiste en implementar
los reintentos en la aplicacin cliente. Esta tcnica aumenta la confiabilidad de la aplicacin y reducen los
costos operativos para el desarrollador.

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.

API Version 2012-08-10


200
Amazon DynamoDB Developer Guide
Operaciones por lotes y control de errores

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.

Operaciones por lotes y control de errores


El API de bajo nivel de DynamoDB admite las operaciones por lotes de lectura y escritura. BatchGetItem
lee elementos en una o varias tablas; BatchWriteItem coloca o elimina elementos en una o varias
tablas. Estas operaciones por lotes se implementan como encapsuladores en torno a otras operaciones de
DynamoDB que no son por lotes. Es decir, BatchGetItem invoca GetItem una vez para cada elemento
del lote. De igual forma,BatchWriteItem invoca DeleteItem o PutItem, segn proceda, para cada
elemento del lote.

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.

Interfaces de programacin de nivel superior para


DynamoDB
Los SDK de AWS proporcionan aplicaciones con interfaces de bajo nivel para trabajar con Amazon
DynamoDB. Estas clases y mtodos del lado del cliente se corresponden directamente con los API de bajo
nivel de DynamoDB. Sin embargo, muchos desarrolladores experimentan una sensacin de desconexin,
o "discrepancia de impedancia" cuando tienen que mapear tipos de datos complejos a los elementos de
una tabla de base de datos. Con una interfaz de bajo nivel de base de datos, los desarrolladores deben
escribir mtodos para leer o escribir datos de objetos en las tablas de las bases de datos, y viceversa. La
cantidad de cdigo adicional necesaria para cada combinacin de tipo de objeto y tabla de base de datos
puede resultar abrumadora.

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

API Version 2012-08-10


201
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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

Java: DynamoDBMapper (p. 202)

.NET

.NET: modelo de documento (p. 240)


.NET: modelo de persistencia de objetos (p. 262)

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;

API Version 2012-08-10


202
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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 {

private Integer id;


private String title;
private String ISBN;
private Set<String> bookAuthors;
private String someProp;

@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;}
}

En el cdigo anterior, la anotacin @DynamoDBTable mapea la clase CatalogItem a la tabla


ProductCatalog. Puede almacenar instancias de clases individuales como los elementos de la tabla. En la
definicin de clase, la anotacin @DynamoDBHashKey mapea la propiedad Id a la clave principal.

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 anotacin @DynamoDBAttribute es opcional cuando el nombre del atributo de DynamoDB coincide


con el nombre de la propiedad declarada en la clase. Si son distintos, use esta anotacin con el parmetro
attributeName () para especificar qu atributo de DynamoDB se corresponde con esta propiedad. En
el ejemplo anterior, la anotacin @DynamoDBAttribute se agrega a cada propiedad para asegurarse
de que los nombres de las propiedades coincidan exactamente con las tablas creadas en Creacin de
tablas y carga de ejemplos de datos (p. 291) y para guardar la coherencia con los nombres de atributos
utilizados en otros ejemplos de cdigo de esta gua.

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:

API Version 2012-08-10


203
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDBMapper mapper = new DynamoDBMapper(client);

CatalogItem item = new CatalogItem();


item.setId(102);
item.setTitle("Book 102 Title");
item.setISBN("222-2222222222");
item.setBookAuthors(new HashSet<String>(Arrays.asList("Author 1", "Author 2")));
item.setSomeProp("Test");

mapper.save(item);

En el siguiente fragmento de cdigo se muestra cmo recuperar el elemento y obtener acceso a algunos
de sus atributos:

CatalogItem partitionKey = new CatalogItem();

partitionKey.setId(102);
DynamoDBQueryExpression<CatalogItem> queryExpression = new
DynamoDBQueryExpression<CatalogItem>()
.withHashKeyValues(partitionKey);

List<CatalogItem> itemList = mapper.query(CatalogItem.class, queryExpression);

for (int i = 0; i < itemList.size(); i++) {


System.out.println(itemList.get(i).getTitle());
System.out.println(itemList.get(i).getBookAuthors());
}

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.

Tipos de datos admitidos


En esta seccin se describen los tipos de datos arbitrarios, las colecciones y los tipos de datos de Java
primitivos compatibles.

DynamoDB admite los siguientes tipos de datos y clases encapsuladoras primitivos.

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.

API Version 2012-08-10


204
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

En la tabla siguiente se resume el mapeo de los tipos de Java anteriores a los tipos de DynamoDB.

Tipo de Java Tipo de DynamoDB

Todos los tipos de nmeros N (tipo Number)

Strings S (tipo String)

Booleano N (tipo Number), 0 o 1.

Si lo prefiere, puede usar


@DynamoDBNativeBooleanType para
mapear un tipo Boolean de Java al tipo de
datos BOOL de DynamoDB. Para obtener ms
informacin, consulte Anotaciones de Java para
DynamoDB (p. 205).)

ByteBuffer B (tipo Binary)

Fecha S (tipo String). Los valores Date se almacenan


como cadenas con formato ISO-8601.

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).

Anotaciones de Java para DynamoDB


En esta seccin se describen las anotaciones que estn disponibles para mapear las clases y las
propiedades a las tablas y los atributos.

Para obtener la documentacin de Javadoc correspondiente, consulte Annotation Types Summary en la


AWS SDK for Java API Reference.
Note

En las anotaciones siguientes, solo son obligatorias DynamoDBTable y DynamoDBHashKey.

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)

API Version 2012-08-10


205
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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; }

DynamoDBMapper utiliza Authors como nombre de atributo al guardar el objeto en la tabla.

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.

En el siguiente fragmento se demuestra la utilizacin de 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; }

public static void saveItem() {


AutoGeneratedKeys obj = new AutoGeneratedKeys();
obj.setPayload("abc123");

// id field is null at this point


DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);
mapper.save(obj);

System.out.println("Object was saved with id " + obj.getId());


}
}

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.

public class ProductCatalogItem {

private Integer id; //partition key


private Pictures pictures;
/* ...other attributes omitted... */

API Version 2012-08-10


206
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

@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;}

// Additional properties go here.

@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:

ProductCatalogItem item = new ProductCatalogItem();

Pictures pix = new Pictures();


pix.setFrontView("http://example.com/products/123_front.jpg");
pix.setRearView("http://example.com/products/123_rear.jpg");
pix.setSideView("http://example.com/products/123_left_side.jpg");
item.setPictures(pix);

item.setId(123);

mapper.save(item);

El elemento ProductCatalog resultante tendra este aspecto (en formato JSON):

{
"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.

API Version 2012-08-10


207
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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")

API Version 2012-08-10


208
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

public class Reply {


private Integer id;
private String replyDateTime;

@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; }

// Additional properties go here.


}

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.

API Version 2012-08-10


209
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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.

Para obtener la documentacin de Javadoc correspondiente, consulte DynamoDBMapper en la AWS SDK


for Java API Reference.

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.

De forma predeterminada, solo se actualizan los atributos correspondientes a las propiedades de


clase mapeadas; los dems atributos de un elemento no se ven afectados. Sin embargo, si especifica
SaveBehavior.CLOBBER, puede forzar que se sobrescriba el elemento completo.

mapper.save(obj, new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.CLOBBER));

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

API Version 2012-08-10


210
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

SaveBehavior.CLOBBER. Para obtener ms informacin sobre el control de versiones, consulte Bloqueo


optimista con el nmero de versin (p. 235).

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.

CatalogItem item = mapper.load(CatalogItem.class, item.getId(),


new
DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));

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 .

Reply ( Id, ReplyDateTime, ... )

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

String forumName = "DynamoDB";


String forumSubject = "DynamoDB Thread 1";
String partitionKey = forumName + "#" + forumSubject;

long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L);


Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String twoWeeksAgoStr = df.format(twoWeeksAgo);

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();

API Version 2012-08-10


211
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

eav.put(":v1", new AttributeValue().withS(partitionKey));


eav.put(":v2",new AttributeValue().withS(twoWeeksAgoStr.toString()));

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()


.withKeyConditionExpression("Id = :v1 and ReplyDateTime > :v2")
.withExpressionAttributeValues(eav);

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

La consulta devuelve una coleccin de objetos Reply.

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; }

// Additional properties go here.


}

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.

HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


eav.put(":v1", new AttributeValue().withS("User A"));
eav.put(":v2", new AttributeValue().withS("DynamoDB"));

DynamoDBQueryExpression<PostedByMessage> queryExpression = new


DynamoDBQueryExpression<PostedByMessage>()
.withIndexName("PostedBy-Message-Index")
.withConsistentRead(false)
.withKeyConditionExpression("PostedBy = :v1 and begins_with(Message, :v2)")
.withExpressionAttributeValues(eav);

API Version 2012-08-10


212
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

List<PostedByMessage> iList = mapper.query(PostedByMessage.class, queryExpression);

La consulta devuelve una coleccin de objetos PostedByMessage.

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 .

Reply ( Id, ReplyDateTime, ... )

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

HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


eav.put(":v1", new AttributeValue().withS("2015"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()


.withFilterExpression("begins_with(ReplyDateTime,:v1)")
.withExpressionAttributeValues(eav);

List<Reply> replies = mapper.scan(Reply.class, scanExpression);

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.

En el siguiente fragmento de cdigo se examina PostedBy-Message-Index. No se utiliza ningn filtro de


examen, por lo que se devuelven todos los elementos del ndice.

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()


.withIndexName("PostedBy-Message-Index")
.withConsistentRead(false);

List<PostedByMessage> indexItems = mapper.scan(PostedByMessage.class, scanExpression);


Iterator<PostedByMessage> indexItems = iList.iterator();

API Version 2012-08-10


213
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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.

En el siguiente fragmento de cdigo Java se realiza un examen en paralelo de la tabla Product.

int numberOfThreads = 4;

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue> ();


eav.put(":n", new AttributeValue().withN("100"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()


.withFilterExpression("Price >= :n")
.withExpressionAttributeValues(eav);

List<Product> scanResult = mapper.parallelScan(Product.class, scanExpression,


numberOfThreads);

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.

Book book1 = new Book();


book1.id = 901;
book1.productCategory = "Book";
book1.title = "Book 901 Title";

Book book2 = new Book();


book2.id = 902;
book2.productCategory = "Book";
book2.title = "Book 902 Title";

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.

ArrayList<Object> itemsToGet = new ArrayList<Object>();

ForumItem forumItem = new ForumItem();


forumItem.setForumName("Amazon DynamoDB");

API Version 2012-08-10


214
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

itemsToGet.add(forumItem);

ThreadItem threadItem = new ThreadItem();


threadItem.setForumName("Amazon DynamoDB");
threadItem.setSubject("Amazon DynamoDB thread 1 message text");
itemsToGet.add(threadItem);

Map<String, List<Object>> items = mapper.batchLoad(itemsToGet);

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.

Book book1 = mapper.load(Book.class, 901);


Book book2 = mapper.load(Book.class, 902);
mapper.batchDelete(Arrays.asList(book1, book2));

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.

// Create a Forum item to save


Forum forumItem = new Forum();
forumItem.name = "Test BatchWrite Forum";

// Create a Thread item to save


Thread threadItem = new Thread();
threadItem.forumName = "AmazonDynamoDB";
threadItem.subject = "My sample question";

// Load a ProductCatalog item to delete


Book book3 = mapper.load(Book.class, 903);

List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem);


List<Book> objectsToDelete = Arrays.asList(book3);

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.

API Version 2012-08-10


215
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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 {

...

public S3Link productImage;

....

@DynamoDBAttribute(attributeName = "ProductImage")
public S3Link getProductImage() {
return productImage;
}

public void setProductImage(S3Link productImage) {


this.productImage = 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.

CatalogItem item = new CatalogItem();

item.id = 150;
item.title = "Book 150 Title";

String myS3Bucket = "myS3bucket";


String myS3Key = "productImages/book_150_cover.jpg";
item.setProductImage(mapper.createS3Link(myS3Bucket, myS3Key));

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.

Ajustes de configuracin opcionales para DynamoDBMapper


Al crear una instancia de DynamoDBMapper, presenta algunos comportamientos predeterminados que se
pueden anular mediante la clase DynamoDBMapperConfig.

En el siguiente fragmento de cdigo se crea una clase DynamoDBMapper con ajustes personalizados:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

API Version 2012-08-10


216
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig(


DynamoDBMapperConfig.SaveBehavior.CLOBBER,
DynamoDBMapperConfig.ConsistentReads.CONSISTENT,
null, //TableNameOverride - leaving this at default setting
DynamoDBMapperConfig.PaginationLoadingStrategy.EAGER_LOADING
);

DynamoDBMapper mapper = new DynamoDBMapper(client, mapperConfig, cp);

Para obtener ms informacin, consulte DynamoDBMapperConfig en la AWS SDK for Java API Reference.

Puede usar los argumentos siguientes para una instancia de DynamoDBMapperConfig:

Un valor de enumeracin DynamoDBMapperConfig.ConsistentReads:


EVENTUAL: la instancia de mapeador utiliza una solicitud de lectura consistente final.
CONSISTENT: la instancia de mapeador utiliza una solicitud de lectura de consistencia alta. Puede
usar este ajuste opcional con las operaciones load, query o scan operations. Las lecturas de
consistencia alta afectan al desempeo y a la facturacin; consulte la pgina Detalles del producto de
DynamoDB para obtener ms informacin.

Si no especifica un ajuste de consistencia de lectura para la instancia de mapeador, el valor


predeterminado es EVENTUAL.
Un valor de enumeracin DynamoDBMapperConfig.PaginationLoadingStrategy: controla cmo
la instancia de mapeador procesa una lista de datos paginados, como los resultados de una operacin
query o scan:
LAZY_LOADING: la instancia de mapeador carga los datos cuando es posible y conserva todos los
resultados cargados en la memoria.
EAGER_LOADING: la instancia de mapeador carga los datos tan pronto como se inicializa la lista.
ITERATION_ONLY: solo se puede usar un iterador para leer datos en la lista. Durante la iteracin,
la lista borrar todos los resultados anteriores antes de cargar la pgina siguiente, para que la lista
conserve como mximo una pgina de resultados cargados en la memoria. Por consiguiente, la lista
solamente se puede recorrer en iteracin una vez. Esta estrategia se recomienda para administrar
elementos de gran tamao, con el fin de reducir la sobrecarga de la memoria.

Si no especifica una estrategia de carga de paginacin para la instancia de mapeador, el valor


predeterminado es LAZY_LOADING.
Un valor de enumeracin DynamoDBMapperConfig.SaveBehavior: especifica cmo la instancia de
mapeador administrar los atributos durante las operaciones de almacenamiento:
UPDATE: durante una operacin de almacenamiento, se actualizan todos los atributos modelados
y los atributos no modelados no sufren cambios. Los tipos numricos primitivos (byte, int, long) se
establecen en 0. Los tipos de objeto se establecen en null.
CLOBBER: borra y sustituye los atributos, incluidos los no modelados, durante una operacin de
almacenamiento. Para ello, se elimina el elemento y se vuelve a crear. Tambin se descartan las
restricciones de los campos con versiones.

Si no especifica el comportamiento al guardar para la instancia de mapeador, el valor predeterminado es


UPDATE.
Un objeto DynamoDBMapperConfig.TableNameOverride: indica a la instancia de mapeador que
pase por alto el nombre de tabla especificado por la anotacin DynamoDBTable de la clase y, en su
lugar, use el nombre de tabla alternativo suministrado. Esto resulta til cuando se particionan los datos
en varias tablas en tiempo de ejecucin.

Puede anular el objeto de configuracin predeterminado para DynamoDBMapper en cada operacin,


conforme lo necesite.
API Version 2012-08-10
217
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

Ejemplo: Operaciones CRUD


En el siguiente ejemplo de cdigo Java se declara una clase CatalogItem que tiene las propiedades Id,
Title, ISBN y Authors. Se utilizan las anotaciones para mapear estas propiedades a la tabla ProductCatalog
de DynamoDB. En el ejemplo de cdigo se utiliza DynamoDBMapper para guardar un objeto de libro,
recuperarlo, actualizarlo y eliminarlo.
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).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.datamodeling;

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;

public class DynamoDBMapperCRUDExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

public static void main(String[] args) throws IOException {


testCRUDOperations();
System.out.println("Example complete!");
}

@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;
}

public void setId(Integer id) {


this.id = id;
}

@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}

public void setTitle(String title) {

API Version 2012-08-10


218
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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;
}

@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", bookAuthors=" + bookAuthors + ", id=" + id +
", title=" + title + "]";
}
}

private static void testCRUDOperations() {

CatalogItem item = new CatalogItem();


item.setId(601);
item.setTitle("Book 601");
item.setISBN("611-1111111111");
item.setBookAuthors(new HashSet<String>(Arrays.asList("Author1", "Author2")));

// Save the item (book).


DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(item);

// Retrieve the item.


CatalogItem itemRetrieved = mapper.load(CatalogItem.class, 601);
System.out.println("Item retrieved:");
System.out.println(itemRetrieved);

// Update the item.


itemRetrieved.setISBN("622-2222222222");
itemRetrieved.setBookAuthors(new HashSet<String>(Arrays.asList("Author1",
"Author3")));
mapper.save(itemRetrieved);
System.out.println("Item updated:");
System.out.println(itemRetrieved);

// Retrieve the updated item.


DynamoDBMapperConfig config = new
DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT);
CatalogItem updatedItem = mapper.load(CatalogItem.class, 601, config);
System.out.println("Retrieved the previously updated item:");
System.out.println(updatedItem);

// Delete the item.


mapper.delete(updatedItem);

// Try to retrieve deleted item.


CatalogItem deletedItem = mapper.load(CatalogItem.class, updatedItem.getId(),
config);

API Version 2012-08-10


219
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

if (deletedItem == null) {
System.out.println("Done - Sample item is deleted.");
}
}
}

Ejemplo: Operaciones de escritura por lotes


En el siguiente ejemplo de cdigo Java se declaran las clases Book, Forum, Thread y Reply y se mapean a
tablas de DynamoDB utilizando la clase DynamoDBMapper.

En el cdigo se ilustran las siguientes operaciones de escritura por lotes:

batchSave para colocar elementos de libro en la tabla ProductCatalog.


batchDelete para eliminar elementos de la tabla ProductCatalog.
batchWrite para colocar y eliminar elementos de las tablas Forum y Thread.

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

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.datamodeling;

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;

public class DynamoDBMapperBatchWriteExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-
dd'T'HH:mm:ss.SSS'Z'");

public static void main(String[] args) throws Exception {


try {

DynamoDBMapper mapper = new DynamoDBMapper(client);

testBatchSave(mapper);
testBatchDelete(mapper);
testBatchWrite(mapper);

System.out.println("Example complete!");

API Version 2012-08-10


220
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

}
catch (Throwable t) {
System.err.println("Error running the DynamoDBMapperBatchWriteExample: " + t);
t.printStackTrace();
}
}

private static void testBatchSave(DynamoDBMapper mapper) {

Book book1 = new Book();


book1.id = 901;
book1.inPublication = true;
book1.ISBN = "902-11-11-1111";
book1.pageCount = 100;
book1.price = 10;
book1.productCategory = "Book";
book1.title = "My book created in batch write";

Book book2 = new Book();


book2.id = 902;
book2.inPublication = true;
book2.ISBN = "902-11-12-1111";
book2.pageCount = 200;
book2.price = 20;
book2.productCategory = "Book";
book2.title = "My second book created in batch write";

Book book3 = new Book();


book3.id = 903;
book3.inPublication = false;
book3.ISBN = "902-11-13-1111";
book3.pageCount = 300;
book3.price = 25;
book3.productCategory = "Book";
book3.title = "My third book created in batch write";

System.out.println("Adding three books to ProductCatalog table.");


mapper.batchSave(Arrays.asList(book1, book2, book3));
}

private static void testBatchDelete(DynamoDBMapper mapper) {

Book book1 = mapper.load(Book.class, 901);


Book book2 = mapper.load(Book.class, 902);
System.out.println("Deleting two books from the ProductCatalog table.");
mapper.batchDelete(Arrays.asList(book1, book2));
}

private static void testBatchWrite(DynamoDBMapper mapper) {

// Create Forum item to save


Forum forumItem = new Forum();
forumItem.name = "Test BatchWrite Forum";
forumItem.threads = 0;
forumItem.category = "Amazon Web Services";

// Create Thread item to save


Thread threadItem = new Thread();
threadItem.forumName = "AmazonDynamoDB";
threadItem.subject = "My sample question";
threadItem.message = "BatchWrite message";
List<String> tags = new ArrayList<String>();
tags.add("batch operations");
tags.add("write");
threadItem.tags = new HashSet<String>(tags);

API Version 2012-08-10


221
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

// Load ProductCatalog item to delete


Book book3 = mapper.load(Book.class, 903);

List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem);


List<Book> objectsToDelete = Arrays.asList(book3);

DynamoDBMapperConfig config = new


DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.CLOBBER);
mapper.batchWrite(objectsToWrite, objectsToDelete, config);
}

@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;
}

public void setId(int 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 = "Price")
public int getPrice() {
return price;
}

public void setPrice(int price) {


this.price = price;
}

@DynamoDBAttribute(attributeName = "PageCount")
public int getPageCount() {
return pageCount;
}

public void setPageCount(int pageCount) {


this.pageCount = pageCount;

API Version 2012-08-10


222
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}

public void setProductCategory(String productCategory) {


this.productCategory = productCategory;
}

@DynamoDBAttribute(attributeName = "InPublication")
public boolean getInPublication() {
return inPublication;
}

public void setInPublication(boolean inPublication) {


this.inPublication = 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;
}

public void setId(String id) {


this.id = id;
}

// Sort key
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
public String getReplyDateTime() {
return replyDateTime;
}

public void setReplyDateTime(String replyDateTime) {


this.replyDateTime = replyDateTime;
}

@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}

public void setMessage(String message) {


this.message = message;
}

@DynamoDBAttribute(attributeName = "PostedBy")

API Version 2012-08-10


223
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

public String getPostedBy() {


return postedBy;
}

public void setPostedBy(String postedBy) {


this.postedBy = 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;
}

public void setForumName(String forumName) {


this.forumName = forumName;
}

// Sort key
@DynamoDBRangeKey(attributeName = "Subject")
public String getSubject() {
return subject;
}

public void setSubject(String subject) {


this.subject = subject;
}

@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}

public void setMessage(String message) {


this.message = message;
}

@DynamoDBAttribute(attributeName = "LastPostedDateTime")
public String getLastPostedDateTime() {
return lastPostedDateTime;
}

public void setLastPostedDateTime(String lastPostedDateTime) {


this.lastPostedDateTime = lastPostedDateTime;
}

@DynamoDBAttribute(attributeName = "LastPostedBy")
public String getLastPostedBy() {
return lastPostedBy;
}

public void setLastPostedBy(String lastPostedBy) {


this.lastPostedBy = lastPostedBy;

API Version 2012-08-10


224
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

@DynamoDBAttribute(attributeName = "Tags")
public Set<String> getTags() {
return tags;
}

public void setTags(Set<String> tags) {


this.tags = tags;
}

@DynamoDBAttribute(attributeName = "Answered")
public int getAnswered() {
return answered;
}

public void setAnswered(int answered) {


this.answered = answered;
}

@DynamoDBAttribute(attributeName = "Views")
public int getViews() {
return views;
}

public void setViews(int views) {


this.views = views;
}

@DynamoDBAttribute(attributeName = "Replies")
public int getReplies() {
return replies;
}

public void setReplies(int replies) {


this.replies = 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;
}

public void setName(String name) {


this.name = name;
}

@DynamoDBAttribute(attributeName = "Category")
public String getCategory() {
return category;
}

public void setCategory(String category) {


this.category = category;
}

@DynamoDBAttribute(attributeName = "Threads")

API Version 2012-08-10


225
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

public int getThreads() {


return threads;
}

public void setThreads(int threads) {


this.threads = threads;
}
}
}

Ejemplo: Consulta y examen


En el ejemplo de Java de esta seccin se definen las clases siguientes y se mapean a las tablas de
DynamoDB. Para obtener ms informacin sobre cmo crear ejemplos de tablas, consulte Creacin de
tablas y carga de ejemplos de datos (p. 291).

La clase Book se mapea a la tabla ProductCatalog.


Las clases Forum, Thread y Reply se mapean a las tablas del mismo nombre.

A continuacin, en el ejemplo se usa una instancia de DynamoDBMapper para ejecutar las siguientes
operaciones de consulta y examen.

Obtener un libro por Id.

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 un valor especificado.

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

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.

API Version 2012-08-10


226
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

// Licensed under the Apache License, Version 2.0.


package com.amazonaws.codesamples.datamodeling;

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;

public class DynamoDBMapperQueryScanExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

public static void main(String[] args) throws Exception {


try {

DynamoDBMapper mapper = new DynamoDBMapper(client);

// Get a book - Id=101


GetBook(mapper, 101);
// Sample forum and thread to test queries.
String forumName = "Amazon DynamoDB";
String threadSubject = "DynamoDB Thread 1";
// Sample queries.
FindRepliesInLast15Days(mapper, forumName, threadSubject);
FindRepliesPostedWithinTimePeriod(mapper, forumName, threadSubject);

// 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();
}
}

private static void GetBook(DynamoDBMapper mapper, int id) throws Exception {


System.out.println("GetBook: Get book Id='101' ");
System.out.println("Book table has no sort key. You can do GetItem, but not
Query.");
Book book = mapper.load(Book.class, 101);
System.out.format("Id = %s Title = %s, ISBN = %s %n", book.getId(),
book.getTitle(), book.getISBN());
}

API Version 2012-08-10


227
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

private static void FindRepliesInLast15Days(DynamoDBMapper mapper, String forumName,


String threadSubject)
throws Exception {
System.out.println("FindRepliesInLast15Days: Replies within last 15 days.");

String partitionKey = forumName + "#" + threadSubject;

long twoWeeksAgoMilli = (new Date()).getTime() - (15L * 24L * 60L * 60L * 1000L);


Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-
dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String twoWeeksAgoStr = dateFormatter.format(twoWeeksAgo);

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


eav.put(":val1", new AttributeValue().withS(partitionKey));
eav.put(":val2", new AttributeValue().withS(twoWeeksAgoStr.toString()));

DynamoDBQueryExpression<Reply> queryExpression = new


DynamoDBQueryExpression<Reply>()
.withKeyConditionExpression("Id = :val1 and ReplyDateTime
> :val2").withExpressionAttributeValues(eav);

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

for (Reply reply : latestReplies) {


System.out.format("Id=%s, Message=%s, PostedBy=%s %n, ReplyDateTime=%s %n",
reply.getId(),
reply.getMessage(), reply.getPostedBy(), reply.getReplyDateTime());
}
}

private static void FindRepliesPostedWithinTimePeriod(DynamoDBMapper mapper, String


forumName, String threadSubject)
throws Exception {
String partitionKey = forumName + "#" + threadSubject;

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);

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


eav.put(":val1", new AttributeValue().withS(partitionKey));
eav.put(":val2", new AttributeValue().withS(startDate));
eav.put(":val3", new AttributeValue().withS(endDate));

DynamoDBQueryExpression<Reply> queryExpression = new


DynamoDBQueryExpression<Reply>()

API Version 2012-08-10


228
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

.withKeyConditionExpression("Id = :val1 and ReplyDateTime between :val2


and :val3")
.withExpressionAttributeValues(eav);

List<Reply> betweenReplies = mapper.query(Reply.class, queryExpression);

for (Reply reply : betweenReplies) {


System.out.format("Id=%s, Message=%s, PostedBy=%s %n, PostedDateTime=%s %n",
reply.getId(),
reply.getMessage(), reply.getPostedBy(), reply.getReplyDateTime());
}

private static void FindBooksPricedLessThanSpecifiedValue(DynamoDBMapper mapper, String


value) throws Exception {

System.out.println("FindBooksPricedLessThanSpecifiedValue: Scan ProductCatalog.");

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


eav.put(":val1", new AttributeValue().withN(value));
eav.put(":val2", new AttributeValue().withS("Book"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()


.withFilterExpression("Price < :val1 and ProductCategory
= :val2").withExpressionAttributeValues(eav);

List<Book> scanResult = mapper.scan(Book.class, scanExpression);

for (Book book : scanResult) {


System.out.println(book);
}
}

private static void FindBicyclesOfSpecificTypeWithMultipleThreads(DynamoDBMapper


mapper, int numberOfThreads,
String bicycleType) throws Exception {

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));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()


.withFilterExpression("ProductCategory = :val1 and BicycleType
= :val2").withExpressionAttributeValues(eav);

List<Bicycle> scanResult = mapper.parallelScan(Bicycle.class, scanExpression,


numberOfThreads);
for (Bicycle bicycle : scanResult) {
System.out.println(bicycle);
}
}

@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")

API Version 2012-08-10


229
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

public int getId() {


return id;
}

public void setId(int 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 = "Price")
public int getPrice() {
return price;
}

public void setPrice(int price) {


this.price = price;
}

@DynamoDBAttribute(attributeName = "PageCount")
public int getPageCount() {
return pageCount;
}

public void setPageCount(int pageCount) {


this.pageCount = pageCount;
}

@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}

public void setProductCategory(String productCategory) {


this.productCategory = productCategory;
}

@DynamoDBAttribute(attributeName = "InPublication")
public boolean getInPublication() {
return inPublication;
}

public void setInPublication(boolean inPublication) {


this.inPublication = inPublication;
}

@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", price=" + price + ", product category=" +
productCategory + ", id=" + id

API Version 2012-08-10


230
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

+ ", title=" + title + "]";


}

@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;
}

public void setId(int id) {


this.id = id;
}

@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}

public void setTitle(String title) {


this.title = title;
}

@DynamoDBAttribute(attributeName = "Description")
public String getDescription() {
return description;
}

public void setDescription(String description) {


this.description = description;
}

@DynamoDBAttribute(attributeName = "BicycleType")
public String getBicycleType() {
return bicycleType;
}

public void setBicycleType(String bicycleType) {


this.bicycleType = bicycleType;
}

@DynamoDBAttribute(attributeName = "Brand")
public String getBrand() {
return brand;
}

public void setBrand(String brand) {


this.brand = brand;
}

@DynamoDBAttribute(attributeName = "Price")
public int getPrice() {
return price;
}

API Version 2012-08-10


231
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

public void setPrice(int price) {


this.price = price;
}

@DynamoDBAttribute(attributeName = "Color")
public List<String> getColor() {
return color;
}

public void setColor(List<String> color) {


this.color = color;
}

@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}

public void setProductCategory(String productCategory) {


this.productCategory = 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;
}

public void setId(String id) {


this.id = id;
}

// Range key
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
public String getReplyDateTime() {
return replyDateTime;
}

public void setReplyDateTime(String replyDateTime) {


this.replyDateTime = replyDateTime;
}

@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}

public void setMessage(String message) {


this.message = message;
}

API Version 2012-08-10


232
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

@DynamoDBAttribute(attributeName = "PostedBy")
public String getPostedBy() {
return postedBy;
}

public void setPostedBy(String postedBy) {


this.postedBy = 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;
}

public void setForumName(String forumName) {


this.forumName = forumName;
}

// Range key
@DynamoDBRangeKey(attributeName = "Subject")
public String getSubject() {
return subject;
}

public void setSubject(String subject) {


this.subject = subject;
}

@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}

public void setMessage(String message) {


this.message = message;
}

@DynamoDBAttribute(attributeName = "LastPostedDateTime")
public String getLastPostedDateTime() {
return lastPostedDateTime;
}

public void setLastPostedDateTime(String lastPostedDateTime) {


this.lastPostedDateTime = lastPostedDateTime;
}

@DynamoDBAttribute(attributeName = "LastPostedBy")
public String getLastPostedBy() {
return lastPostedBy;
}

API Version 2012-08-10


233
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

public void setLastPostedBy(String lastPostedBy) {


this.lastPostedBy = lastPostedBy;
}

@DynamoDBAttribute(attributeName = "Tags")
public Set<String> getTags() {
return tags;
}

public void setTags(Set<String> tags) {


this.tags = tags;
}

@DynamoDBAttribute(attributeName = "Answered")
public int getAnswered() {
return answered;
}

public void setAnswered(int answered) {


this.answered = answered;
}

@DynamoDBAttribute(attributeName = "Views")
public int getViews() {
return views;
}

public void setViews(int views) {


this.views = views;
}

@DynamoDBAttribute(attributeName = "Replies")
public int getReplies() {
return replies;
}

public void setReplies(int replies) {


this.replies = 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;
}

public void setName(String name) {


this.name = name;
}

@DynamoDBAttribute(attributeName = "Category")
public String getCategory() {
return category;
}

public void setCategory(String category) {


this.category = category;
}

API Version 2012-08-10


234
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

@DynamoDBAttribute(attributeName = "Threads")
public int getThreads() {
return threads;
}

public void setThreads(int threads) {


this.threads = threads;
}
}
}

Bloqueo optimista con el nmero de versin


El bloqueo optimista es una estrategia para asegurarse de que el elemento del lado del cliente que se va a
actualizar (o eliminar) sea el mismo que figura en DynamoDB. Si utiliza esta estrategia, las escrituras en su
base de datos se protegen contra posibles sobrescrituras de otros y viceversa.

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.

ConditionalCheckFailedException se lanza si:

Utiliza el bloqueo optimista con @DynamoDBVersionAttribute y el valor de versin en el servidor es


distinto del valor en el lado del cliente.
Especifique sus propias limitaciones condicionales al guardar los datos utilizando DynamoDBMapper con
DynamoDBSaveExpression y estas limitaciones han fallado.

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 {

private Integer id;


private String title;
private String ISBN;
private Set<String> bookAuthors;
private String someProp;
private Long version;

@DynamoDBHashKey(attributeName="Id")

API Version 2012-08-10


235
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

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;}

@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.

Deshabilitacin del bloqueo optimista


Para deshabilitar el bloqueo optimista, puede cambiar el valor de enumeracin
DynamoDBMapperConfig.SaveBehavior de UPDATE a CLOBBER. Para ello, puede crear una instancia
de DynamoDBMapperConfig que omita la comprobacin de versin y usar esta instancia en todas
las solicitudes. Para obtener informacin acerca de DynamoDBMapperConfig.SaveBehavior y
otros parmetros opcionales de DynamoDBMapper, consulte Ajustes de configuracin opcionales para
DynamoDBMapper (p. 216).

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

DynamoDBMapper mapper = new DynamoDBMapper(client);

API Version 2012-08-10


236
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

// Load a catalog item.


CatalogItem item = mapper.load(CatalogItem.class, 101);
item.setTitle("This is a new title for the item");
...
// Save the item.
mapper.save(item,
new DynamoDBMapperConfig(
DynamoDBMapperConfig.SaveBehavior.CLOBBER));

Mapeo de datos arbitrarios


Adems de los tipos de Java admitidos (consulte Tipos de datos admitidos (p. 204)), puede utilizar
tipos de la aplicacin para los cuales no exista un mapeo directo a los tipos de DynamoDB. Para asignar
estos tipos, debe proporcionar una implementacin que convierta el tipo complejo en un tipo admitido
por DynamoDB y viceversa, y anotar el mtodo de acceso al tipo complejo mediante la anotacin
@DynamoDBTypeConverted. El cdigo convertidor transforma los datos al guardar o cargar los objetos.
Tambin se usa para todas las operaciones que consumen tipos complejos. Tenga en cuenta que, al
comparar datos durante las operaciones de consulta y examen, las comparaciones se realizan respecto a
los datos almacenados en DynamoDB.

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;

public class DynamoDBMapperExample {

static AmazonDynamoDB client;

public static void main(String[] args) throws IOException {

// Set the AWS region you want to access.

API Version 2012-08-10


237
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

Regions usWest2 = Regions.US_WEST_2;


client = AmazonDynamoDBClientBuilder.standard().withRegion(usWest2).build();

DimensionType dimType = new DimensionType();


dimType.setHeight("8.00");
dimType.setLength("11.0");
dimType.setThickness("1.0");

Book book = new Book();


book.setId(502);
book.setTitle("Book 502");
book.setISBN("555-5555555555");
book.setBookAuthors(new HashSet<String>(Arrays.asList("Author1", "Author2")));
book.setDimensions(dimType);

DynamoDBMapper mapper = new DynamoDBMapper(client);


mapper.save(book);

Book bookRetrieved = mapper.load(Book.class, 502);


System.out.println("Book info: " + "\n" + bookRetrieved);

bookRetrieved.getDimensions().setHeight("9.0");
bookRetrieved.getDimensions().setLength("12.0");
bookRetrieved.getDimensions().setThickness("2.0");

mapper.save(bookRetrieved);

bookRetrieved = mapper.load(Book.class, 502);


System.out.println("Updated book info: " + "\n" + 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;
}

public void setId(int 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;
}

API Version 2012-08-10


238
Amazon DynamoDB Developer Guide
Java: DynamoDBMapper

@DynamoDBAttribute(attributeName = "Authors")
public Set<String> getBookAuthors() {
return bookAuthors;
}

public void setBookAuthors(Set<String> bookAuthors) {


this.bookAuthors = 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 + "]";
}
}

static public class DimensionType {

private String length;


private String height;
private String thickness;

public String getLength() {


return length;
}

public void setLength(String length) {


this.length = length;
}

public String getHeight() {


return height;
}

public void setHeight(String height) {


this.height = height;
}

public String getThickness() {


return thickness;
}

public void setThickness(String thickness) {


this.thickness = thickness;
}
}

// Converts the complex type DimensionType to a string and vice-versa.


static public class DimensionTypeConverter implements DynamoDBTypeConverter<String,
DimensionType> {

API Version 2012-08-10


239
Amazon DynamoDB Developer Guide
.NET: modelo de documento

@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) {

DimensionType itemDimension = new DimensionType();


try {
if (s != null && s.length() != 0) {
String[] data = s.split("x");
itemDimension.setLength(data[0].trim());
itemDimension.setHeight(data[1].trim());
itemDimension.setThickness(data[2].trim());
}
}
catch (Exception e) {
e.printStackTrace();
}

return itemDimension;
}
}
}

.NET: modelo de documento


Temas
Operaciones que no se admiten en el modelo de documento (p. 241)
Uso de elementos en DynamoDB mediante el modelo de documento del AWS SDK para .NET
(p. 241)
Obtencin de un elemento: Table.GetItem (p. 244)
Eliminacin de un elemento: Table.DeleteItem (p. 245)
Actualizacin de un elemento: Table.UpdateItem (p. 246)
Escritura por lotes: colocacin y eliminacin de varios elementos (p. 248)
Ejemplo: Operaciones CRUD con el modelo de documento del AWS SDK para .NET (p. 250)
Ejemplo: Operaciones por lotes con el API del modelo de documento del AWS SDK
para .NET (p. 253)
Consulta de tablas en DynamoDB mediante el modelo de documento del AWS SDK
para .NET (p. 254)

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

API Version 2012-08-10


240
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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.

Operaciones que no se admiten en el modelo de documento


Las clases del modelo de documento no se pueden usar para crear, actualizar ni eliminar tablas. Sin
embargo, el modelo de documento admite la mayora de las operaciones de datos.

Uso de elementos en DynamoDB mediante el modelo de


documento del AWS SDK para .NET
Temas
Colocacin de un elemento: mtodo Table.PutItem (p. 242)
Especificacin de parmetros opcionales (p. 243)

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

Table table = Table.LoadTable(client, "ProductCatalog");

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:

API Version 2012-08-10


241
Amazon DynamoDB Developer Guide
.NET: modelo de documento

Example

// Configuration object that specifies optional parameters.


GetItemOperationConfig config = new GetItemOperationConfig()
{
AttributesToGet = new List<string>() { "Id", "Title" },
};
// Pass in the configuration to the GetItem method.
// 1. Table that has only a partition key as primary key.
Table.GetItem(Primitive partitionKey, GetItemOperationConfig config);
// 2. Table that has both a partition key and a sort key.
Table.GetItem(Primitive partitionKey, Primitive sortKey, GetItemOperationConfig config);

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.

Colocacin de un elemento: mtodo Table.PutItem


El mtodo PutItem carga la instancia de Document de entrada en la tabla. Si ya existe en la tabla un
elemento con clave principal que se ha especificado en el valor de Document de entrada, entonces la
operacin PutItem sustituye el elemento existente completo. El nuevo elemento ser idntico al objeto
Document que haya proporcionado al mtodo PutItem. Tenga en cuenta que esto significa que, si el
elemento original tena atributos adicionales, estos ya no estarn presentes en el nuevo elemento. A
continuacin se indican los pasos que debe seguir para colocar un nuevo elemento en una tabla con el
modelo de documento del AWS SDK para .NET.

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 table = Table.LoadTable(client, "ProductCatalog");

var book = new Document();


book["Id"] = 101;
book["Title"] = "Book 101 Title";
book["ISBN"] = "11-11-11-11";
book["Authors"] = new List<string> { "Author 1", "Author 2" };
book["InStock"] = new DynamoDBBool(true);
book["QuantityOnHand"] = new DynamoDBNull();

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

API Version 2012-08-10


242
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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.

List: use el constructor DynamoDBList.


Map: use el constructor Document.

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 table = Table.LoadTable(client, "ProductCatalog");

var book = new Document();


book["Id"] = 101;

/*other attributes omitted for brevity...*/

var relatedItems = new DynamoDBList();


relatedItems.Add(341);
relatedItems.Add(472);
relatedItems.Add(649);
item.Add("RelatedItems", relatedItems);

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

Table table = Table.LoadTable(client, "ProductCatalog");

var book = new Document();


book["Id"] = 101;

/*other attributes omitted for brevity...*/

var pictures = new Document();


pictures.Add("FrontView", "http://example.com/products/101_front.jpg" );
pictures.Add("RearView", "http://example.com/products/101_rear.jpg" );

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.

Especificacin de parmetros opcionales


Puede configurar parmetros opcionales para la operacin PutItem agregando el parmetro
PutItemOperationConfig. Para obtener una lista completa de parmetros opcionales, consulte

API Version 2012-08-10


243
Amazon DynamoDB Developer Guide
.NET: modelo de documento

PutItem. En el siguiente fragmento de cdigo C# se coloca un elemento en la tabla ProductCatalog. En l


se especifica el parmetro opcional siguiente:

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 table = Table.LoadTable(client, "ProductCatalog");

var book = new Document();


book["Id"] = 555;
book["Title"] = "Book 555 Title";
book["Price"] = "25.00";
book["ISBN"] = "55-55-55-55";
book["Name"] = "Item 1 updated";
book["Authors"] = new List<string> { "Author x", "Author y" };
book["InStock"] = new DynamoDBBool(true);
book["QuantityOnHand"] = new DynamoDBNull();

// Create a condition expression for the optional conditional put operation.


Expression expr = new Expression();
expr.ExpressionStatement = "ISBN = :val";
expr.ExpressionAttributeValues[":val"] = "55-55-55-55";

PutItemOperationConfig config = new PutItemOperationConfig()


{
// Optional parameter.
ConditionalExpression = expr
};

table.PutItem(book, config);

Obtencin de un elemento: Table.GetItem


La operacin GetItem recupera un elemento como una instancia de Document. Debe proporcionar la
clave principal del elemento que desea recuperar tal y como se muestra en el siguiente fragmento de
cdigo C#:

Example

Table table = Table.LoadTable(client, "ProductCatalog");


Document document = table.GetItem(101); // Primary key 101.

La operacin GetItem devuelve todos los atributos del elemento y, de forma predeterminada, utiliza la
lectura consistente final (consulte Consistencia de lectura (p. 16)).

Especificacin de parmetros opcionales


Puede configurar opciones adicionales para la operacin GetItem agregando el parmetro
GetItemOperationConfig. Para obtener una lista completa de parmetros opcionales, consulte
GetItem. En el siguiente fragmento de cdigo C# se recupera un elemento de la tabla ProductCatalog. Se
especifica GetItemOperationConfig para proporcionar los parmetros opcionales siguientes:

El parmetro AttributesToGet para recuperar solamente los atributos especificados.

API Version 2012-08-10


244
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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

Table table = Table.LoadTable(client, "ProductCatalog");

GetItemOperationConfig config = new GetItemOperationConfig()


{
AttributesToGet = new List<string>() { "Id", "Title", "Authors", "InStock",
"QuantityOnHand" },
ConsistentRead = true
};
Document doc = table.GetItem(101, config);

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:

List: use el mtodo AsDynamoDBList.


Map: use el mtodo AsDocument.

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

DynamoDBList relatedItems = doc["RelatedItems"].AsDynamoDBList();

Document pictures = doc["Pictures"].AsDocument();

Eliminacin de un elemento: Table.DeleteItem


La operacin DeleteItem elimina un elemento de una tabla. Puede pasar la clave principal del elemento
como parmetro o, si ya ha ledo un elemento y tiene el objeto Document correspondiente, puede pasarlo
como parmetro al mtodo DeleteItem, como se muestra en el siguiente fragmento de cdigo C#.

Example

API Version 2012-08-10


245
Amazon DynamoDB Developer Guide
.NET: modelo de documento

Table table = Table.LoadTable(client, "ProductCatalog");

// Retrieve a book (a Document instance)


Document document = table.GetItem(111);

// 1) Delete using the Document instance.


table.DeleteItem(document);

// 2) Delete using the primary key.


int partitionKey = 222;
table.DeleteItem(partitionKey)

Especificacin de parmetros opcionales


Puede configurar opciones adicionales para la operacin Delete agregando el parmetro
DeleteItemOperationConfig. Para obtener una lista completa de parmetros opcionales, consulte
DeleteTable. En el siguiente fragmento de cdigo C# se especifican los dos parmetros opcionales
siguientes:

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

Table table = Table.LoadTable(client, "ProductCatalog");


int partitionKey = 111;

Expression expr = new Expression();


expr.ExpressionStatement = "ISBN = :val";
expr.ExpressionAttributeValues[":val"] = "11-11-11-11";

// Specify optional parameters for Delete operation.


DeleteItemOperationConfig config = new DeleteItemOperationConfig
{
ConditionalExpression = expr,
ReturnValues = ReturnValues.AllOldAttributes // This is the only supported value when
using the document model.
};

// Delete the book.


Document d = table.DeleteItem(partitionKey, config);

Actualizacin de un elemento: Table.UpdateItem


La operacin UpdateItem actualiza un elemento si existe. Si el elemento que tiene clave principal
especificada no se encuentra, la operacin UpdateItem agrega un nuevo elemento.

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.

La accin UpdateItem se rige por las directrices siguientes:

Si el elemento no existe, UpdateItem agrega un elemento nuevo utilizando la clave principal


especificada en la informacin de entrada.

API Version 2012-08-10


246
Amazon DynamoDB Developer Guide
.NET: modelo de documento

Si el elemento existe, UpdateItem aplica las actualizaciones como se indica a continuacin:


Sustituye los valores de los atributos existentes por los valores de la actualizacin.
Si un atributo que se proporciona en la informacin de entrada no existe, agrega un nuevo atributo al
elemento.
Si el valor del atributo de entrada es null, elimina el atributo, en caso de que est presente.

Note

Esta operacin UpdateItem de nivel intermedio no admite la accin Add (consulte UpdateItem)
compatible con la operacin de DynamoDB subyacente.
Note

La operacin PutItem (Colocacin de un elemento: mtodo Table.PutItem (p. 242)) tambin


puede llevar a cabo una actualizacin. 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 el objeto Document que se va a
colocar, la operacin PutItem los eliminar. Sin embargo, UpdateItem solo actualiza los atributos
de entrada especificados. Todos los dems atributos existentes de ese elemento permanecen
inalterados.

A continuacin se indican los pasos que hay que seguir para actualizar un elemento mediante el modelo
de documento del AWS SDK para .NET.

1. Ejecute el mtodo Table.LoadTable proporcionando el nombre de la tabla en la que desea llevar a


cabo la operacin de actualizacin.
2. Cree una instancia de Document proporcionando todas las actualizaciones que desee realizar.

Para eliminar un atributo, especifique que su valor es null.


3. Llame al mtodo Table.UpdateItem y proporcione la instancia Document como parmetro de
entrada.

Debe proporcionar la clave principal, bien en la instancia de Document, o bien explcitamente como
parmetro.

En el siguiente fragmento de cdigo C# se ponen en prctica las tareas anteriores. En el ejemplo de


cdigo se actualiza un elemento de la tabla Book. La operacin UpdateItem actualiza el atributo Authors
existente, elimina el atributo PageCount y agrega el atributo nuevo XYZ. La instancia de Document incluye
la clave principal del libro que se va a actualizar.

Example

Table table = Table.LoadTable(client, "ProductCatalog");

var book = new Document();

// Set the attributes that you wish to update.


book["Id"] = 111; // Primary key.
// Replace the authors attribute.
book["Authors"] = new List<string> { "Author x", "Author y" };
// Add a new attribute.
book["XYZ"] = 12345;
// Delete the existing PageCount attribute.
book["PageCount"] = null;

API Version 2012-08-10


247
Amazon DynamoDB Developer Guide
.NET: modelo de documento

table.Update(book);

Especificacin de parmetros opcionales


Puede configurar opciones adicionales para la operacin UpdateItem agregando el parmetro
UpdateItemOperationConfig. Para obtener una lista completa de parmetros opcionales, consulte
UpdateItem.

En el siguiente fragmento de cdigo C# se actualiza el precio de un elemento de libro 25. En l se


especifican los dos parmetros opcionales siguientes:

El parmetro ConditionalExpression, que identifica el atributo Price con un valor de 20 que


prevemos que estar presente.
El parmetro ReturnValues para solicitar que la operacin UpdateItem devuelva el elemento
actualizado.

Example

Table table = Table.LoadTable(client, "ProductCatalog");


string partitionKey = "111";

var book = new Document();


book["Id"] = partitionKey;
book["Price"] = 25;

Expression expr = new Expression();


expr.ExpressionStatement = "Price = :val";
expr.ExpressionAttributeValues[":val"] = 20";

UpdateOperationConfig config = new UpdateOperationConfig()


{
ConditionalExpression = expr,
ReturnValues = ReturnValues.AllOldAttributes
};

Document d1 = table.Update(book, config);

Escritura por lotes: colocacin y eliminacin de varios elementos


La escritura por lotes se refiere a colocar y eliminar varios elementos en un lote. La operacin permite
colocar y eliminar varios elementos de una o varias tablas con una sola llamada. A continuacin se indican
los pasos que debe seguir para colocar o eliminar varios elementos en una tabla con el API del modelo de
documento del AWS SDK para .NET.

1. Cree un objeto Table ejecutando el mtodo Table.LoadTable y proporcionando el nombre de la tabla


en la que desea llevar a cabo la operacin por lotes.
2. Ejecute el mtodo CreateBatchWrite en la instancia de la tabla que ha creado en el paso anterior y
cree el objeto DocumentBatchWrite.
3. Use los mtodos de objeto DocumentBatchWrite para especificar los documentos que desea
actualizar o eliminar.
4. Llame al mtodo DocumentBatchWrite.Execute para ejecutar la operacin por lotes.

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

API Version 2012-08-10


248
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el fragmento de


cdigo se utiliza una operacin de escritura por lotes para realizar dos escrituras: cargar un elemento de
libro y eliminar otro.

Table productCatalog = Table.LoadTable(client, "ProductCatalog");


var batchWrite = productCatalog.CreateBatchWrite();

var book1 = new Document();


book1["Id"] = 902;
book1["Title"] = "My book1 in batch write using .NET document model";
book1["Price"] = 10;
book1["Authors"] = new List<string> { "Author 1", "Author 2", "Author 3" };
book1["InStock"] = new DynamoDBBool(true);
book1["QuantityOnHand"] = 5;

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.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el fragmento de


cdigo se utiliza la operacin de escritura por lotes para llevar a cabo las siguientes operaciones de
escritura:

Colocar un nuevo elemento en la tabla Forum.


Colocar un elemento en la tabla Thread y eliminar un elemento de la misma tabla.

// 1. Specify item to add in the Forum table.


Table forum = Table.LoadTable(client, "Forum");
var forumBatchWrite = forum.CreateBatchWrite();

var forum1 = new Document();


forum1["Name"] = "Test BatchWrite Forum";
forum1["Threads"] = 0;
forumBatchWrite.AddDocumentToPut(forum1);

API Version 2012-08-10


249
Amazon DynamoDB Developer Guide
.NET: modelo de documento

// 2a. Specify item to add in the Thread table.


Table thread = Table.LoadTable(client, "Thread");
var threadBatchWrite = thread.CreateBatchWrite();

var thread1 = new Document();


thread1["ForumName"] = "Amazon S3 forum";
thread1["Subject"] = "My sample question";
thread1["Message"] = "Message text";
thread1["KeywordTags"] = new List<string>{ "Amazon S3", "Bucket" };
threadBatchWrite.AddDocumentToPut(thread1);

// 2b. Specify item to delete from the Thread table.


threadBatchWrite.AddKeyToDelete("someForumName", "someSubject");

// 3. Create multi-table batch.


var superBatch = new MultiTableDocumentBatchWrite();
superBatch.AddBatch(forumBatchWrite);
superBatch.AddBatch(threadBatchWrite);

superBatch.Execute();

Ejemplo: Operaciones CRUD con el modelo de documento del


AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se realizan las siguientes acciones:

Crear un elemento de libro en la tabla ProductCatalog.


Recupere el elemento de libro.
Actualizar el elemento de libro. En el ejemplo de cdigo se muestra una actualizacin normal que agrega
nuevos atributos y actualiza los existentes. Tambin se muestra una actualizacin condicional que
actualiza el precio del libro solamente si el valor del precio actual es el especificado en el cdigo.
Eliminar el elemento de libro.

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;

static void Main(string[] args)


{
try

API Version 2012-08-10


250
Amazon DynamoDB Developer Guide
.NET: modelo de documento

{
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); }
}

// Creates a sample book item.


private static void CreateBookItem(Table productCatalog)
{
Console.WriteLine("\n*** Executing CreateBookItem() ***");
var book = new Document();
book["Id"] = sampleBookId;
book["Title"] = "Book " + sampleBookId;
book["Price"] = 19.99;
book["ISBN"] = "111-1111111111";
book["Authors"] = new List<string> { "Author 1", "Author 2", "Author 3" };
book["PageCount"] = 500;
book["Dimensions"] = "8.5x11x.5";
book["InPublication"] = new DynamoDBBool(true);
book["InStock"] = new DynamoDBBool(false);
book["QuantityOnHand"] = 0;

productCatalog.PutItem(book);
}

private static void RetrieveBook(Table productCatalog)


{
Console.WriteLine("\n*** Executing RetrieveBook() ***");
// Optional configuration.
GetItemOperationConfig config = new GetItemOperationConfig
{
AttributesToGet = new List<string> { "Id", "ISBN", "Title", "Authors",
"Price" },
ConsistentRead = true
};
Document document = productCatalog.GetItem(sampleBookId, config);
Console.WriteLine("RetrieveBook: Printing book retrieved...");
PrintDocument(document);
}

private static void UpdateMultipleAttributes(Table productCatalog)


{
Console.WriteLine("\n*** Executing UpdateMultipleAttributes() ***");
Console.WriteLine("\nUpdating multiple attributes....");
int partitionKey = sampleBookId;

var book = new Document();


book["Id"] = partitionKey;
// List of attribute updates.
// The following replaces the existing authors list.
book["Authors"] = new List<string> { "Author x", "Author y" };
book["newAttribute"] = "New Value";
book["ISBN"] = null; // Remove it.

API Version 2012-08-10


251
Amazon DynamoDB Developer Guide
.NET: modelo de documento

// 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);
}

private static void UpdateBookPriceConditionally(Table productCatalog)


{
Console.WriteLine("\n*** Executing UpdateBookPriceConditionally() ***");

int partitionKey = sampleBookId;

var book = new Document();


book["Id"] = partitionKey;
book["Price"] = 29.99;

// For conditional price update, creating a condition expression.


Expression expr = new Expression();
expr.ExpressionStatement = "Price = :val";
expr.ExpressionAttributeValues[":val"] = 19.00;

// 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);
}

private static void DeleteBook(Table productCatalog)


{
Console.WriteLine("\n*** Executing DeleteBook() ***");
// Optional configuration.
DeleteItemOperationConfig config = new DeleteItemOperationConfig
{
// Return the deleted item.
ReturnValues = ReturnValues.AllOldAttributes
};
Document document = productCatalog.DeleteItem(sampleBookId, config);
Console.WriteLine("DeleteBook: Printing deleted just deleted...");
PrintDocument(document);
}

private static void PrintDocument(Document updatedDocument)


{
foreach (var attribute in updatedDocument.GetAttributeNames())
{
string stringValue = null;
var value = updatedDocument[attribute];
if (value is Primitive)
stringValue = value.AsPrimitive().Value.ToString();
else if (value is PrimitiveList)
stringValue = string.Join(",", (from primitive
in value.AsPrimitiveList().Entries
select primitive.Value).ToArray());
Console.WriteLine("{0} - {1}", attribute, stringValue);
}

API Version 2012-08-10


252
Amazon DynamoDB Developer Guide
.NET: modelo de documento

}
}
}

Ejemplo: Operaciones por lotes con el API del modelo de


documento del AWS SDK para .NET
Temas
Ejemplo: Escritura por lotes con el modelo de documento del AWS SDK para .NET (p. 253)

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); }

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}

private static void SingleTableBatchWrite()


{

API Version 2012-08-10


253
Amazon DynamoDB Developer Guide
.NET: modelo de documento

Table productCatalog = Table.LoadTable(client, "ProductCatalog");


var batchWrite = productCatalog.CreateBatchWrite();

var book1 = new Document();


book1["Id"] = 902;
book1["Title"] = "My book1 in batch write using .NET helper classes";
book1["ISBN"] = "902-11-11-1111";
book1["Price"] = 10;
book1["ProductCategory"] = "Book";
book1["Authors"] = new List<string> { "Author 1", "Author 2", "Author 3" };
book1["Dimensions"] = "8.5x11x.5";
book1["InStock"] = new DynamoDBBool(true);
book1["QuantityOnHand"] = new DynamoDBNull(); //Quantity is unknown at this
time

batchWrite.AddDocumentToPut(book1);
// Specify delete item using overload that takes PK.
batchWrite.AddKeyToDelete(12345);
Console.WriteLine("Performing batch write in SingleTableBatchWrite()");
batchWrite.Execute();
}

private static void MultiTableBatchWrite()


{
// 1. Specify item to add in the Forum table.
Table forum = Table.LoadTable(client, "Forum");
var forumBatchWrite = forum.CreateBatchWrite();

var forum1 = new Document();


forum1["Name"] = "Test BatchWrite Forum";
forum1["Threads"] = 0;
forumBatchWrite.AddDocumentToPut(forum1);

// 2a. Specify item to add in the Thread table.


Table thread = Table.LoadTable(client, "Thread");
var threadBatchWrite = thread.CreateBatchWrite();

var thread1 = new Document();


thread1["ForumName"] = "S3 forum";
thread1["Subject"] = "My sample question";
thread1["Message"] = "Message text";
thread1["KeywordTags"] = new List<string> { "S3", "Bucket" };
threadBatchWrite.AddDocumentToPut(thread1);

// 2b. Specify item to delete from the Thread table.


threadBatchWrite.AddKeyToDelete("someForumName", "someSubject");

// 3. Create multi-table batch.


var superBatch = new MultiTableDocumentBatchWrite();
superBatch.AddBatch(forumBatchWrite);
superBatch.AddBatch(threadBatchWrite);
Console.WriteLine("Performing batch write in MultiTableBatchWrite()");
superBatch.Execute();
}
}
}

Consulta de tablas en DynamoDB mediante el modelo de


documento del AWS SDK para .NET
Temas
Mtodo Table.Query del AWS SDK para .NET (p. 255)

API Version 2012-08-10


254
Amazon DynamoDB Developer Guide
.NET: modelo de documento

Mtodo Table.Scan del AWS SDK para .NET (p. 259)

Mtodo Table.Query del AWS SDK para .NET


El mtodo Query permite consultar las tablas. Solo se pueden consultar las tablas cuya clave principal
es compuesta (con clave de particin y clave de ordenacin). Si la clave principal de la tabla solamente
consta de la clave de particin, no se admite la operacin Query. De forma predeterminada, Query lleva
a cabo internamente consultas consistentes finales. Para obtener ms informacin sobre el modelo de
consistencia, consulte Consistencia de lectura (p. 16).

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

Query(Primitive partitionKey, RangeFilter Filter);

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

string tableName = "Reply";


Table table = Table.LoadTable(client, tableName);

DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);


RangeFilter filter = new RangeFilter(QueryOperator.GreaterThan, twoWeeksAgoDate);
Search search = table.Query("DynamoDB Thread 2", filter);

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

List<Document> documentSet = new List<Document>();


do
{
documentSet = search.GetNextSet();
foreach (var document in documentSet)
PrintDocument(document);
} while (!search.IsDone);

private static void PrintDocument(Document document)


{
Console.WriteLine();
foreach (var attribute in document.GetAttributeNames())
{
string stringValue = null;
var value = document[attribute];
if (value is Primitive)
stringValue = value.AsPrimitive().Value;
else if (value is PrimitiveList)
stringValue = string.Join(",", (from primitive

API Version 2012-08-10


255
Amazon DynamoDB Developer Guide
.NET: modelo de documento

in value.AsPrimitiveList().Entries
select primitive.Value).ToArray());
Console.WriteLine("{0} - {1}", attribute, stringValue);
}
}

Especificacin de parmetros opcionales

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

Table table = Table.LoadTable(client, "Reply");


DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);
QueryOperationConfig config = new QueryOperationConfig()
{
HashKey = "DynamoDB Thread 2", //Partition key
AttributesToGet = new List<string>
{ "Subject", "ReplyDateTime", "PostedBy" },
ConsistentRead = true,
Filter = new RangeFilter(QueryOperator.GreaterThan, twoWeeksAgoDate)
};

Search search = table.Query(config);

Ejemplo: Consulta con el mtodo Table.Query

En el siguiente ejemplo de cdigo C# se usa el mtodo Table.Query para ejecutar los siguientes
ejemplos de consultas:

Las siguientes consultas se ejecutan en la tabla Reply.


Buscar las respuestas a una conversacin del foro publicadas en los ltimos 15das.

Esta consulta se ejecuta dos veces. En la primera llamada a Table.Query, en el ejemplo se


proporcionan solo los parmetros de consulta obligatorios. En la segunda llamada a Table.Query, se
proporcionan parmetros de consulta opcionales para solicitar la lectura de consistencia alta y la lista
de atributos que hay que recuperar.
Buscar las respuestas a una conversacin del foro publicadas durante un periodo determinado.

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.

API Version 2012-08-10


256
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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();

static void Main(string[] args)


{
try
{
// Query examples.
Table replyTable = Table.LoadTable(client, "Reply");
string forumName = "Amazon DynamoDB";
string threadSubject = "DynamoDB Thread 2";
FindRepliesInLast15Days(replyTable, forumName, threadSubject);
FindRepliesInLast15DaysWithConfig(replyTable, forumName, threadSubject);
FindRepliesPostedWithinTimePeriod(replyTable, forumName, threadSubject);

// Get Example.
Table productCatalogTable = Table.LoadTable(client, "ProductCatalog");
int productId = 101;
GetProduct(productCatalogTable, productId);

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); }
}

private static void GetProduct(Table tableName, int productId)


{
Console.WriteLine("*** Executing GetProduct() ***");
Document productDocument = tableName.GetItem(productId);
if (productDocument != null)
{
PrintDocument(productDocument);
}
else
{
Console.WriteLine("Error: product " + productId + " does not exist");
}
}

private static void FindRepliesInLast15Days(Table table, string forumName, string


threadSubject)
{
string Attribute = forumName + "#" + threadSubject;

API Version 2012-08-10


257
Amazon DynamoDB Developer Guide
.NET: modelo de documento

DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);


QueryFilter filter = new QueryFilter("Id", QueryOperator.Equal, partitionKey);
filter.AddCondition("ReplyDateTime", QueryOperator.GreaterThan,
twoWeeksAgoDate);

// Use Query overloads that takes the minimum required query parameters.
Search search = table.Query(filter);

List<Document> documentSet = new List<Document>();


do
{
documentSet = search.GetNextSet();
Console.WriteLine("\nFindRepliesInLast15Days: printing ............");
foreach (var document in documentSet)
PrintDocument(document);
} while (!search.IsDone);
}

private static void FindRepliesPostedWithinTimePeriod(Table table, string


forumName, string threadSubject)
{
DateTime startDate = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0, 0));
DateTime endDate = DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0, 0));

QueryFilter filter = new QueryFilter("Id", QueryOperator.Equal, forumName + "#"


+ threadSubject);
filter.AddCondition("ReplyDateTime", QueryOperator.Between, startDate,
endDate);

QueryOperationConfig config = new QueryOperationConfig()


{
Limit = 2, // 2 items/page.
Select = SelectValues.SpecificAttributes,
AttributesToGet = new List<string> { "Message",
"ReplyDateTime",
"PostedBy" },
ConsistentRead = true,
Filter = filter
};

Search search = table.Query(config);

List<Document> documentList = new List<Document>();

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);
}

private static void FindRepliesInLast15DaysWithConfig(Table table, string


forumName, string threadName)
{
DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);
QueryFilter filter = new QueryFilter("Id", QueryOperator.Equal, forumName + "#"
+ threadName);
filter.AddCondition("ReplyDateTime", QueryOperator.GreaterThan,
twoWeeksAgoDate);
// You are specifying optional parameters so use QueryOperationConfig.

API Version 2012-08-10


258
Amazon DynamoDB Developer Guide
.NET: modelo de documento

QueryOperationConfig config = new QueryOperationConfig()


{
Filter = filter,
// Optional parameters.
Select = SelectValues.SpecificAttributes,
AttributesToGet = new List<string> { "Message", "ReplyDateTime",
"PostedBy" },
ConsistentRead = true
};

Search search = table.Query(config);

List<Document> documentSet = new List<Document>();


do
{
documentSet = search.GetNextSet();
Console.WriteLine("\nFindRepliesInLast15DaysWithConfig:
printing ............");
foreach (var document in documentSet)
PrintDocument(document);
} while (!search.IsDone);
}

private static void PrintDocument(Document document)


{
// count++;
Console.WriteLine();
foreach (var attribute in document.GetAttributeNames())
{
string stringValue = null;
var value = document[attribute];
if (value is Primitive)
stringValue = value.AsPrimitive().Value.ToString();
else if (value is PrimitiveList)
stringValue = string.Join(",", (from primitive
in value.AsPrimitiveList().Entries
select primitive.Value).ToArray());
Console.WriteLine("{0} - {1}", attribute, stringValue);
}
}
}
}

Mtodo Table.Scan del AWS SDK para .NET


El mtodo Scan lleva a cabo un examen de toda la tabla. Ofrece dos sobrecargas. El nico parmetro que
el mtodo Scan requiere es el filtro de examen, que puede proporcionar mediante la sobrecarga siguiente.

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

Thread(Subject, Message, ForumId, Tags, LastPostedDateTime, .... )

API Version 2012-08-10


259
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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

string tableName = "Thread";


Table ThreadTable = Table.LoadTable(client, tableName);

ScanFilter scanFilter = new ScanFilter();


scanFilter.AddCondition("ForumId", ScanOperator.Equal, 101);
scanFilter.AddCondition("Tags", ScanOperator.Contains, "sortkey");

Search search = ThreadTable.Scan(scanFilter);

Especificacin de parmetros opcionales

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

string tableName = "Thread";


Table ThreadTable = Table.LoadTable(client, tableName);

ScanFilter scanFilter = new ScanFilter();


scanFilter.AddCondition("ForumId", ScanOperator.Equal, forumId);
scanFilter.AddCondition("Tags", ScanOperator.Contains, "sortkey");

ScanOperationConfig config = new ScanOperationConfig()


{
AttributesToGet = new List<string> { "Subject", "Message" } ,
Filter = scanFilter
};

Search search = ThreadTable.Scan(config);

Ejemplo: Examen con el mtodo Table.Scan

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

API Version 2012-08-10


260
Amazon DynamoDB Developer Guide
.NET: modelo de documento

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.

Table.Scan, que acepta el objeto ScanFilter como parmetro.

Puede pasar el parmetro ScanFilter cuando solamente se deban pasar los parmetros requeridos.
Table.Scan, que acepta el objeto ScanOperationConfig como parmetro.

Debe usar el parmetro ScanOperationConfig si desea pasar parmetros opcionales al mtodo


Scan.

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();

static void Main(string[] args)


{
Table productCatalogTable = Table.LoadTable(client, "ProductCatalog");
// Scan example.
FindProductsWithNegativePrice(productCatalogTable);
FindProductsWithNegativePriceWithConfig(productCatalogTable);

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}

private static void FindProductsWithNegativePrice(Table productCatalogTable)


{
// Assume there is a price error. So we scan to find items priced < 0.
ScanFilter scanFilter = new ScanFilter();
scanFilter.AddCondition("Price", ScanOperator.LessThan, 0);

Search search = productCatalogTable.Scan(scanFilter);

List<Document> documentList = new List<Document>();


do
{
documentList = search.GetNextSet();
Console.WriteLine("\nFindProductsWithNegativePrice:
printing ............");
foreach (var document in documentList)
PrintDocument(document);
} while (!search.IsDone);
}

private static void FindProductsWithNegativePriceWithConfig(Table


productCatalogTable)
{
// Assume there is a price error. So we scan to find items priced < 0.
ScanFilter scanFilter = new ScanFilter();
scanFilter.AddCondition("Price", ScanOperator.LessThan, 0);

API Version 2012-08-10


261
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

ScanOperationConfig config = new ScanOperationConfig()


{
Filter = scanFilter,
Select = SelectValues.SpecificAttributes,
AttributesToGet = new List<string> { "Title", "Id" }
};

Search search = productCatalogTable.Scan(config);

List<Document> documentList = new List<Document>();


do
{
documentList = search.GetNextSet();
Console.WriteLine("\nFindProductsWithNegativePriceWithConfig:
printing ............");
foreach (var document in documentList)
PrintDocument(document);
} while (!search.IsDone);
}

private static void PrintDocument(Document document)


{
// count++;
Console.WriteLine();
foreach (var attribute in document.GetAttributeNames())
{
string stringValue = null;
var value = document[attribute];
if (value is Primitive)
stringValue = value.AsPrimitive().Value.ToString();
else if (value is PrimitiveList)
stringValue = string.Join(",", (from primitive
in value.AsPrimitiveList().Entries
select primitive.Value).ToArray());
Console.WriteLine("{0} - {1}", attribute, stringValue);
}
}
}
}

.NET: modelo de persistencia de objetos


Temas
Atributos de DynamoDB (p. 264)
Clase DynamoDBContext (p. 266)
Tipos de datos admitidos (p. 271)
Bloqueo optimista con nmero de versin de DynamoDB con el modelo de persistencia de objetos del
AWS SDK para .NET (p. 272)
Mapeo de datos arbitrarios con DynamoDB mediante el modelo de persistencia de objetos del AWS
SDK para .NET (p. 274)
Operaciones por lotes mediante el modelo de persistencia de objetos del AWS SDK
para .NET (p. 276)
Ejemplo: Operaciones CRUD con el modelo de persistencia de objetos del AWS SDK
para .NET (p. 280)
Ejemplo: Operacin de escritura por lotes con el modelo de persistencia de objetos del AWS SDK
para .NET (p. 282)
Ejemplo: Consultas y anlisis en DynamoDB con el modelo de persistencia de objetos del AWS SDK
para .NET (p. 286)

API Version 2012-08-10


262
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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

El modelo de persistencia de objetos no proporciona un API para crear, actualizar o eliminar


tablas. Solo ofrece operaciones de datos. Puede usar el API de bajo nivel de AWS SDK
para .NET para crear, actualizar y eliminar tablas. Para obtener ms informacin, consulte Uso de
tablas: .NET (p. 334).

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; }

public string Title { get; set; }


public int ISBN { get; set; }

[DynamoDBProperty("Authors")]
public List<string> BookAuthors { get; set; }

[DynamoDBIgnore]
public string CoverPage { get; set; }
}

En el ejemplo anterior, el atributo DynamoDBTable mapea la clase Book a la tabla ProductCatalog.

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, la propiedad Id se mapea a la clave principal con el mismo nombre y la


propiedad BookAuthors se mapea al atributo Authors de la tabla ProductCatalog.
Mapeo predeterminado: de forma predeterminada, el modelo de persistencia de objetos mapea las
propiedades de clase a los atributos con el mismo nombre de la tabla.

API Version 2012-08-10


263
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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; }

// Additional properties go here.


}

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.

API Version 2012-08-10


264
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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 { ...}

Este atributo se puede heredar o anular.

API Version 2012-08-10


265
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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 { ...}

Puede agregar el parmetro opcional, LowerCamelCaseProperties, para solicitar que DynamoDB


cambie a minscula la primera letra del nombre de la propiedad cuando almacene los objetos en una tabla,
como se muestra en el siguiente fragmento de cdigo C#.

[DynamoDBTable("People", LowerCamelCaseProperties=true)]
public class Developer {
string DeveloperName;
...}

Al guardar instancias de la clase Developer, DynamoDBContext guarda la propiedad DeveloperName


como 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).

API Version 2012-08-10


266
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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

Para ejecutar esta operacin en segundo plano, use el mtodo ExecuteBatchGetAsync en su


lugar.

ExecuteBatchWrite
Escribe o elimina datos en una o varias tablas y procesa todos los objetos BatchWrite de un objeto
MultiTableBatchWrite.
Note

Para ejecutar esta operacin en segundo plano, use el mtodo ExecuteBatchWriteAsync en


su lugar.

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

API Version 2012-08-10


267
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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

Si el objeto Document implementa la interfaz IEnumerable, puede usar el mtodo


FromDocuments en su lugar. Esto le permitir recorrer en iteracin todas las instancias de la
clase contenidas en Document.

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.

API Version 2012-08-10


268
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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

DynamoDBContext context = new DynamoDBContext(client);

string replyId = "DynamoDB#DynamoDB Thread 1"; //Partition key


DateTime twoWeeksAgoDate = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Date to
compare.
IEnumerable<Reply> latestReplies = context.Query<Reply>(replyId, QueryOperator.GreaterThan,
twoWeeksAgoDate);

Devuelve una coleccin de objetos Reply.

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.

Si ha configurado el bloqueo optimista, la actualizacin solo se llevar a cabo correctamente si las


versiones del elemento del lado del cliente y del lado del servidor coinciden. 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).
Note

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

IEnumerable<Book> itemsWithWrongPrice = context.Scan<Book>(


new ScanCondition("Price", ScanOperator.LessThan, price),
new ScanCondition("ProductCategory", ScanOperator.Equal, "Book")

API Version 2012-08-10


269
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

);

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.

Por motivos de desempeo, debe consultar las tablas y evitar examinarlas.


Note

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

DynamoDBContext context = new DynamoDBContext(client);

Forum forum101 = context.Load<Forum>(101); // Retrieve a forum by primary key.


Document doc = context.ToDocument<Forum>(forum101);

Especificacin de parmetros opcionales para DynamoDBContext


Cuando se utiliza el modelo de persistencia de objetos, es posible especificar los siguientes parmetros
opcionales para la clase DynamoDBContext.

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

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


...

API Version 2012-08-10


270
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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.

En lugar de establecer estos parmetros en el nivel de DynamoDBContext, puede especificarlos para


las operaciones individuales que ejecute utilizando DynamoDBContext, como se muestra en el siguiente
fragmento de cdigo C#. En el ejemplo se carga un elemento de libro concreto. El mtodo Load de
DynamoDBContext especifica los parmetros opcionales anteriores.

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


...
DynamoDBContext context = new DynamoDBContext(client);
Book bookItem = context.Load<Book>(productId,new DynamoDBContextConfig{ ConsistentRead =
true, SkipVersionCheck = true });

En este caso, DynamoDBContext incluye estos parmetros solo cuando se enva la solicitud Get.

Tipos de datos admitidos


El modelo de persistencia de objetos admite un conjunto de tipos de datos, colecciones y tipos de datos
arbitrarios de .NET primitivos. El modelo admite los siguientes tipos de datos primitivos.

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.

Tipo de .NET primitivo Tipo de DynamoDB

Todos los tipos de nmeros N (tipo Number)

API Version 2012-08-10


271
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Tipo de .NET primitivo Tipo de DynamoDB

Todos los tipos de cadenas S (tipo String)

MemoryStream, byte[] B (tipo Binary)

bool N (tipo Number), 0 representa false y 1 representa


true.

Tipos de coleccin BS (tipo Binary Set), SS (tipo String Set) y NS (tipo


Number Set)

DateTime S (tipo String). Los valores DateTime se almacenan


como cadenas con formato ISO-8601.

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.

Bloqueo optimista con nmero de versin de DynamoDB con el


modelo de persistencia de objetos del AWS SDK para .NET
La compatibilidad del modelo de persistencia de objetos con el bloqueo optimista garantiza que la versin
del elemento en la aplicacin sea la misma que en el lado del servidor antes de actualizar o eliminar
el elemento. Supongamos que recupera un elemento para actualizarlo. Sin embargo, antes de que se
devuelvan las actualizaciones, otra aplicacin actualiza el mismo elemento. Ahora, su aplicacin tiene
una copia anticuada del elemento. Sin el bloqueo optimista, cualquier actualizacin que lleve a cabo
sobrescribir la actualizacin efectuada por la otra aplicacin.

La caracterstica de bloqueo optimista del modelo de persistencia de objetos proporciona la etiqueta


DynamoDBVersion, que se puede usar para habilitar el bloqueo optimista. Para utilizar esta caracterstica,
se agrega una propiedad a la clase para almacenar el nmero de versin. Puede agregar el atributo
DynamoDBVersion a la propiedad. La primera vez que se guarda el objeto, DynamoDBContext asigna un
nmero de versin e incrementa este valor cada vez que se actualiza el elemento.

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; }

API Version 2012-08-10


272
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Note

Puede aplicar el atributo DynamoDBVersion solamente a un tipo numrico primitivo que pueda
contener valores null (por ejemplo, int?).

El bloqueo optimista afecta a las operaciones de DynamoDBContext como se indica a continuacin:

Para un elemento nuevo, DynamoDBContext asigna el nmero de versin inicial 0. Si recupera un


elemento existente y, a continuacin, 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. DynamoDBContext incrementa el
nmero de versin. No es necesario establecer el nmero de versin.
El mtodo Delete proporciona sobrecargas que pueden tomar un valor de clave principal o un objeto
como parmetro, como se muestra en el siguiente fragmento de cdigo C#.

Example

DynamoDBContext context = new DynamoDBContext(client);


...
// Load a book.
Book book = context.Load<ProductCatalog>(111);
// Do other operations.
// Delete 1 - Pass in the book object.
context.Delete<ProductCatalog>(book);

// Delete 2 - pass in the Id (primary key)


context.Delete<ProductCatalog>(222);

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.

Deshabilitacin del bloqueo optimista


Para deshabilitar el bloqueo optimista, se usa la propiedad de configuracin SkipVersionCheck.
Puede establecer esta propiedad al crear DynamoDBContext. En este caso, el bloqueo optimista
est deshabilitado para todas las solicitudes que se realicen utilizando el contexto. Para obtener ms
informacin, consulte Especificacin de parmetros opcionales para DynamoDBContext (p. 270).

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

DynamoDBContext context = new DynamoDBContext(client);


// Load a book.
Book book = context.Load<ProductCatalog>(111);
...

API Version 2012-08-10


273
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

// Delete the book.


context.Delete<Book>(book, new DynamoDBContextConfig { SkipVersionCheck = true });

Mapeo de datos arbitrarios con DynamoDB mediante el modelo


de persistencia de objetos del AWS SDK para .NET
Adems de los tipos de .NET admitidos (consulte Tipos de datos admitidos (p. 271)), puede utilizar
tipos de la aplicacin para los cuales no exista un mapeo directo a los tipos de DynamoDB. El modelo
de persistencia de objetos es compatible con el almacenamiento de datos de tipos arbitrarios, siempre
y cuando se proporcione el convertidor requerido para convertir los datos del tipo arbitrario al tipo de
DynamoDB y viceversa. El cdigo del convertidor transforma los datos tanto al guardar como al cargar los
objetos.

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();

static void Main(string[] args)


{
try
{
DynamoDBContext context = new DynamoDBContext(client);

// 1. Create a book.
DimensionType myBookDimensions = new DimensionType()
{
Length = 8M,
Height = 11M,
Thickness = 0.5M
};

API Version 2012-08-10


274
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Book myBook = new Book


{
Id = 501,
Title = "AWS SDK for .NET Object Persistence Model Handling Arbitrary
Data",
ISBN = "999-9999999999",
BookAuthors = new List<string> { "Author 1", "Author 2" },
Dimensions = myBookDimensions
};

context.Save(myBook);

// 2. Retrieve the book.


Book bookRetrieved = context.Load<Book>(501);

// 3. Update property (book dimensions).


bookRetrieved.Dimensions.Height += 1;
bookRetrieved.Dimensions.Length += 1;
bookRetrieved.Dimensions.Thickness += 0.2M;
// Update the book.
context.Save(bookRetrieved);

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("ProductCatalog")]
public class Book
{
[DynamoDBHashKey] //Partition key
public int Id
{
get; set;
}
[DynamoDBProperty]
public string Title
{
get; set;
}
[DynamoDBProperty]
public string ISBN
{
get; set;
}
// Multi-valued (set type) attribute.
[DynamoDBProperty("Authors")]
public List<string> BookAuthors
{
get; set;
}
// Arbitrary type, with a converter to map it to DynamoDB type.
[DynamoDBProperty(typeof(DimensionTypeConverter))]
public DimensionType Dimensions
{
get; set;
}
}

public class DimensionType


{
public decimal Length

API Version 2012-08-10


275
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

{
get; set;
}
public decimal Height
{
get; set;
}
public decimal Thickness
{
get; set;
}
}

// Converts the complex type DimensionType to string and vice-versa.


public class DimensionTypeConverter : IPropertyConverter
{
public DynamoDBEntry ToEntry(object value)
{
DimensionType bookDimensions = value as DimensionType;
if (bookDimensions == null) throw new ArgumentOutOfRangeException();

string data = string.Format("{1}{0}{2}{0}{3}", " x ",


bookDimensions.Length, bookDimensions.Height,
bookDimensions.Thickness);

DynamoDBEntry entry = new Primitive


{
Value = data
};
return entry;
}

public object FromEntry(DynamoDBEntry entry)


{
Primitive primitive = entry as Primitive;
if (primitive == null || !(primitive.Value is String) ||
string.IsNullOrEmpty((string)primitive.Value))
throw new ArgumentOutOfRangeException();

string[] data = ((string)(primitive.Value)).Split(new string[] { " x " },


StringSplitOptions.None);
if (data.Length != 3) throw new ArgumentOutOfRangeException();

DimensionType complexData = new DimensionType


{
Length = Convert.ToDecimal(data[0]),
Height = Convert.ToDecimal(data[1]),
Thickness = Convert.ToDecimal(data[2])
};
return complexData;
}
}
}

Operaciones por lotes mediante el modelo de persistencia de


objetos del AWS SDK para .NET
Escritura por lotes: colocacin y eliminacin de varios elementos
Para colocar o eliminar varios objetos en una tabla en una nica solicitud, haga lo siguiente:

Ejecute el mtodo CreateBatchWrite de DynamoDBContext y cree una instancia de la clase


BatchWrite.

API Version 2012-08-10


276
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Especifique los elementos que desea colocar o eliminar.


Para colocar uno o varios elementos, utilice el mtodo AddPutItem o AddPutItems.
Para eliminar uno o varios elementos, puede especificar la clave principal del elemento o un objeto
del lado del cliente mapeado al elemento que desea eliminar. Utilice los mtodos AddDeleteItem,
AddDeleteItems y AddDeleteKey para especificar la lista de elementos que desea eliminar.
Llame al mtodo BatchWrite.Execute para colocar y eliminar en la tabla todos los elementos
especificados.

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

DynamoDBContext context = new DynamoDBContext(client);


var bookBatch = context.CreateBatchWrite<Book>();

// 1. Specify two books to add.


Book book1 = new Book
{
Id = 902,
ISBN = "902-11-11-1111",
ProductCategory = "Book",
Title = "My book3 in batch write"
};
Book book2 = new Book
{
Id = 903,
ISBN = "903-11-11-1111",
ProductCategory = "Book",
Title = "My book4 in batch write"
};

bookBatch.AddPutItems(new List<Book> { book1, book2 });

// 2. Specify one book to delete.


bookBatch.AddDeleteKey(111);

bookBatch.Execute();

Para colocar o eliminar objetos de varias tablas, haga lo siguiente:

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.

API Version 2012-08-10


277
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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

DynamoDBContext context = new DynamoDBContext(client);


// Create BatchWrite objects for each of the Forum and Thread classes.
var forumBatch = context.CreateBatchWrite<Forum>();

DynamoDBOperationConfig config = new DynamoDBOperationConfig();


config.SkipVersionCheck = true;
var threadBatch = context.CreateBatchWrite<Thread>(config);

// 1. New Forum item.


Forum newForum = new Forum
{
Name = "Test BatchWrite Forum",
Threads = 0
};
forumBatch.AddPutItem(newForum);

// 2. Specify a forum to delete by specifying its primary key.


forumBatch.AddDeleteKey("Some forum");

// 3. New Thread item.


Thread newThread = new Thread
{
ForumName = "Amazon S3 forum",
Subject = "My sample question",
KeywordTags = new List<string> { "Amazon S3", "Bucket" },
Message = "Message text"
};

threadBatch.AddPutItem(newThread);

// Now execute multi-table batch write.


var superBatch = new MultiTableBatchWrite(forumBatch, threadBatch);
superBatch.Execute();

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.

API Version 2012-08-10


278
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Obtencin por lotes: obtencin de varios elementos


Para recuperar varios elementos de una tabla en una nica solicitud, haga lo siguiente:

Cree una instancia de la clase CreateBatchGet.


Especifique una lista de claves principales para recuperarlas.
Llame al mtodo Execute. La respuesta devuelve los elementos de la propiedad Results.

En el siguiente cdigo de muestra C# se recuperan tres elementos de la tabla ProductCatalog. Los


elementos del resultado no estn necesariamente en el mismo orden en que se han especificado las
claves principales.

Example

DynamoDBContext context = new DynamoDBContext(client);


var bookBatch = context.CreateBatchGet<ProductCatalog>();
bookBatch.AddKey(101);
bookBatch.AddKey(102);
bookBatch.AddKey(103);
bookBatch.Execute();
// Process result.
Console.WriteLine(devBatch.Results.Count);
Book book1 = bookBatch.Results[0];
Book book2 = bookBatch.Results[1];
Book book3 = bookBatch.Results[2];

Para recuperar objetos de varias tablas, haga lo siguiente:

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

var orderBatch = context.CreateBatchGet<Order>();


orderBatch.AddKey(101);
orderBatch.AddKey(102);

var orderDetailBatch = context.CreateBatchGet<OrderDetail>();


orderDetailBatch.AddKey(101, "P1");
orderDetailBatch.AddKey(101, "P2");
orderDetailBatch.AddKey(102, "P3");
orderDetailBatch.AddKey(102, "P1");

var orderAndDetailSuperBatch = orderBatch.Combine(orderDetailBatch);


orderAndDetailSuperBatch.Execute();

Console.WriteLine(orderBatch.Results.Count);

API Version 2012-08-10


279
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Console.WriteLine(orderDetailBatch.Results.Count);

Order order1 = orderBatch.Results[0];


Order order2 = orderDetailBatch.Results[1];
OrderDetail orderDetail1 = orderDetailBatch.Results[0];

Ejemplo: Operaciones CRUD con el modelo de persistencia de


objetos del AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se declara una clase Book con las propiedades Id, Title, ISBN
y Authors. Se utilizan los atributos de persistencia de objetos para mapear estas propiedades a la
tabla ProductCatalog de DynamoDB. A continuacin, se utiliza DynamoDBContext para ilustrar las
operaciones CRUD tpicas. En el ejemplo se crea un ejemplo de instancia de Book y se guarda en la tabla
ProductCatalog. A continuacin, se recupera el elemento de libro y se actualizan sus propiedades ISBN
y Authors. Tenga en cuenta que la actualizacin sustituye la lista de autores existente. Por ltimo, en el
ejemplo se elimina el elemento de libro.

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();

static void Main(string[] args)


{
try
{
DynamoDBContext context = new DynamoDBContext(client);
TestCRUDOperations(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); }
}

private static void TestCRUDOperations(DynamoDBContext context)


{
int bookID = 1001; // Some unique value.
Book myBook = new Book
{
Id = bookID,
Title = "object persistence-AWS SDK for.NET SDK-Book 1001",
ISBN = "111-1111111001",

API Version 2012-08-10


280
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

BookAuthors = new List<string> { "Author 1", "Author 2" },


};

// Save the book.


context.Save(myBook);
// Retrieve the book.
Book bookRetrieved = context.Load<Book>(bookID);

// Update few properties.


bookRetrieved.ISBN = "222-2222221001";
bookRetrieved.BookAuthors = new List<string> { " Author 1", "Author x" }; //
Replace existing authors list with this.
context.Save(bookRetrieved);

// Retrieve the updated book. This time add the optional ConsistentRead
parameter using DynamoDBContextConfig object.
Book updatedBook = context.Load<Book>(bookID, new DynamoDBContextConfig
{
ConsistentRead = true
});

// Delete the book.


context.Delete<Book>(bookID);
// Try to retrieve deleted book. It should return null.
Book deletedBook = context.Load<Book>(bookID, new DynamoDBContextConfig
{
ConsistentRead = true
});
if (deletedBook == null)
Console.WriteLine("Book is deleted");
}
}

[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;
}
}
}

API Version 2012-08-10


281
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Ejemplo: Operacin de escritura por lotes con el modelo de


persistencia de objetos del AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se declaran las clases Book, Forum, Thread y Reply y se mapean a
tablas de DynamoDB utilizando los atributos del modelo de persistencia de objetos.

A continuacin, se utiliza DynamoDBContext para ilustrar las siguientes operaciones de escritura por
lotes.

Objeto BatchWrite para colocar y eliminar elementos de libro de la tabla ProductCatalog.


Objeto MultiTableBatchWrite para colocar y eliminar elementos de las tablas Forum y Thread.

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();

static void Main(string[] args)


{
try
{
DynamoDBContext context = new DynamoDBContext(client);
SingleTableBatchWrite(context);
MultiTableBatchWrite(context);
}
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}

private static void SingleTableBatchWrite(DynamoDBContext context)


{
Book book1 = new Book
{
Id = 902,
InPublication = true,
ISBN = "902-11-11-1111",
PageCount = "100",
Price = 10,
ProductCategory = "Book",

API Version 2012-08-10


282
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

Title = "My book3 in batch write"


};
Book book2 = new Book
{
Id = 903,
InPublication = true,
ISBN = "903-11-11-1111",
PageCount = "200",
Price = 10,
ProductCategory = "Book",
Title = "My book4 in batch write"
};

var bookBatch = context.CreateBatchWrite<Book>();


bookBatch.AddPutItems(new List<Book> { book1, book2 });

Console.WriteLine("Performing batch write in SingleTableBatchWrite().");


bookBatch.Execute();
}

private static void MultiTableBatchWrite(DynamoDBContext context)


{
// 1. New Forum item.
Forum newForum = new Forum
{
Name = "Test BatchWrite Forum",
Threads = 0
};
var forumBatch = context.CreateBatchWrite<Forum>();
forumBatch.AddPutItem(newForum);

// 2. New Thread item.


Thread newThread = new Thread
{
ForumName = "S3 forum",
Subject = "My sample question",
KeywordTags = new List<string> { "S3", "Bucket" },
Message = "Message text"
};

DynamoDBOperationConfig config = new DynamoDBOperationConfig();


config.SkipVersionCheck = true;
var threadBatch = context.CreateBatchWrite<Thread>(config);
threadBatch.AddPutItem(newThread);
threadBatch.AddDeleteKey("some partition key value", "some sort key value");

var superBatch = new MultiTableBatchWrite(forumBatch, threadBatch);


Console.WriteLine("Performing batch write in MultiTableBatchWrite().");
superBatch.Execute();
}
}

[DynamoDBTable("Reply")]
public class Reply
{
[DynamoDBHashKey] //Partition key
public string Id
{
get; set;
}

[DynamoDBRangeKey] //Sort key


public DateTime ReplyDateTime
{
get; set;
}

API Version 2012-08-10


283
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

// Properties included implicitly.


public string Message
{
get; set;
}
// Explicit property mapping with object persistence model attributes.
[DynamoDBProperty("LastPostedBy")]
public string PostedBy
{
get; set;
}
// Property to store version number for optimistic locking.
[DynamoDBVersion]
public int? Version
{
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.

API Version 2012-08-10


284
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

[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
{

API Version 2012-08-10


285
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

get; set;
}
public string ProductCategory
{
get; set;
}
public bool InPublication
{
get; set;
}
}
}

Ejemplo: Consultas y anlisis en DynamoDB con el modelo de


persistencia de objetos del AWS SDK para .NET
En el ejemplo de C# de esta seccin se definen las clases siguientes y se mapean a las tablas de
DynamoDB. Para obtener ms informacin sobre cmo crear las tablas que se utilizan en este ejemplo,
consulte Creacin de tablas y carga de ejemplos de datos (p. 291).

La clase Book se mapea a la tabla ProductCatalog.


Las clases Forum, Thread y Reply se mapean a las tablas del mismo nombre.

A continuacin, en el ejemplo se usa DynamoDBContext para ejecutar las siguientes operaciones de


consulta y examen.

Obtener un libro por Id.

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;

API Version 2012-08-10


286
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

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();

static void Main(string[] args)


{
try
{
DynamoDBContext context = new DynamoDBContext(client);
// Get item.
GetBook(context, 101);

// Sample forum and thread to test queries.


string forumName = "Amazon DynamoDB";
string threadSubject = "DynamoDB Thread 1";
// Sample queries.
FindRepliesInLast15Days(context, forumName, threadSubject);
FindRepliesPostedWithinTimePeriod(context, forumName, threadSubject);

// 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); }
}

private static void GetBook(DynamoDBContext context, int productId)


{
Book bookItem = context.Load<Book>(productId);

Console.WriteLine("\nGetBook: Printing result.....");


Console.WriteLine("Title: {0} \n No.Of threads:{1} \n No. of messages: {2}",
bookItem.Title, bookItem.ISBN, bookItem.PageCount);
}

private static void FindRepliesInLast15Days(DynamoDBContext context,


string forumName,
string threadSubject)
{
string replyId = forumName + "#" + threadSubject;
DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);
IEnumerable<Reply> latestReplies =
context.Query<Reply>(replyId, QueryOperator.GreaterThan, twoWeeksAgoDate);
Console.WriteLine("\nFindRepliesInLast15Days: Printing result.....");
foreach (Reply r in latestReplies)
Console.WriteLine("{0}\t{1}\t{2}\t{3}", r.Id, r.PostedBy, r.Message,
r.ReplyDateTime);
}

private static void FindRepliesPostedWithinTimePeriod(DynamoDBContext context,


string forumName,
string threadSubject)
{
string forumId = forumName + "#" + threadSubject;
Console.WriteLine("\nFindRepliesPostedWithinTimePeriod: Printing result.....");

API Version 2012-08-10


287
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

DateTime startDate = DateTime.UtcNow - TimeSpan.FromDays(30);


DateTime endDate = DateTime.UtcNow - TimeSpan.FromDays(1);

IEnumerable<Reply> repliesInAPeriod = context.Query<Reply>(forumId,


QueryOperator.Between, startDate, endDate);
foreach (Reply r in repliesInAPeriod)
Console.WriteLine("{0}\t{1}\t{2}\t{3}", r.Id, r.PostedBy, r.Message,
r.ReplyDateTime);
}

private static void FindProductsPricedLessThanZero(DynamoDBContext context)


{
int price = 0;
IEnumerable<Book> itemsWithWrongPrice = context.Scan<Book>(
new ScanCondition("Price", ScanOperator.LessThan, price),
new ScanCondition("ProductCategory", ScanOperator.Equal, "Book")
);
Console.WriteLine("\nFindProductsPricedLessThanZero: Printing result.....");
foreach (Book r in itemsWithWrongPrice)
Console.WriteLine("{0}\t{1}\t{2}\t{3}", r.Id, r.Title, r.Price, r.ISBN);
}
}

[DynamoDBTable("Reply")]
public class Reply
{
[DynamoDBHashKey] //Partition key
public string Id
{
get; set;
}

[DynamoDBRangeKey] //Sort key


public DateTime ReplyDateTime
{
get; set;
}

// Properties included implicitly.


public string Message
{
get; set;
}
// Explicit property mapping with object persistence model attributes.
[DynamoDBProperty("LastPostedBy")]
public string PostedBy
{
get; set;
}
// Property to store version number for optimistic locking.
[DynamoDBVersion]
public int? Version
{
get; set;
}
}

[DynamoDBTable("Thread")]
public class Thread
{
// PK mapping.
[DynamoDBHashKey] //Partition key
public string ForumName
{
get; set;

API Version 2012-08-10


288
Amazon DynamoDB Developer Guide
.NET: modelo de persistencia de objetos

}
[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]

API Version 2012-08-10


289
Amazon DynamoDB Developer Guide
Cmo ejecutar los ejemplos de cdigo

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;
}
}
}

Cmo ejecutar los ejemplos de cdigo de esta Gua


para desarrolladores
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).

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:

API Version 2012-08-10


290
Amazon DynamoDB Developer Guide
Carga de ejemplos de datos

Ejemplos de cdigo Java (p. 296)


Ejemplos de cdigo de .NET (p. 298)

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).

Creacin de tablas y carga de ejemplos de datos


En esta seccin, vamos a usar la Consola de administracin de AWS para crear tablas en DynamoDB. A
continuacin, cargaremos datos en ellas mediante la AWS Command Line Interface (AWS CLI).

Estas tablas y sus datos se utilizan como ejemplos en esta Gua para desarrolladores.
Note

Si es un desarrollador de aplicaciones, le recomendamos que lea tambin la Gua de introduccin


a DynamoDB, en la que utilizar la versin descargable de DynamoDB. De este modo, podr
aprender a usar el API de bajo nivel de DynamoDB de forma gratuita, sin tener que abonar
costos de desempeo, almacenamiento o transferencia de datos. Para obtener ms informacin,
consulte Introduccin a DynamoDB (p. 55).

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)

Paso 1: Crear ejemplos de tablas


En esta seccin, vamos a usar la Consola de administracin de AWS para crear tablas en DynamoDB para
dos casos de uso simples.

Caso de uso1: Catlogo de productos


Supongamos que desea almacenar informacin de productos en DynamoDB. Cada producto tiene sus
propios atributos diferenciados, por lo que deber almacenar informacin distinta sobre cada uno de estos
productos.

Puede crear una tabla ProductCatalog en la que cada elemento se identifique de forma exclusiva mediante
un nico atributo numrico: Id.

Nombre de la tabla Clave principal

ProductCatalog Clave de particin: Id (Number)

API Version 2012-08-10


291
Amazon DynamoDB Developer Guide
Carga de ejemplos de datos

Caso de uso2: Aplicacin de foros


Supongamos que desea desarrollar una aplicacin para paneles de mensajes o foros de debate. Los
Discussion Forums de Amazon Web Services son un ejemplo de una aplicacin de este tipo. Los
clientes pueden interaccionar con la comunidad de desarrolladores, plantear preguntas o contestar a las
publicaciones de otros clientes. Cada servicio de AWS tiene un foro especfico. Cualquier usuario puede
iniciar una nueva conversacin de debate publicando un mensaje en un foro. Cada conversacin podra
recibir cualquier nmero de respuestas.

Puede modelar esta aplicacin creando tres tablas: Forum, Thread y Reply.

Nombre de la tabla Clave principal

Forum Clave de particin: Name (String)

Thread Clave de particin: ForumName (String)

Clave de ordenacin: Subject (String)

Responder Clave de particin: Id (String)

Clave de ordenacin: ReplyDateTime (String)

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.

Nombre de ndice Clave principal

PostedBy-Message-Index Clave de particin: PostedBy (String)

Clave de ordenacin: Message (String)

Cree la tabla ProductCatalog


1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.
2. Seleccione Create Table.
3. En la pantalla Create DynamoDB table, haga lo siguiente:

a. En el campo Table name, escriba ProductCatalog.


b. En Primary key, en el campo Partition key, escriba Id. Establezca el tipo de datos en Number.
4. Cuando la configuracin sea la que desea, elija Create.

Cree la tabla Forum


1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.
2. Seleccione Create Table.
3. En la pantalla Create DynamoDB table, haga lo siguiente:

a. En el campo Table name, escriba Forum.


b. En Primary key, en el campo Partition key, escriba Name. Establezca el tipo de datos en String.
4. Cuando la configuracin sea la que desea, elija Create.

API Version 2012-08-10


292
Amazon DynamoDB Developer Guide
Carga de ejemplos de datos

Cree la tabla Thread


1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.
2. Seleccione Create Table.
3. En la pantalla Create DynamoDB table, haga lo siguiente:

a. En el campo Table name, escriba Thread.


b. En Primary key, haga lo siguiente:

En el campo Partition key, escriba ForumName. Establezca el tipo de datos en String.


Elija Add sort key.
En el campo Sort key, escriba Subject. Establezca el tipo de datos en String.
4. Cuando la configuracin sea la que desea, elija Create.

Cree la tabla Reply


1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.
2. Seleccione Create Table.
3. En la pantalla Create DynamoDB table, haga lo siguiente:

a. En el campo Table name, escriba Reply.


b. En Primary key, haga lo siguiente:

En el campo Partition key, escriba Id. Establezca el tipo de datos en String.


Elija Add sort key.
En el campo Sort key, escriba ReplyDateTime. Establezca el tipo de datos en String.
c. En la seccin Table settings, desactive Use default settings.
d. En la seccin Secondary indexes, elija Add index.
e. En la ventana Add index, haga lo siguiente:

En Primary key, haga lo siguiente:


En el campo Partition key, escriba PostedBy. Establezca el tipo de datos en String.
Seleccione Add sort key.
En el campo Sort key, escriba Message. Establezca el tipo de datos en String.
En el campo Index name, escriba PostedBy-Message-Index.
Establezca Projected attributes en All.
Elija Add index.
4. Cuando la configuracin sea la que desea, elija Create.

Paso 2: Cargar los datos en las tablas


En este paso, vamos a cargar ejemplos de datos en las tablas que ha creado. Podra especificar los datos
de forma manual en la consola de DynamoDB; sin embargo, para ahorrar tiempo, vamos a usar la AWS
Command Line Interface.
Note

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": {}
}

Descargue el archivo comprimido con los ejemplos de datos


1. Descargue el ejemplo de archivo comprimido de datos (sampledata.zip) en este enlace:

sampledata.zip
2. Extraiga los archivos de datos .json del archivo comprimido.
3. Copie los archivos .json en el directorio actual.

Cargue los ejemplos de datos en las tablas de DynamoDB


1. Para cargar datos en la tabla ProductCatalog, escriba el siguiente comando:

aws dynamodb batch-write-item --request-items file://ProductCatalog.json


2. Para cargar datos en la tabla Forum, escriba el siguiente comando:

aws dynamodb batch-write-item --request-items file://Forum.json


3. Para cargar datos en la tabla Thread, escriba el siguiente comando:

aws dynamodb batch-write-item --request-items file://Thread.json


4. Para cargar datos en la tabla Reply, escriba el siguiente comando:

aws dynamodb batch-write-item --request-items file://Reply.json

Compruebe la carga de datos


Puede utilizar la Consola de administracin de AWS para comprobar los datos que ha cargado en las
tablas.

Para comprobar los datos desde la Consola de administracin de AWS

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de navegacin, elija Tables.
3. En la lista de tablas, elija ProductCatalog.
4. Elija la pestaa Items para ver los datos que ha cargado en la tabla.
5. Para ver un elemento de la tabla, elija su Id. Si lo desea, tambin puede editar el elemento.
6. Para volver a la lista de tablas, elija Cancel.

Repita este procedimiento para cada una de las dems tablas que ha creado:

Forum
Thread
Responder

API Version 2012-08-10


294
Amazon DynamoDB Developer Guide
Carga de ejemplos de datos

Paso 3: Consultar los datos


En este paso, vamos a usar la consola de DynamoDB para probar algunas consultas sencillas en las
tablas que hemos creado.

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de navegacin, elija Tables.
3. En la lista de tablas, elija Reply.
4. Elija la pestaa Items para ver los datos que ha cargado en la tabla.
5. Elija el enlace de filtrado de datos, situado justo debajo del botn Create item.

Al hacerlo, se abrir en la consola un panel de filtrado de datos.

6. En el panel de filtrado de datos, haga lo siguiente:

a. Cambie la operacin de Scan a Query.


b. En Partition key, especifique el valor Amazon DynamoDB#DynamoDB Thread 1.
c. Elija Inicio. Solo se devolvern los elementos de la tabla Reply que coincidan con los criterios de
la consulta.
7. La tabla Reply tiene un ndices secundario global basado en los atributos PostedBy y Message. Puede
usar el panel de filtrado de datos para consultar el ndice. Haga lo siguiente:

a. Cambie el cdigo de la consulta de:

[Table] Reply: Id, ReplyDateTime

a:

[Index] PostedBy-Message-Index: PostedBy, Message


b. En Partition key, especifique el valor User A.
c. Elija Inicio. Solo se devolvern los elementos del ndice PostedBy-Message-Index que coincidan
con los criterios de la consulta.

Dedique un tiempo a explorar las otras tablas en la consola de DynamoDB:

ProductCatalog
Forum

API Version 2012-08-10


295
Amazon DynamoDB Developer Guide
Ejemplos de cdigo Java

Thread

Paso 4: (Opcional) Eliminar


En esta Gua para desarrolladores de Amazon DynamoDB nos referiremos a estos ejemplos de tablas
en varias ocasiones para ayudar a ilustrar las operaciones con tablas y elementos realizadas mediante el
API de bajo nivel de DynamoDB y los distintos SDK de AWS. Estas tablas pueden resultarle tiles para
consultarlas si tiene previsto leer el resto de esta Gua para desarrolladores.

No obstante, si no desea conservarlas, debe eliminarlas para evitar que se le cobre por los recursos que
no necesita.

Para eliminar los ejemplos de tablas

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de navegacin, elija Tables.
3. En la lista de tablas, elija ProductCatalog.
4. Elija Delete Table. Se le pedir que confirme la seleccin.

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.

Ejemplos de cdigo Java


Temas
Java: configuracin de las credenciales de AWS (p. 297)
Java: configuracin de la regin y el punto de enlace de AWS (p. 298)

Esta Gua para desarrolladores contiene fragmentos de cdigo Java y programas listos para ejecutarlos.
Encontrar estos ejemplos de cdigo en las secciones siguientes:

Uso de elementos en DynamoDB (p. 340)


Uso de tablas en DynamoDB (p. 301)
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)
Java: DynamoDBMapper (p. 202)

API Version 2012-08-10


296
Amazon DynamoDB Developer Guide
Ejemplos de cdigo Java

Captura de la actividad de las tablas con Flujos de DynamoDB (p. 540)

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.

Para ejecutar los ejemplos de cdigo Java (con Eclipse)

1. Descargue e instale el IDE de Eclipse.


2. Descargue e instale AWS Toolkit for Eclipse.
3. Inicie Eclipse y, en el men Eclipse, elija File, New y despus Other.
4. En Select a wizard, elija AWS, elija AWS Java Project y despus elija Next.
5. En Create an AWS Java, haga lo siguiente:

a. En Project name, escriba el nombre del proyecto.


b. En Select Account, elija su perfil de credenciales en la lista.

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.

Para obtener ms informacin consulte el AWS SDK para Java.


Note

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.

Java: configuracin de las credenciales de AWS


El SDK para Java requiere que proporcione las credenciales de AWS a su aplicacin en tiempo de
ejecucin. En los ejemplos de cdigo de esta Gua para desarrolladores se presupone que utiliza
un archivo de credenciales de AWS, segn lo descrito en Set up AWS Credentials and Region for
Development en la AWS SDK for Java Developer Guide.

A continuacin se muestra un ejemplo de archivo de credenciales de AWS denominado ~/.aws/


credentials, donde el carcter de tilde (~) representa su directorio de inicio:

[default]
aws_access_key_id = AWS access key ID goes here
aws_secret_access_key = Secret key goes here

API Version 2012-08-10


297
Amazon DynamoDB Developer Guide
Ejemplos de cdigo de .NET

Java: configuracin de la regin y el punto de enlace de AWS


De forma predeterminada, los ejemplos de cdigo obtienen acceso a DynamoDB en la regin EE.UU.
Oeste (Oregn). Puede cambiar la regin modificando las propiedades de AmazonDynamoDB.

En el siguiente fragmento de cdigo se crea una nueva instancia de AmazonDynamoDB:

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:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(


new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();

Ejemplos de cdigo de .NET


Temas
.NET: configuracin de las credenciales de AWS (p. 299)
.NET: configuracin de la regin y el punto de enlace de AWS (p. 300)

Esta Gua para desarrolladores contiene fragmentos de cdigo .NET y programas listos para ejecutarlos.
Encontrar estos ejemplos de cdigo en las secciones siguientes:

Uso de elementos en DynamoDB (p. 340)


Uso de tablas en DynamoDB (p. 301)
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)
.NET: modelo de documento (p. 240)
.NET: modelo de persistencia de objetos (p. 262)
Captura de la actividad de las tablas con Flujos de DynamoDB (p. 540)

Puede comenzar rpidamente a trabajar con el AWS SDK para .NET y Toolkit for Visual Studio.

Para ejecutar los ejemplos de cdigo .NET (mediante Visual Studio)

1. Descargue e instale Microsoft Visual Studio.


2. Descargue e instale Toolkit for Visual Studio.
3. Inicie Visual Studio y elija Archivo, Nuevo y despus Proyecto.
4. En Nuevo proyecto, elija Nuevo proyecto de AWS y despus elija Aceptar.

API Version 2012-08-10


298
Amazon DynamoDB Developer Guide
Ejemplos de cdigo de .NET

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.

Para obtener ms informacin, consulte AWS SDK para .NET.


Note

Los ejemplos de cdigo de esta Gua para desarrolladores se han diseado para utilizarlos con la
ltima versin del AWS SDK para .NET.

.NET: configuracin de las credenciales de AWS


El AWS SDK para .NET requiere que proporcione las credenciales de AWS a su aplicacin en tiempo de
ejecucin. En los ejemplos de cdigo de esta Gua para desarrolladores se presupone que utiliza el SDK
Store para administrar el archivo de credenciales de AWS, segn lo descrito en Using the SDK Store en la
AWS SDK para .NET Developer Guide.

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.

En el siguiente ejemplo se muestra el archivo App.config predeterminado que se genera al crear un


nuevo proyecto con Toolkit for Visual Studio:

<?xml version="1.0" encoding="utf-8" ?>


<configuration>
<appSettings>
<add key="AWSProfileName" value="default"/>
<add key="AWSRegion" value="us-west-2" />
</appSettings>
</configuration>

En tiempo de ejecucin, el programa usa el conjunto default de credenciales de AWS, segn lo


especificado en la entrada AWSProfileName. Las credenciales de AWS en s se conservan en SDK

API Version 2012-08-10


299
Amazon DynamoDB Developer Guide
Ejemplos de cdigo de .NET

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

De forma predeterminada, los ejemplos de cdigo obtienen acceso a DynamoDB en la regin


EE.UU. Oeste (Oregn). Puede cambiar la regin modificando la entrada AWSRegion en el
archivo App.config. Puede establecer AWSRegion en cualquier regin de AWS donde Amazon
DynamoDB est disponible. Para obtener una lista completa, consulte Regiones y puntos de
conexin de AWS en la Referencia general de Amazon Web Services.

.NET: configuracin de la regin y el punto de enlace de AWS


De forma predeterminada, los ejemplos de cdigo obtienen acceso a DynamoDB en la regin EE.UU.
Oeste (Oregn). Puede cambiar la regin modificando la entrada AWSRegion en el archivo App.config.
Si lo prefiere, puede cambiar la regin modificando las propiedades de AmazonDynamoDBClient.

En el siguiente fragmento de cdigo se crea una nueva instancia de AmazonDynamoDBClient. El cliente


se modifica de tal forma que el cdigo se ejecute en DynamoDB en otra regin.

AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();


// This client will access the US East 1 region.
clientConfig.RegionEndpoint = RegionEndpoint.USEast1;
AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);

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:

AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();


// Set the endpoint URL
clientConfig.ServiceURL = "http://localhost:8000";
AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);

API Version 2012-08-10


300
Amazon DynamoDB Developer Guide
Uso de tablas

Uso de DynamoDB

En este captulo se explican detalladamente los temas siguientes:

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)

Uso de tablas en DynamoDB


En esta seccin se describe cmo usar la AWS CLI y los SDK de AWS para crear, actualizar y eliminar
tablas.
Note

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)

API Version 2012-08-10


301
Amazon DynamoDB Developer Guide
Operaciones bsicas con tablas

Operaciones bsicas con tablas


Temas
Creacin de una tabla (p. 302)
Descripcin de una tabla (p. 303)
Actualizacin de una tabla (p. 304)
Eliminacin de una tabla (p. 304)
Enumeracin de nombres de tablas (p. 304)
Descripcin de los lmites de desempeo provisionado (p. 304)

Creacin de una tabla


Use la operacin CreateTable para crear una tabla. Debe proporcionar la siguiente informacin:

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.

aws dynamodb create-table \


--table-name Music \
--attribute-definitions \
AttributeName=Artist,AttributeType=S \
AttributeName=SongTitle,AttributeType=S \
--key-schema \
AttributeName=Artist,KeyType=HASH \
AttributeName=SongTitle,KeyType=RANGE \
--provisioned-throughput \
ReadCapacityUnits=10, \
WriteCapacityUnits=5

La operacin CreateTable devuelve metadatos de la tabla, como se muestra a continuacin:

{
"TableDescription": {
"AttributeDefinitions": [

API Version 2012-08-10


302
Amazon DynamoDB Developer Guide
Operaciones bsicas con tablas

{
"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.

Descripcin de una tabla


Para ver informacin detallada sobre una tabla, utilice la operacin DescribeTable. Debe proporcionar
el nombre de la tabla. El resultado de DescribeTable tiene el mismo formato que el de CreateTable;
incluye la marca temporal del momento de creacin de la tabla, su esquema de claves, sus ajustes de
desempeo provisionado, su tamao aproximado y los ndices secundarios que contiene (si los hay).

Example

aws dynamodb describe-table --table-name Music

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.

API Version 2012-08-10


303
Amazon DynamoDB Developer Guide
Operaciones bsicas con tablas

Actualizacin de una tabla


La operacin UpdateTable permite realizar una de las acciones siguientes:

Modificar los ajustes de desempeo provisionado de la tabla.


Manipular los ndices secundarios globales de la tabla (consulte ndices secundarios globales (p. 466)).
Habilite o deshabilite Flujos de DynamoDB en la tabla (consulte Captura de la actividad de las tablas con
Flujos de DynamoDB (p. 540)).

Example
En este ejemplo de la AWS CLI se muestra cmo modificar los ajustes de desempeo provisionado de una
tabla:

aws dynamodb update-table --table-name Music \


--provisioned-throughput ReadCapacityUnits=20,WriteCapacityUnits=10

Note

Cuando se emite una solicitud UpdateTable, el estado de la tabla cambia de AVAILABLE a


UPDATING. La tabla permanece plenamente disponible para su uso mientras se encuentra en el
estado UPDATING. Cuando este proceso finaliza, el estado de la tabla cambia de UPDATING a
AVAILABLE.

Eliminacin de una tabla


Puede eliminar las tablas que no utilice con la operacin DeleteTable. Tenga en cuenta que la
eliminacin de una tabla es una operacin irrecuperable.

En este ejemplo de la AWS CLI se muestra cmo eliminar una tabla:

aws dynamodb delete-table --table-name Music

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.

Cuando la operacin DeleteTable concluya, la tabla ya no existir en DynamoDB.

Enumeracin de nombres de tablas


La operacin ListTables devuelve los nombres de las tablas de DynamoDB de la regin y cuenta de
AWS actuales.

Example

aws dynamodb list-tables

Descripcin de los lmites de desempeo provisionado


La operacin DescribeLimits devuelve los lmites vigentes de capacidad de lectura y escritura de la
regin y cuenta de AWS actuales.

API Version 2012-08-10


304
Amazon DynamoDB Developer Guide
Ajustes de desempeo de lecturas y escrituras

Example

aws dynamodb describe-limits

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).

Ajustes de desempeo de lecturas y escrituras


Temas
Unidades de capacidad de lectura (p. 306)
Unidades de capacidad de escritura (p. 306)
Limitacin controlada de solicitudes y capacidad de rfaga (p. 306)
Eleccin de los ajustes de desempeo iniciales (p. 307)
Modificacin de los ajustes de desempeo (p. 307)

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.

Los requisitos de desempeo se especifican en unidades de capacidad. Una unidad de capacidad es la


cantidad de datos que la aplicacin tiene que leer o escribir por segundo. Puede cambiar estos ajustes
ms adelante, si es necesario, o habilitar la funcin Auto Scaling de DynamoDB para que se modifiquen
automticamente.

API Version 2012-08-10


305
Amazon DynamoDB Developer Guide
Ajustes de desempeo de lecturas y escrituras

Unidades de capacidad de lectura


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.
Note

Para obtener ms informacin sobre los modelos de consistencia de lectura de DynamoDB,


consulte Consistencia de lectura (p. 16).

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.

Al leer un elemento de ms de 4 KB se consumen ms unidades de capacidad de lectura. Por ejemplo,


una lectura de consistencia alta de un elemento de 8KB (4 KB 2) consume 2unidades de capacidad de
lectura. Una lectura consistente final del mismo elemento consume solo 1unidad de capacidad de lectura.

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.

Unidades de capacidad de escritura


Una unidad de capacidad de escritura equivale a una escritura por segundo para un elemento con un
tamao de hasta 1 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.

Limitacin controlada de solicitudes y capacidad de rfaga


Si la aplicacin lleva a cabo lecturas o escrituras a una velocidad mayor que la admitida por
la tabla, DynamoDB comenzar a aplicar la limitacin controlada a esas solicitudes. Cuando
DynamoDB aplica una limitacin controlada a una lectura o escritura, devuelve una excepcin
ProvisionedThroughputExceededException al intermediario. A continuacin, la aplicacin puede
adoptar las medidas pertinentes, como esperar un breve intervalo de tiempo antes de repetir la solicitud.
Note

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).

API Version 2012-08-10


306
Amazon DynamoDB Developer Guide
Tamao de los elementos y
consumo de unidades de capacidad

Eleccin de los ajustes de desempeo iniciales


Cada aplicacin tiene requisitos diferentes de lectura y escritura en la base de datos. Al determinar los
ajustes de desempeo iniciales de una tabla de DynamoDB, debe tener en cuenta los siguientes datos:

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

Para obtener recomendaciones sobre el desempeo provisionado y temas relacionados, consulte


Prcticas recomendadas para las tablas (p. 697).

Modificacin de los ajustes de desempeo


Si ha habilitado la funcin Auto Scaling de DynamoDB en una tabla, la capacidad de desempeo de esta
se ajustar dinmicamente en respuesta al uso que se haga de ella. No se requiere intervencin manual
alguna.

Puede modificar los ajustes de desempeo provisionado de la tabla en la Consola de administracin


de AWS o mediante la operacin UpdateTable. 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).

Tamao de los elementos y consumo de unidades de


capacidad
Temas
Consumo de unidades de capacidad para las lecturas (p. 308)
Consumo de unidades de capacidad para las escrituras (p. 309)

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).

API Version 2012-08-10


307
Amazon DynamoDB Developer Guide
Tamao de los elementos y
consumo de unidades de capacidad

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.

Consumo de unidades de capacidad para las lecturas


A continuacin se describe cmo se consumen las unidades de capacidad de lectura en las operaciones
de lectura de DynamoDB:

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

API Version 2012-08-10


308
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

los mismos clculos de tamao de los elementos, porque DynamoDB tiene que leer cada elemento para
poder incrementar el recuento.

Operaciones de lectura y consistencia de lectura


En los clculos anteriores se ha dado por hecho que las solicitudes son de lectura de consistencia alta.
Para las solicitudes de lectura consistente final, la operacin consume solo la mitad de las unidades de
capacidad. Para una lectura consistente final, si el tamao total de los elementos es de 80KB, la operacin
consume solo 10unidades de capacidad.

Consumo de unidades de capacidad para las escrituras


A continuacin se describe cmo se consumen las unidades de capacidad de escritura en las operaciones
de escritura de DynamoDB:

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:

Si el elemento existe, el nmero de unidades de capacidad de escritura consumidas depender del


tamao del elemento. Por ejemplo, un error de escritura condicional de un elemento de 1 KB consumira
una unidad de capacidad de escritura; si el elemento tuviera el doble de tamao, la escritura condicional
que no se pudo realizar consumira dos unidades de capacidad de escritura.
Si el elemento no existe, DynamoDB consumir una unidad de capacidad de escritura.

Administracin automtica de la capacidad de


desempeo con la funcin Auto Scaling de DynamoDB
Note

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).

API Version 2012-08-10


309
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

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

Actualmente, el escalado automtico no reduce la capacidad aprovisionada si la capacidad que ha


consumido su tabla llega a un valor de cero. Como posible solucin, puede enviar solicitudes a la
tabla hasta que Auto Scaling reduzca la capacidad al mnimo, o cambiar la poltica para disminuir
la capacidad aprovisionada mxima y que sea igual que la mnima.
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 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.

La poltica de escalado contiene adems un valor de objetivo de utilizacin, es decir, el porcentaje de


desempeo provisionado consumido en un momento dado. Auto Scaling de aplicaciones utiliza un
algoritmo de seguimiento del objetivo para ajustar el desempeo provisionado de la tabla o el ndice al alza
o a la baja en respuesta a las cargas de trabajo reales, de tal forma que la utilizacin de la capacidad real
se mantenga en valores iguales o parecidos al objetivo de utilizacin.
Note

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.

Funcionamiento de la funcin Auto Scaling de DynamoDB


Note

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:

API Version 2012-08-10


310
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

En los pasos siguientes se resume el proceso de Auto Scaling mostrado en el diagrama anterior:

1. Se crea una poltica de Auto Scaling de aplicaciones para la tabla de DynamoDB.


2. DynamoDB publica las mtricas de capacidad consumida en Amazon CloudWatch.
3. Si la capacidad consumida de la tabla supera el objetivo de utilizacin (o no lo alcanza) durante un
periodo de tiempo especfico, Amazon CloudWatch activa una alarma. Puede ver la alarma en la
Consola de administracin de AWS y recibir notificaciones mediante Amazon Simple Notification Service
(Amazon SNS).
4. La alarma de CloudWatch invoca Auto Scaling de aplicaciones para evaluar la poltica de escalado.
5. Auto Scaling de aplicaciones emite una solicitud UpdateTable para ajustar el desempeo provisionado
de la tabla.
6. DynamoDB procesa la solicitud UpdateTable y aumenta (o reduce) dinmicamente la capacidad de
desempeo provisionada de la tabla para que sea parecida al objetivo de utilizacin.

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

API Version 2012-08-10


311
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

de capacidad consumidas respecto de las unidades de capacidad provisionadas y se expresa como un


porcentaje. Auto Scaling de aplicaciones utiliza el algoritmo de seguimiento del objetivo para asegurarse de
que la capacidad de lectura provisionada de ProductCatalog se ajuste de acuerdo con las necesidades, de
tal forma que la utilizacin permanezca prxima al 70%.
Note

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).

Uso de la Consola de administracin de AWS con la funcin Auto


Scaling de DynamoDB
Temas

API Version 2012-08-10


312
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

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.

Antes de comenzar: concesin de permisos a los usuarios para la funcin Auto


Scaling de DynamoDB
En AWS Identity and Access Management (IAM), la poltica administrada por AWS
DynamoDBFullAccess proporciona los permisos necesarios para utilizar la consola de DynamoDB. Sin
embargo, para la funcin Auto Scaling de DynamoDB, los usuarios de IAM requieren algunos privilegios
adicionales.
Important

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:

Para adjuntar la poltica AmazonDynamoDBFullAccess

1. Abra la consola de IAM, en https://console.aws.amazon.com/iam/.


2. En el panel de la consola de IAM, elija Users y, a continuacin, seleccione el usuario de IAM en la
lista.
3. En la pgina Summary, elija Add permissions.
4. Elija Attach existing policies directly.
5. En la lista de polticas, elija AmazonDynamoDBFullAccess y despus elija Next: Review.
6. Elija Add permissions.

Para agregar una poltica integrada personalizada

1. En el panel de la consola de IAM, elija Users y, a continuacin, seleccione el usuario de IAM en la


lista.
2. En la pgina Summary, elija Add inline policy.
3. En la pgina Set Permissions, elija Custom Policy y despus Select.
4. En la pgina Review Policy haga lo siguiente:

a. Policy name: escriba un nombre para la poltica. Por ejemplo: MyDynamoDBAutoscalingPolicy


b. Policy Document: copie y pegue el siguiente texto:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",

API Version 2012-08-10


313
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

"Action": [
"iam:AttachRolePolicy",
"iam:CreatePolicy",
"iam:CreateRole"
],
"Resource": "*"
}
]
}

5. Cuando termine, elija Apply Policy.

Creacin de una nueva tabla con la funcin Auto Scaling habilitada


Note

La funcin Auto Scaling de DynamoDB requiere la presencia de un rol (DynamoDBAutoscaleRole)


que lleve a cabo las acciones de Auto Scaling en su nombre. No es preciso que cree este rol de
forma manual. En lugar de ello, la consola de DynamoDB lo crea automticamente cuando se
crea una nueva tabla con Auto Scaling por primera vez.

Para crear una nueva tabla con la funcin Auto Scaling habilitada

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. Seleccione Create Table.
3. En la pgina Create DynamoDB table, especifique los detalles de Table name y Primary key.
4. Si aparece el mensaje siguiente, significa que la cuenta de AWS no tiene actualmente el rol
DynamoDBAutoscaleRole:

En este caso, haga lo siguiente:

1. Desactive Use default settings.


2. En la seccin Auto scaling, asegrese de que la opcin New role: DynamoDBAutoscaleRole est
seleccionada.

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.

Habilitacin de la funcin Auto Scaling de DynamoDB en tablas existentes


Note

La funcin Auto Scaling de DynamoDB requiere la presencia de un rol (DynamoDBAutoscaleRole)


que lleve a cabo las acciones de Auto Scaling en su nombre. La consola de DynamoDB lo crea
automticamente cuando se crea una nueva tabla con Auto Scaling por primera vez.
Si nunca haba usado la funcin Auto Scaling de DynamoDB, consulte Creacin de una
nueva tabla con la funcin Auto Scaling habilitada (p. 314). La consola de DynamoDB crea
DynamoDBAutoscaleRole automticamente cuando se crea una nueva tabla con Auto Scaling por
primera vez.

API Version 2012-08-10


314
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

Para habilitar la funcin Auto Scaling de DynamoDB en una tabla existente, haga lo siguiente:

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. Elija la tabla que desee usar y, a continuacin, elija Capacity.
3. En la seccin Auto Scaling, 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:

Target utilization: escriba el porcentaje de objetivo de utilizacin de la tabla.


Minimum provisioned capacity: escriba el lmite inferior del intervalo de Auto Scaling.
Maximum provisioned capacity: escriba el lmite superior del intervalo de Auto Scaling.
Apply same settings to ndices secundario globales: deje esta opcin con su valor
predeterminado (habilitada).
Note

Para obtener el mximo desempeo, le recomendamos que habilite Apply same


settings to ndices secundario globales. Esta opcin permite que la funcin Auto
Scaling de DynamoDB lleve a cabo un escalado uniforme de todos los ndices
secundarios globales de la tabla base. Esto incluye los ndices secundarios globales
existentes y cualesquiera otros que se creen en esta tabla en el futuro.
Con esta opcin habilitada, no se puede establecer una poltica de escalado para un
ndices secundario global individual.

(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.

Visualizacin de las actividades de Auto Scaling en la consola


A medida que la aplicacin enva trfico de lectura y escritura a la tabla, la funcin Auto Scaling de
DynamoDB modifica de forma dinmica los ajustes de desempeo de esa tabla.

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.

Modificacin o deshabilitacin de los ajustes de Auto Scaling de DynamoDB


Puede utilizar la Consola de administracin de AWS para modificar los ajustes de Auto Scaling de
DynamoDB. Para ello, vaya a la pestaa Capacity de la tabla y modifique los ajustes de la seccin Auto
Scaling. Para obtener ms informacin sobre estas opciones, consulte Habilitacin de la funcin Auto
Scaling de DynamoDB en tablas existentes (p. 314).

Para deshabilitar la funcin Auto Scaling de DynamoDB, vaya a la pestaa Capacity de la tabla y desactive
Read capacity, Write capacity o ambas.

Uso de la AWS CLI para administrar la funcin Auto Scaling de


DynamoDB
Temas
API Version 2012-08-10
315
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

Antes de empezar (p. 316)


Paso 1: Crear un rol de servicio para Application Auto Scaling (p. 316)
Paso 2: Crear una tabla de DynamoDB (p. 318)
Paso 3: Registrar un objetivo escalable (p. 318)
Paso 4: Crear una poltica de escalado (p. 319)
Paso 5: Dirija trfico de escritura a TestTable (p. 320)
Paso 6: Ver las acciones de Auto Scaling de aplicaciones (p. 321)
(Opcional) Paso 7: Limpiar (p. 322)

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.

Instalar la AWS CLI

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 la AWS CLI


Configuracin de la AWS CLI

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.

Paso 1: Crear un rol de servicio para Application Auto Scaling


Para poder trabajar con Application Auto Scaling, antes debe crear un rol de servicio para este servicio.
Un rol de servicio es un rol de IAM que autoriza a un servicio de AWS para actuar en su nombre. El rol de
servicio permite que Application Auto Scaling modifique los ajustes de desempeo provisionado para los
recursos de DynamoDB como si usted los estuviese modificando personalmente.

API Version 2012-08-10


316
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

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.

1. Cree un archivo denominado trust-relationship.json con el siguiente contenido:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "application-autoscaling.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

2. Cree el rol de servicio:

aws iam create-role \


--role-name MyIAMAutoscalingServiceRole \
--assume-role-policy-document file://trust-relationship.json

3. Cree un archivo denominado service-role-policy.json con el siguiente contenido:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:UpdateTable",
"cloudwatch:PutMetricAlarm",
"cloudwatch:DescribeAlarms",
"cloudwatch:DeleteAlarms"
],
"Resource": "*"
}
]
}

4. Cree una poltica de IAM para el rol de servicio:

aws iam create-policy \


--policy-name MyIAMAutoscalingServicePolicy \
--policy-document file://service-role-policy.json

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:

aws iam attach-role-policy \


--role-name MyIAMAutoscalingServiceRole \

API Version 2012-08-10


317
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

--policy-arn arn

Sustituya arn por el ARN de la poltica real del paso anterior.

Paso 2: Crear una tabla de DynamoDB


En este paso, utilice la AWS CLI para crear TestTable. La clave principal consta de pk (clave de particin)
y sk (clave de ordenacin). Ambos atributos son de tipo Number. Los ajustes de desempeo iniciales son
5unidades de capacidad de lectura y 5unidades de capacidad de escritura.

1. Utilice el siguiente comando de la AWS CLI para crear la tabla:

aws dynamodb create-table \


--table-name TestTable \
--attribute-definitions \
AttributeName=pk,AttributeType=N \
AttributeName=sk,AttributeType=N \
--key-schema \
AttributeName=pk,KeyType=HASH \
AttributeName=sk,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

2. Para comprobar el estado de la tabla, use el comando siguiente:

aws dynamodb describe-table \


--table-name TestTable \
--query "Table.[TableName,TableStatus,ProvisionedThroughput]"

La tabla est lista para usarla cuando su estado es ACTIVE.

Paso 3: Registrar un objetivo escalable


Ahora, vamos a registrar la capacidad de escritura de la tabla como objetivo escalable en Auto Scaling de
aplicaciones. Esto permite que Auto Scaling de aplicaciones ajuste la capacidad de escritura provisionada
para TestTable, pero solo dentro del rango de entre 5 y 10unidades de capacidad.

1. Al registrar el objetivo escalable, se especifica el ARN de MyIAMAutoscalingServiceRole que se


ha creado en Paso 1: Crear un rol de servicio para Application Auto Scaling (p. 316). Escriba el
comando siguiente para recuperar el ARN del rol:

aws iam get-role \


--role-name MyIAMAutoscalingServiceRole \
--query "Role.Arn"

Ahora, escriba el siguiente comando para registrar el objetivo escalable. Sustituya roleARN por el
ARN de MyIAMAutoscalingServiceRole.

aws application-autoscaling register-scalable-target \


--service-namespace dynamodb \

API Version 2012-08-10


318
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

--resource-id "table/TestTable" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--min-capacity 5 \
--max-capacity 10 \
--role-arn roleARN

2. Para comprobar el registro, utilice el siguiente comando:

aws application-autoscaling describe-scalable-targets \


--service-namespace dynamodb \
--resource-id "table/TestTable"

Paso 4: Crear una poltica de escalado


En este paso, se crea una poltica de escalado para TestTable. La poltica define los detalles segn los
cuales Auto Scaling de aplicaciones puede ajustar el desempeo provisionado de la tabla y las acciones
llevar a cabo para ello. Puede asociar esta poltica al objetivo escalable definido en el paso anterior
(unidades de capacidad de escritura para la tabla TestTable).

La poltica contiene los componentes siguientes:

PredefinedMetricSpecification: mtrica que Auto Scaling de aplicaciones puede ajustar. Para


DynamoDB, los siguientes valores son vlidos para PredefinedMetricType:
DynamoDBReadCapacityUtilization
DynamoDBWriteCapacityUtilization
ScaleOutCooldown: cantidad mnima de tiempo (en segundos) entre cada evento de Auto Scaling
de aplicaciones que aumenta el desempeo provisionado. Este parmetro permite que Auto Scaling de
aplicaciones aumente de forma continua, pero no drstica, el desempeo en respuesta a las cargas de
trabajo reales. El ajuste predeterminado de ScaleOutCooldown es 0.
ScaleInCooldown: cantidad mnima de tiempo (en segundos) entre cada evento de Auto Scaling
de aplicaciones que reduce el desempeo provisionado. Este parmetro permite que Auto Scaling de
aplicaciones disminuya el desempeo de manera gradual y predecible. El ajuste predeterminado de
ScaleInCooldown es 0.
TargetValue: Auto Scaling de aplicaciones se asegura de que la proporcin entre capacidad
consumida y capacidad provisionada se mantenga en este valor o en un valor prximo. TargetValue
se define como un porcentaje.

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.

Para TestTable, TargetValue se establece en el 50%. Auto Scaling de aplicaciones ajusta el


desempeo provisionado de la tabla dentro del rango comprendido entre 5 y 10unidades de capacidad
(consulte Paso 3: Registrar un objetivo escalable (p. 318)), de tal forma que la proporcin entre

API Version 2012-08-10


319
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

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.

1. Cree un archivo denominado scaling-policy.json con el siguiente contenido:

{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 60,
"TargetValue": 50.0
}

2. Utilice el siguiente comando de la AWS CLI para crear la poltica:

aws application-autoscaling put-scaling-policy \


--service-namespace dynamodb \
--resource-id "table/TestTable" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--policy-name "MyScalingPolicy" \
--policy-type "TargetTrackingScaling" \
--target-tracking-scaling-policy-configuration file://scaling-policy.json

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:

aws application-autoscaling describe-scaling-policies \


--service-namespace dynamodb \
--resource-id "table/TestTable" \
--policy-name "MyScalingPolicy"

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).

Paso 5: Dirija trfico de escritura a TestTable


Ahora puede probar la poltica de escalado escribiendo datos en TestTable. Para ello, deber ejecutar un
programa en Python.

1. Cree un archivo denominado bulk-load-test-table.py con el siguiente contenido:

import boto3
dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table("TestTable")

filler = "x" * 100000

i = 0
while (i < 10):
j = 0
while (j < 10):
print (i, j)

API Version 2012-08-10


320
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

table.put_item(
Item={
'pk':i,
'sk':j,
'filler':{"S":filler}
}
)
j += 1
i += 1

2. Escriba el comando siguiente para ejecutar el programa:

python bulk-load-test-table.py

La capacidad de escritura provisionada de TestTable es muy baja (5unidades de capacidad de


escritura), por lo que el programa se ahoga en ocasiones a causa de la limitacin controlada de
escritura. Este es el comportamiento esperado.

Permita que el programa contine ejecutndose mientras avanza al paso siguiente.

Paso 6: Ver las acciones de Auto Scaling de aplicaciones


En este paso, consultaremos las acciones de Auto Scaling de aplicaciones que se han iniciado en su
nombre. Adems, comprobaremos que Auto Scaling de aplicaciones ha actualizado la capacidad de
escritura provisionada para TestTable.

1. Escriba el comando siguiente para ver las acciones de Auto Scaling de aplicaciones:

aws application-autoscaling describe-scaling-activities \


--service-namespace dynamodb

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:

API Version 2012-08-10


321
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

aws dynamodb describe-table \


--table-name TestTable \
--query "Table.[TableName,TableStatus,ProvisionedThroughput]"

WriteCapacityUnits debera haberse escalado de 5 a 10.

(Opcional) Paso 7: Limpiar


En este tutorial, ha creado varios recursos. Puede eliminar estos recursos cuando ya los necesite.

1. Elimine la poltica de escalado para TestTable:

aws application-autoscaling delete-scaling-policy \


--service-namespace dynamodb \
--resource-id "table/TestTable" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--policy-name "MyScalingPolicy"

2. Anule el registro del objetivo escalable:

aws application-autoscaling deregister-scalable-target \


--service-namespace dynamodb \
--resource-id "table/TestTable" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits"

3. Elimine la tabla TestTable:

aws dynamodb delete-table --table-name TestTable

4. Para eliminar la poltica de IAM, primero debe determinar su ARN:

aws iam list-policies --scope Local

En el resultado, tome nota del ARN de MyIAMAutoscalingServicePolicy. Por ejemplo:


arn:aws:iam::111122223333:policy/MyIAMAutoscalingServicePolicy
5. Separe la poltica del rol de servicio:

aws iam detach-role-policy \


--role-name MyIAMAutoscalingServiceRole \
--policy-arn arn

Sustituya arn por el ARN de la poltica real del paso anterior.

Ahora ya puede eliminar la poltica:

API Version 2012-08-10


322
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

aws iam delete-policy \


--policy-arn arn

Por ltimo, elimine el rol de servicio:

aws iam delete-role \


--role-name MyIAMAutoscalingServiceRole

Programacin de aplicaciones con la funcin Auto Scaling de


DynamoDB
Adems de utilizar la Consola de administracin de AWS y la AWS CLI, puede escribir aplicaciones que
interaccionen con la funcin Auto Scaling de DynamoDB. Esta seccin contiene dos programas de Java
que puede utilizar para probar esta funcionalidad:

EnableDynamoDBAutoscaling.java
DisableDynamoDBAutoscaling.java

Habilitacin de Auto Scaling de aplicaciones para una tabla


En el siguiente programa se muestra un ejemplo de cmo configurar una poltica de Auto Scaling para una
tabla de DynamoDB (TestTable). Funciona de la siguiente manera:

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;

API Version 2012-08-10


323
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

import
com.amazonaws.services.applicationautoscaling.model.TargetTrackingScalingPolicyConfiguration;

public class EnableDynamoDBAutoscaling {

static AWSApplicationAutoScalingClient aaClient = new


AWSApplicationAutoScalingClient();

public static void main(String args[]) {

ServiceNamespace ns = ServiceNamespace.Dynamodb;
ScalableDimension tableWCUs = ScalableDimension.DynamodbTableWriteCapacityUnits;
String resourceID = "table/TestTable";

// Define the scalable target


RegisterScalableTargetRequest rstRequest = new RegisterScalableTargetRequest()
.withServiceNamespace(ns)
.withResourceId(resourceID)
.withScalableDimension(tableWCUs)
.withMinCapacity(5)
.withMaxCapacity(10)
.withRoleARN("SERVICE_ROLE_ARN_GOES_HERE");

try {
aaClient.registerScalableTarget(rstRequest);
} catch (Exception e) {
System.err.println("Unable to register scalable target: ");
System.err.println(e.getMessage());
}

// Verify that the target was created


DescribeScalableTargetsRequest dscRequest = new DescribeScalableTargetsRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceIds(resourceID);
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());
}

System.out.println();

// Configure a scaling policy


TargetTrackingScalingPolicyConfiguration targetTrackingScalingPolicyConfiguration =
new TargetTrackingScalingPolicyConfiguration()
.withPredefinedMetricSpecification(
new PredefinedMetricSpecification()
.withPredefinedMetricType(MetricType. DynamoDBWriteCapacityUtilization))
.withTargetValue(50.0)
.withScaleInCooldown(60)
.withScaleOutCooldown(60);

// Create the scaling policy, based on your configuration


PutScalingPolicyRequest pspRequest = new PutScalingPolicyRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceId(resourceID)
.withPolicyName("MyScalingPolicy")
.withPolicyType(PolicyType.TargetTrackingScaling)
.withTargetTrackingScalingPolicyConfiguration(targetTrackingScalingPolicyConfiguration);

API Version 2012-08-10


324
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

try {
aaClient.putScalingPolicy(pspRequest);
} catch (Exception e) {
System.err.println("Unable to put scaling policy: ");
System.err.println(e.getMessage());
}

// Verify that the scaling policy was created


DescribeScalingPoliciesRequest dspRequest = new DescribeScalingPoliciesRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceId(resourceID);

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());
}

Deshabilitacin de Auto Scaling de aplicaciones para una tabla


En el siguiente programa se invierte el proceso anterior. Se elimina la poltica de Auto Scaling y, a
continuacin, se anula el registro del objetivo escalable.

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;

public class DisableDynamoDBAutoscaling {

static AWSApplicationAutoScalingClient aaClient = new


AWSApplicationAutoScalingClient();

public static void main(String args[]) {

ServiceNamespace ns = ServiceNamespace.Dynamodb;
ScalableDimension tableWCUs = ScalableDimension.DynamodbTableWriteCapacityUnits;
String resourceID = "table/TestTable";

// Delete the scaling policy


DeleteScalingPolicyRequest delSPRequest = new DeleteScalingPolicyRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceId(resourceID)
.withPolicyName("MyScalingPolicy");

API Version 2012-08-10


325
Amazon DynamoDB Developer Guide
Administracin de la capacidad
de desempeo con Auto Scaling

try {
aaClient.deleteScalingPolicy(delSPRequest);
} catch (Exception e) {
System.err.println("Unable to delete scaling policy: ");
System.err.println(e.getMessage());
}

// Verify that the scaling policy was deleted


DescribeScalingPoliciesRequest descSPRequest = new DescribeScalingPoliciesRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceId(resourceID);

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();

// Remove the scalable target


DeregisterScalableTargetRequest delSTRequest = new DeregisterScalableTargetRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceId(resourceID);

try {
aaClient.deregisterScalableTarget(delSTRequest);
} catch (Exception e) {
System.err.println("Unable to deregister scalable target: ");
System.err.println(e.getMessage());
}

// Verify that the scalable target was removed


DescribeScalableTargetsRequest dscRequest = new DescribeScalableTargetsRequest()
.withServiceNamespace(ns)
.withScalableDimension(tableWCUs)
.withResourceIds(resourceID);

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());
}

API Version 2012-08-10


326
Amazon DynamoDB Developer Guide
Etiquetado para DynamoDB

Etiquetado para DynamoDB


Puede asignar etiquetas a los recursos de DynamoDB. Las etiquetas le permiten categorizar los recursos
de distintas maneras; por ejemplo, segn su finalidad, propietario, entorno u otro criterio. Las etiquetas le
pueden ayudar a:

Identificar rpidamente un recurso segn las etiquetas que le haya asignado.


Consultar las facturas de AWS desglosadas por etiquetas.
Note

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.

Para comenzar a utilizar las etiquetas, debe:

1. Comprender Restricciones de etiquetado (p. 327).


2. Crear etiquetas mediante Operaciones de etiquetado (p. 328).
3. Usar Informes de asignacin de costos (p. 328) para realizar el seguimiento de los costos de AWS
segn su etiqueta activa.

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.

API Version 2012-08-10


327
Amazon DynamoDB Developer Guide
Etiquetado para DynamoDB

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.

Para utilizar el API en su lugar, consulte la Amazon DynamoDB API Reference.

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:

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/home.


2. Elija una tabla y, a continuacin, seleccione la pestaa Settings.

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:

aws dynamodb tag-resource \


--resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/Movies \
--tags Key=Owner,Value=blueTeam

Para enumerar todas las etiquetas asociadas a la tabla Movies:

aws dynamodb list-tags-of-resource \


--resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/Movies

Informes de asignacin de costos


AWS utiliza etiquetas para organizar los costos de los recursos en el informe de asignacin de costos.
AWS proporciona dos tipos de etiquetas de asignacin de costos:

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.

Para activar las etiquetas generadas por AWS:

1. Inicie sesin en la consola de administracin de AWS y abra la consola de facturacin y administracin


de costos en https://console.aws.amazon.com/billing/home#/.

API Version 2012-08-10


328
Amazon DynamoDB Developer Guide
Uso de tablas: Java

2. En el panel de navegacin, seleccione Cost Allocation Tags.


3. En AWS-Generated Cost Allocation Tags, elija Activate.

Para activar las etiquetas definidas por el usuario:

1. Inicie sesin en la consola de administracin de AWS y abra la consola de facturacin y administracin


de costos en https://console.aws.amazon.com/billing/home#/.
2. En el panel de navegacin, seleccione Cost Allocation Tags.
3. En User-Defined Cost Allocation Tags, elija Activate.

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.

Para obtener ms informacin, consulte Uso de etiquetas de asignacin de costos.

Uso de tablas: Java


Temas
Creacin de una tabla (p. 329)
Actualizacin de una tabla (p. 330)
Eliminacin de una tabla (p. 331)
Enumeracin de tablas (p. 331)
Ejemplo: Creacin, actualizacin, eliminacin y enumeracin de tablas mediante el API de documentos
del AWS SDK for Java (p. 332)

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.

Creacin de una tabla


Para crear una tabla, debe proporcionar el nombre de la tabla, su clave principal y los valores de
desempeo provisionado. En el siguiente fragmento de cdigo se crea un ejemplo de tabla que utiliza un
identificador de atributo de tipo numrico como clave principal.

Para crear una tabla con el API del AWS SDK for Java:

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de CreateTableRequest para proporcionar la informacin de solicitud.

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.

En el siguiente fragmento de cdigo se ponen en prctica los pasos anteriores.

API Version 2012-08-10


329
Amazon DynamoDB Developer Guide
Uso de tablas: Java

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

List<AttributeDefinition> attributeDefinitions= new ArrayList<AttributeDefinition>();


attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));

List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH));

CreateTableRequest request = new CreateTableRequest()


.withTableName(tableName)
.withKeySchema(keySchema)
.withAttributeDefinitions(attributeDefinitions)
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits(5L)
.withWriteCapacityUnits(6L));

Table table = dynamoDB.createTable(request);

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();

System.out.printf("%s: %s \t ReadCapacityUnits: %d \t WriteCapacityUnits: %d",


tableDescription.getTableStatus(),
tableDescription.getTableName(),
tableDescription.getProvisionedThroughput().getReadCapacityUnits(),
tableDescription.getProvisionedThroughput().getWriteCapacityUnits());

Puede llamar al mtodo describe del cliente para obtener informacin sobre la tabla en cualquier
momento.

Example

TableDescription tableDescription = dynamoDB.getTable(tableName).describe();

Actualizacin de una tabla


Solamente se pueden actualizar los valores de desempeo provisionado de una tabla existente. Segn los
requisitos de su aplicacin, es posible que tenga que actualizar estos valores.
Note

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:

1. Cree una instancia de la clase Table.


2. Cree una instancia de la clase ProvisionedThroughput para proporcionar los nuevos valores de
desempeo.

API Version 2012-08-10


330
Amazon DynamoDB Developer Guide
Uso de tablas: Java

3. Ejecute el mtodo updateTable proporcionando la instancia de ProvisionedThroughput como


parmetro.

En el siguiente fragmento de cdigo se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ProductCatalog");

ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput()


.withReadCapacityUnits(15L)
.withWriteCapacityUnits(12L);

table.updateTable(provisionedThroughput);

table.waitForActive();

Eliminacin de una tabla


Para eliminar una tabla:

1. Cree una instancia de la clase Table.


2. Cree una instancia de la clase DeleteTableRequest y proporcione el nombre de la tabla que desea
eliminar.
3. Ejecute el mtodo deleteTable proporcionando la instancia de Table como parmetro.

En el siguiente fragmento de cdigo se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ProductCatalog");

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

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

TableCollection<ListTablesResult> tables = dynamoDB.listTables();


Iterator<Table> iterator = tables.iterator();

while (iterator.hasNext()) {
Table table = iterator.next();
System.out.println(table.getTableName());

API Version 2012-08-10


331
Amazon DynamoDB Developer Guide
Uso de tablas: Java

Ejemplo: Creacin, actualizacin, eliminacin y enumeracin de


tablas mediante el API de documentos del AWS SDK for Java
En el siguiente ejemplo de cdigo se utiliza el API de documentos del AWS SDK for Java para crear,
actualizar y eliminar una tabla (ExampleTable). Durante la actualizacin de la tabla, se aumentan los
valores de desempeo provisionado. Adems, en el ejemplo se enumeran todas las tablas de la cuenta y
se obtiene la descripcin de una de ellas en particular. Para obtener instrucciones paso a paso acerca de
cmo ejecutar el siguiente ejemplo, consulte Ejemplos de cdigo Java (p. 296).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPITableExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

static String tableName = "ExampleTable";

public static void main(String[] args) throws Exception {

createExampleTable();
listMyTables();
getTableInformation();
updateExampleTable();

deleteExampleTable();
}

static void createExampleTable() {

try {

List<AttributeDefinition> attributeDefinitions = new


ArrayList<AttributeDefinition>();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));

List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new
KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH)); // Partition

// key

API Version 2012-08-10


332
Amazon DynamoDB Developer Guide
Uso de tablas: Java

CreateTableRequest request = new


CreateTableRequest().withTableName(tableName).withKeySchema(keySchema)
.withAttributeDefinitions(attributeDefinitions).withProvisionedThroughput(
new
ProvisionedThroughput().withReadCapacityUnits(5L).withWriteCapacityUnits(6L));

System.out.println("Issuing CreateTable request for " + tableName);


Table table = dynamoDB.createTable(request);

System.out.println("Waiting for " + tableName + " to be created...this may take


a while...");
table.waitForActive();

getTableInformation();

}
catch (Exception e) {
System.err.println("CreateTable request failed for " + tableName);
System.err.println(e.getMessage());
}

static void listMyTables() {

TableCollection<ListTablesResult> tables = dynamoDB.listTables();


Iterator<Table> iterator = tables.iterator();

System.out.println("Listing table names");

while (iterator.hasNext()) {
Table table = iterator.next();
System.out.println(table.getTableName());
}
}

static void getTableInformation() {

System.out.println("Describing " + tableName);

TableDescription tableDescription = dynamoDB.getTable(tableName).describe();


System.out.format(
"Name: %s:\n" + "Status: %s \n" + "Provisioned Throughput (read capacity units/
sec): %d \n"
+ "Provisioned Throughput (write capacity units/sec): %d \n",
tableDescription.getTableName(), tableDescription.getTableStatus(),
tableDescription.getProvisionedThroughput().getReadCapacityUnits(),
tableDescription.getProvisionedThroughput().getWriteCapacityUnits());
}

static void updateExampleTable() {

Table table = dynamoDB.getTable(tableName);


System.out.println("Modifying provisioned throughput for " + tableName);

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());
}

API Version 2012-08-10


333
Amazon DynamoDB Developer Guide
Uso de tablas: .NET

static void deleteExampleTable() {

Table table = dynamoDB.getTable(tableName);


try {
System.out.println("Issuing DeleteTable request for " + tableName);
table.delete();

System.out.println("Waiting for " + tableName + " to be deleted...this may take


a while...");

table.waitForDelete();
}
catch (Exception e) {
System.err.println("DeleteTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}

Uso de tablas: .NET


Temas
Creacin de una tabla (p. 334)
Actualizacin de una tabla (p. 336)
Eliminacin de una tabla (p. 336)
Enumeracin de tablas (p. 337)
Ejemplo: Creacin, actualizacin, eliminacin y enumeracin de tablas mediante el API de bajo nivel
del AWS SDK para .NET (p. 337)

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.

1. Cree una instancia de la clase AmazonDynamoDBClient (el cliente).


2. Cree los objetos de solicitud correspondientes para proporcionar los parmetros obligatorios y
opcionales de la operacin.

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.

Creacin de una tabla


Para crear una tabla, debe proporcionar el nombre de la tabla, su clave principal y los valores de
desempeo provisionado.

API Version 2012-08-10


334
Amazon DynamoDB Developer Guide
Uso de tablas: .NET

A continuacin se indican los pasos que hay que seguir para crear una tabla mediante el API de bajo nivel
de .NET.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase CreateTableRequest para proporcionar la informacin de solicitud.

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.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new CreateTableRequest


{
TableName = tableName,
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "Id",
AttributeType = "N"
}
},
KeySchema = new List<KeySchemaElement>()
{
new KeySchemaElement
{
AttributeName = "Id",
KeyType = "HASH" //Partition key
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 10,
WriteCapacityUnits = 5
}
};

var response = client.CreateTable(request);

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

var result = response.CreateTableResult;


var tableDescription = result.TableDescription;
Console.WriteLine("{1}: {0} \t ReadCapacityUnits: {2} \t WriteCapacityUnits: {3}",
tableDescription.TableStatus,
tableDescription.TableName,
tableDescription.ProvisionedThroughput.ReadCapacityUnits,
tableDescription.ProvisionedThroughput.WriteCapacityUnits);

API Version 2012-08-10


335
Amazon DynamoDB Developer Guide
Uso de tablas: .NET

string status = tableDescription.TableStatus;


Console.WriteLine(tableName + " - " + status);

Tambin puede llamar al mtodo DescribeTable del cliente para obtener informacin sobre la tabla en
cualquier momento.

Example

var res = client.DescribeTable(new DescribeTableRequest{TableName = "ProductCatalog"});

Actualizacin de una tabla


Solamente se pueden actualizar los valores de desempeo provisionado de una tabla existente. Segn los
requisitos de su aplicacin, es posible que tenga que actualizar estos valores.
Note

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase UpdateTableRequest para proporcionar la informacin de solicitud.

Debe proporcionar el nombre de la tabla y los nuevos valores de desempeo provisionado.


3. Ejecute el mtodo AmazonDynamoDBClient.UpdateTable proporcionando el objeto de solicitud
como parmetro.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ExampleTable";

var request = new UpdateTableRequest()


{
TableName = tableName,
ProvisionedThroughput = new ProvisionedThroughput()
{
// Provide new values.
ReadCapacityUnits = 20,
WriteCapacityUnits = 10
}
};
var response = client.UpdateTable(request);

Eliminacin de una tabla


A continuacin se indican los pasos que hay que seguir para eliminar una tabla mediante el API de bajo
nivel de .NET.

1. Cree una instancia de la clase AmazonDynamoDBClient.

API Version 2012-08-10


336
Amazon DynamoDB Developer Guide
Uso de tablas: .NET

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.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ExampleTable";

var request = new DeleteTableRequest{ TableName = tableName };


var response = client.DeleteTable(request);

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

AmazonDynamoDBClient client = new AmazonDynamoDBClient();

// Initial value for the first page of table names.


string lastEvaluatedTableName = null;
do
{
// Create a request object to specify optional parameters.
var request = new ListTablesRequest
{
Limit = 10, // Page size.
ExclusiveStartTableName = lastEvaluatedTableName
};

var response = client.ListTables(request);


ListTablesResult result = response.ListTablesResult;
foreach (string name in result.TableNames)
Console.WriteLine(name);

lastEvaluatedTableName = result.LastEvaluatedTableName;

} while (lastEvaluatedTableName != null);

Ejemplo: Creacin, actualizacin, eliminacin y enumeracin de


tablas mediante el API de bajo nivel del AWS SDK para .NET
En el siguiente ejemplo de C# se crea, actualiza y elimina una tabla (ExampleTable). Adems, se
enumeran todas las tablas de la cuenta y se obtiene la descripcin de una de ellas en particular. Al

API Version 2012-08-10


337
Amazon DynamoDB Developer Guide
Uso de tablas: .NET

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";

static void Main(string[] args)


{
try
{
CreateExampleTable();
ListMyTables();
GetTableInformation();
UpdateExampleTable();

DeleteExampleTable();

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); }
}

private static void CreateExampleTable()


{
Console.WriteLine("\n*** Creating table ***");
var request = new CreateTableRequest
{
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "Id",
AttributeType = "N"
},
new AttributeDefinition
{
AttributeName = "ReplyDateTime",
AttributeType = "N"
}
},
KeySchema = new List<KeySchemaElement>
{
new KeySchemaElement
{
AttributeName = "Id",
KeyType = "HASH" //Partition key
},
new KeySchemaElement
{
AttributeName = "ReplyDateTime",
KeyType = "RANGE" //Sort key

API Version 2012-08-10


338
Amazon DynamoDB Developer Guide
Uso de tablas: .NET

}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 5,
WriteCapacityUnits = 6
},
TableName = tableName
};

var response = client.CreateTable(request);

var tableDescription = response.TableDescription;


Console.WriteLine("{1}: {0} \t ReadsPerSec: {2} \t WritesPerSec: {3}",
tableDescription.TableStatus,
tableDescription.TableName,
tableDescription.ProvisionedThroughput.ReadCapacityUnits,
tableDescription.ProvisionedThroughput.WriteCapacityUnits);

string status = tableDescription.TableStatus;


Console.WriteLine(tableName + " - " + status);

WaitUntilTableReady(tableName);
}

private static void ListMyTables()


{
Console.WriteLine("\n*** listing tables ***");
string lastTableNameEvaluated = null;
do
{
var request = new ListTablesRequest
{
Limit = 2,
ExclusiveStartTableName = lastTableNameEvaluated
};

var response = client.ListTables(request);


foreach (string name in response.TableNames)
Console.WriteLine(name);

lastTableNameEvaluated = response.LastEvaluatedTableName;
} while (lastTableNameEvaluated != null);
}

private static void GetTableInformation()


{
Console.WriteLine("\n*** Retrieving table information ***");
var request = new DescribeTableRequest
{
TableName = tableName
};

var response = client.DescribeTable(request);

TableDescription description = response.Table;


Console.WriteLine("Name: {0}", description.TableName);
Console.WriteLine("# of items: {0}", description.ItemCount);
Console.WriteLine("Provision Throughput (reads/sec): {0}",
description.ProvisionedThroughput.ReadCapacityUnits);
Console.WriteLine("Provision Throughput (writes/sec): {0}",
description.ProvisionedThroughput.WriteCapacityUnits);
}

private static void UpdateExampleTable()


{

API Version 2012-08-10


339
Amazon DynamoDB Developer Guide
Uso de elementos

Console.WriteLine("\n*** Updating table ***");


var request = new UpdateTableRequest()
{
TableName = tableName,
ProvisionedThroughput = new ProvisionedThroughput()
{
ReadCapacityUnits = 6,
WriteCapacityUnits = 7
}
};

var response = client.UpdateTable(request);

WaitUntilTableReady(tableName);
}

private static void DeleteExampleTable()


{
Console.WriteLine("\n*** Deleting table ***");
var request = new DeleteTableRequest
{
TableName = tableName
};

var response = client.DeleteTable(request);

Console.WriteLine("Table is being deleted...");


}

private static void WaitUntilTableReady(string tableName)


{
string status = null;
// Let us wait until table is created. Call DescribeTable.
do
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
catch (ResourceNotFoundException)
{
// DescribeTable is eventually consistent. So you might
// get resource not found. So we handle the potential exception.
}
} while (status != "ACTIVE");
}
}
}

Uso de elementos en DynamoDB


Temas
Lectura de un elemento (p. 341)

API Version 2012-08-10


340
Amazon DynamoDB Developer Guide
Lectura de un elemento

Escritura de un elemento (p. 342)


Valores devueltos (p. 344)
Operaciones por lotes (p. 345)
Contadores atmicos (p. 347)
Escrituras condicionales (p. 347)
Uso de expresiones en DynamoDB (p. 352)
Tiempo de vida (p. 377)
Uso de elementos: Java (p. 382)
Uso de elementos: .NET (p. 402)

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):

PutItem: permite crear un elemento.


GetItem: permite leer un elemento.
UpdateItem: permite actualizar un elemento.
DeleteItem: permite eliminar un elemento.

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:

BatchGetItem: permite leer hasta 100 elementos de una o varias tablas.


BatchWriteItem: permite crear o eliminar hasta 25 elementos en una o varias tablas.

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.

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"1"}}'

API Version 2012-08-10


341
Amazon DynamoDB Developer Guide
Escritura de un elemento

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.

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"1"}}' \
--consistent-read \
--projection-expression "Description, Price, RelatedItems" \
--return-consumed-capacity TOTAL

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:

TOTAL: devuelve el nmero total de unidades de capacidad de escritura consumidas.


INDEXES: devuelve el nmero total de unidades de capacidad de escritura consumidas, con subtotales
para la tabla y todos los ndices secundarios que se hayan visto afectados por la operacin.
NONE: no devuelve ningn dato de capacidad de escritura consumida. (Esta es la opcin
predeterminada.)

API Version 2012-08-10


342
Amazon DynamoDB Developer Guide
Escritura de un elemento

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).

aws dynamodb put-item \


--table-name Thread \
--item file://item.json

Los argumentos de --item se almacenan en el archivo item.json:

{
"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).)

aws dynamodb update-item \


--table-name Thread \
--key file://key.json \
--update-expression "SET Answered = :zero, Replies = :zero, LastPostedBy
= :lastpostedby" \
--expression-attribute-values file://expression-attribute-values.json \
--return-values ALL_NEW

Los argumentos de --key se almacenan en el archivo key.json:

{
"ForumName": {"S": "Amazon DynamoDB"},
"Subject": {"S": "New discussion thread"}

API Version 2012-08-10


343
Amazon DynamoDB Developer Guide
Valores devueltos

Los argumentos de --expression-attribute-values se almacenan en el archivo expression-


attribute-values.json:

{
":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.

aws dynamodb delete-item \


--table-name Thread \
--key file://key.json

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.

El valor predeterminado de ReturnValues es NONE, es decir, DynamoDB no devolver ninguna


informacin sobre los atributos modificados.

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.

API Version 2012-08-10


344
Amazon DynamoDB Developer Guide
Operaciones por lotes

Si actualiza un elemento que no exista (upsert), ALL_OLD no surte efecto.


ReturnValues: ALL_NEW
Si actualiza un elemento existente, ALL_NEW devuelve el elemento completo tal y como aparece
despus de actualizarlo.
Si actualiza un elemento que no exista (upsert), ALL_NEW devuelve el elemento completo.
ReturnValues: UPDATED_OLD
Si actualiza un elemento existente, UPDATED_OLD devuelve solamente los atributos actualizados, tal y
como aparecan antes de la actualizacin.
Si actualiza un elemento que no exista (upsert), UPDATED_OLD no surte efecto.
ReturnValues: UPDATED_NEW
Si actualiza un elemento existente, UPDATED_NEW devuelve solamente los atributos afectados, tal y
como aparecen despus de la actualizacin.
Si actualiza un elemento que no exista (upsert), UPDATED_NEW devuelve solamente los atributos
actualizados, tal y como aparecen despus de la actualizacin.

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.

Operaciones por lotes


Para las aplicaciones que requieren leer o escribir varios elementos, DynamoDB proporciona las
operaciones BatchGetItem y BatchWriteItem. El uso de estas operaciones puede reducir el nmero
de recorridos de ida y vuelta a travs de la red entre la aplicacin y DynamoDB. Adems, DynamoDB lleva
a cabo las operaciones de lectura y escritura individuales en paralelo. Las aplicaciones se benefician de
este procesamiento en paralelo sin tener que administrar la concurrencia ni los subprocesos.

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.

API Version 2012-08-10


345
Amazon DynamoDB Developer Guide
Operaciones por lotes

aws dynamodb batch-get-item \


--request-items file://request-items.json

Los argumentos de --request-items se almacenan en el archivo request-items.json:

{
"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

BatchWriteItem no admite las solicitudes UpdateItem.

Example

Escriba dos elementos en la tabla ProductCatalog.

aws dynamodb batch-write-item \


--request-items file://request-items.json

Los argumentos de --request-items se almacenan en el archivo request-items.json:

{
"ProductCatalog": [
{
"PutRequest": {
"Item": {
"Id": { "N": "601" },
"Description": { "S": "Snowboard" },
"QuantityOnHand": { "N": "5" },
"Price": { "N": "100" }
}
}
},
{
"PutRequest": {
"Item": {

API Version 2012-08-10


346
Amazon DynamoDB Developer Guide
Contadores atmicos

"Id": { "N": "602" },


"Description": { "S": "Snow shovel" }
}
}
}
]
}

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.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id": { "N": "601" }}' \
--update-expression "SET Price = Price + :incr" \
--expression-attribute-values '{":incr":{"N":"5"}}' \
--return-values UPDATED_NEW

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:

API Version 2012-08-10


347
Amazon DynamoDB Developer Guide
Escrituras condicionales

Supongamos que Alice utiliza la AWS CLI para actualizar el atributo Price a 8:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"1"}}' \
--update-expression "SET Price = :newval" \
--expression-attribute-values file://expression-attribute-values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo expression-


attribute-values.json:

{
":newval":{"N":"8"}
}

API Version 2012-08-10


348
Amazon DynamoDB Developer Guide
Escrituras condicionales

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:

API Version 2012-08-10


349
Amazon DynamoDB Developer Guide
Escrituras condicionales

Alice intenta actualizar el valor de Price a 8, pero solamente si el valor de Price actual es 10:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"1"}}' \
--update-expression "SET Price = :newval" \
--condition-expression "Price = :currval" \
--expression-attribute-values file://expression-attribute-values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo expression-


attribute-values.json:

{
":newval":{"N":"8"},
":currval":{"N":"10"}

API Version 2012-08-10


350
Amazon DynamoDB Developer Guide
Escrituras condicionales

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.

Para obtener ms informacin, consulte Expresiones de condicin (p. 360).

Idempotencia de las escrituras condicionales


Las escrituras condicionales son idempotentes. Esto significa que, aunque puede enviar la misma solicitud
de escritura condicional a DynamoDB varias veces, dicha solicitud no surtir efecto alguno en el elemento
despus de la primera vez que DynamoDB haya realizado la actualizacin.

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.

Unidades de capacidad consumidas por las escrituras


condicionales
Aunque el resultado de evaluar una expresin ConditionExpression sea false durante una escritura
condicional, DynamoDB consumir capacidad de escritura de la tabla:

Si el elemento no existe actualmente en la tabla, DynamoDB consumir una unidad de capacidad de


escritura.
Si el elemento existe, entonces el nmero de unidades de capacidad de escritura consumidas
depender del tamao del elemento. Por ejemplo, una escritura condicional de un elemento de 1 KB
que no se lleva a cabo consume una unidad de capacidad de escritura. Si el tamao del elemento es el
doble, la escritura condicional que no se ha llevado a cabo consumira dos unidades de capacidad de
escritura.

Note

Las operaciones de escritura solo consumen unidades de capacidad de escritura. Nunca


consumen unidades de capacidad de lectura.

Una escritura condicional que no se ha llevado a cabo devuelve la excepcin


ConditionalCheckFailedException. Cuando esto ocurre, no se recibe ninguna informacin en la respuesta
sobre la capacidad de escritura que se ha consumido. Sin embargo, puede consultar la mtrica
ConsumedWriteCapacityUnits de la tabla en Amazon CloudWatch. Para obtener ms informacin,
consulte Mtricas de DynamoDB (p. 671) en Monitorizacin de DynamoDB (p. 669).

API Version 2012-08-10


351
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Para devolver el nmero de unidades de capacidad de escritura consumidas durante una escritura
condicional, se usa el parmetro ReturnConsumedCapacity:

TOTAL: devuelve el nmero total de unidades de capacidad de escritura consumidas.


INDEXES: devuelve el nmero total de unidades de capacidad de escritura consumidas, con subtotales
para la tabla y todos los ndices secundarios que se hayan visto afectados por la operacin.
NONE: no devuelve ningn dato de capacidad de escritura consumida. (Esta es la opcin
predeterminada.)

Note

A diferencia de un ndices secundario global, un local secondary index comparte su capacidad de


desempeo provisionada con su tabla. La actividad de lectura y escritura en un local secondary
index consume capacidad de desempeo provisionada de la tabla.

Uso de expresiones en DynamoDB


En Amazon DynamoDB, se utilizan expresiones para indicar los atributos que se desea leer de un
elemento. Adems, se pueden utilizar al escribir un elemento, para indicar las condiciones que se deben
cumplir (esto tambin se denomina una actualizacin condicional) y cmo se han de actualizar los
atributos. En esta seccin se describen los aspectos gramaticales bsicos de las expresiones y los tipos de
expresiones disponibles.
Note

Con el fin de ofrecer compatibilidad retroactiva, DynamoDB tambin admite parmetros


condicionales que no utilizan expresiones. Para obtener ms informacin, consulte Parmetros
condicionales heredados (p. 824).
Las nuevas aplicaciones deben utilizar expresiones en lugar de los parmetros heredados.

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)

Especificacin de atributos de elementos


En esta seccin se describe cmo consultar los atributos de los elementos en una expresin. Puede utilizar
cualquier atributo, aunque se encuentre anidado profundamente en varias listas y mapas.

Temas
Atributos de nivel superior (p. 354)
Atributos anidados (p. 354)
Rutas de documento (p. 355)

Ejemplo de elemento: ProductCatalog

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:

API Version 2012-08-10


352
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Tenga en cuenta lo siguiente:

El valor de la clave de particin (Id) es 123. No hay clave de ordenacin.


Los tipos de datos de la mayora de los atributos son escalares, tales como String, Number, Boolean o
Null.
Un atributo (Color) es de tipo String Set.
Los siguientes atributos tienen tipos de datos de documento:
Lista de RelatedItems. Cada componente es un Id de un producto relacionado.
Mapa de imgenes (Pictures). Cada componente es una descripcin breve de una imagen, junto
con una direccin URL del archivo de imagen correspondiente.
Mapa de opiniones (ProductReviews). Cada componente representa una clasificacin y una lista de
opiniones correspondientes a esa clasificacin. Inicialmente, este mapa se rellena con opiniones de
cinco estrellas y una estrella.

API Version 2012-08-10


353
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Atributos de nivel superior


Se considera que un atributo es de nivel superior si no est integrado en otro atributo. En el elemento
ProductCatalog, los atributos de nivel superior son:

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:

[n]: para entradas de lista


. (punto): para entradas de mapa

Acceso a las entradas de lista

El operador de desreferenciacin de una entrada de lista es [n], donde n es el nmero de entrada.


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. Estos son algunos ejemplos:

MyList[0]
AnotherList[12]
ThisList[5][11]

La entrada ThisList[5] es una lista anidada en s misma. Por consiguiente, ThisList[5][11] se


refiere a la duodcima entrada de esa lista.

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]

API Version 2012-08-10


354
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Acceso a las entradas de un mapa

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.

A continuacin se indican algunos ejemplos de rutas de documentos. Consulte el elemento mostrado en


Especificacin de atributos de elementos (p. 352).

Atributo escalar de nivel superior:

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.

API Version 2012-08-10


355
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

A continuacin se muestran ejemplos de expresiones de proyeccin basadas en el elemento


ProductCatalog de Especificacin de atributos de elementos (p. 352):

Un solo atributo de nivel superior.

Title
Tres atributos de nivel superior. DynamoDB recuperar el conjunto Color completo.

Title, Price, Color


Cuatro atributos de nivel superior. DynamoDB devolver todo el contenido de RelatedItems y
ProductReviews.

Title, Description, RelatedItems, ProductReviews

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).

aws dynamodb get-item \


--table-name ProductCatalog \
--key file://key.json \
--projection-expression "Description, RelatedItems[0], ProductReviews.FiveStar"

Los argumentos de --key se almacenan en el archivo key.json:

{
"Id": { "N": "123" }
}

Para obtener ejemplos de cdigo especficos de los lenguajes de programacin, consulte Introduccin a
DynamoDB (p. 55).

Nombres de atributos de expresin


Un nombre de atributo de expresin es un marcador de posicin que se utiliza en una expresin en lugar
del nombre de atributo real. Un nombre de atributo de expresin debe comenzar por un signo # y debe ir
seguido de uno o ms caracteres alfanumricos.

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)

API Version 2012-08-10


356
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Nombres de atributo que contienen puntos (p. 357)


Atributos anidados (p. 358)
Repeticin de nombres de atributos (p. 359)

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:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "Comment"

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:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "#c" \
--expression-attribute-names '{"#c":"Comment"}'

Note

Si un nombre de atributo comienza por un nmero o contiene un espacio, un carcter especial o


una palabra reservada, entonces es imprescindible utilizar un nombre de atributo de expresin
para sustituir el nombre de ese atributo en la expresin.

Nombres de atributo que contienen puntos


En una expresin, un punto (".") se interpreta como un carcter separador en la ruta de un documento. Sin
embargo, DynamoDB tambin permite utilizar el punto como parte de un nombre de atributo. En algunos
casos, esto puede dar lugar a ambigedades. A modo de ejemplo, supongamos que desea recuperar el
atributo Safety.Warning atributo de un elemento ProductCatalog (consulte Especificacin de atributos
de elementos (p. 352)):

Supongamos que desea obtener acceso a Safety.Warning mediante una expresin de proyeccin:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "Safety.Warning"

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

API Version 2012-08-10


357
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

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:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "#sw" \
--expression-attribute-names '{"#sw":"Safety.Warning"}'

Ahora, DynamoDB devolvera el resultado correcto.

Atributos anidados
Supongamos que desea obtener acceso al atributo anidado ProductReviews.OneStar, utilizando la
siguiente expresin de proyeccin:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "ProductReviews.OneStar"

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?

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "#pr1star" \
--expression-attribute-names '{"#pr1star":"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

A continuacin, habra que usar #pr.#1s para la expresin de proyeccin:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "#pr.#1star" \
--expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'

API Version 2012-08-10


358
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Ahora, DynamoDB devolvera el resultado correcto.

Repeticin de nombres de atributos


Expresin los nombres de atributos de expresin resultan tiles cuando es preciso consultar repetidamente
el mismo nombre de atributo. Por ejemplo, tomemos la siguiente expresin para recuperar algunas de las
opiniones de un elemento de ProductCatalog:

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar,
ProductReviews.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:

#pr.FiveStar, #pr.ThreeStar, #pr.OneStar

aws dynamodb get-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"123"}}' \
--projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \
--expression-attribute-names '{"#pr":"ProductReviews"}'

Si define un nombre de atributo de expresin, debe usarlo de forma coherente en toda la expresin.
Adems, es importante no omitir el signo #.

Valores de los atributos de expresin


Si desea comparar un atributo con un valor, defina un valor de atributo de expresin como marcador de
posicin. Los valores de atributos de expresin reemplazan a los valores reales que se desea comparar,
que podran no conocerse hasta el tiempo de ejecucin. Un valor de atributo de expresin debe comenzar
por un signo : y debe ir seguido de uno o ms caracteres alfanumricos.

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:

aws dynamodb scan \


--table-name ProductCatalog \
--filter-expression "contains(Color, :c) and Price <= :p" \
--expression-attribute-values file://values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":c": { "S": "Black" },

API Version 2012-08-10


359
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

":p": { "N": "500" }


}

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

Para obtener ejemplos de cdigo especficos de los lenguajes de programacin, consulte


Introduccin a DynamoDB (p. 55).

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.

A continuacin se muestran algunos ejemplos de uso de expresiones de condicin en la AWS CLI.


Estos ejemplos se basan en la tabla ProductCatalog especificada en Especificacin de atributos de
elementos (p. 352). La clave de particin de esta tabla es Id y no tiene clave de ordenacin. La siguiente
operacin PutItem crea un ejemplo de elemento ProductCatalog al que nos referiremos en los ejemplos:

aws dynamodb put-item \


--table-name ProductCatalog \
--item file://item.json

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)

API Version 2012-08-10


360
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Operador de comparacin y referencia de funciones (p. 363)

Cmo evitar sobrescribir un elemento existente


La operacin PutItem sobrescribir un elemento que tenga la misma clave (si existe). Si desea evitar que
esto suceda, utilice una expresin de condicin. Esto permitir que la escritura se lleve a cabo nicamente
si el elemento en cuestin no tiene la misma clave:

aws dynamodb put-item \


--table-name ProductCatalog \
--item file://item.json \
--condition-expression "attribute_not_exists(Id)"

Si la expresin de condicin se evala en false, DynamoDB devuelve el siguiente mensaje de error: The
conditional request failed.
Note

Para obtener ms informacin sobre attribute_not_exists y otras funciones, consulte


Operador de comparacin y referencia de funciones (p. 363).

Comprobacin de los atributos de un elemento


Puede comprobar la existencia (o inexistencia) de cualquier atributo. Si la expresin de condicin se evala
en true, la operacin se realiza correctamente; de lo contrario, se produce un error.

En el siguiente ejemplo se utiliza attribute_not_exists para eliminar un producto nicamente si no


tiene el atributo Price:

aws dynamodb delete-item \


--table-name ProductCatalog \
--key '{"Id": {"N": "456"}}' \
--condition-expression "attribute_not_exists(Price)"

DynamoDB tambin ofrece la funcin attribute_exists. En el siguiente ejemplo se elimina un


producto nicamente si ha recibido opiniones negativas:

aws dynamodb delete-item \


--table-name ProductCatalog \
--key '{"Id": {"N": "456"}}' \
--condition-expression "attribute_exists(ProductReviews.OneStar)"

Note

Para obtener ms informacin sobre attribute_not_exists, attribute_exists y otras


funciones, consulte Operador de comparacin y referencia de funciones (p. 363).

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.

API Version 2012-08-10


361
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Vamos a retomar el elemento de Expresiones de condicin (p. 360):

{
"Id": {
"N": "456"
},
"Price": {
"N": "650"
},
"ProductCategory": {
"S": "Sporting Goods"
}
}

Ahora, supongamos que deseamos eliminar el elemento, pero solo en las siguientes condiciones:

El valor de ProductCategory es "Sporting Goods" o "Gardening Supplies".


El valor de Price est comprendido entre 500 y 600.

En el siguiente ejemplo se intentar eliminar el elemento:

aws dynamodb delete-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"456"}}' \
--condition-expression "(ProductCategory IN (:cat1, :cat2)) and (Price between :lo
and :hi)" \
--expression-attribute-values file://values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":cat1": {"S": "Sporting Goods"},
":cat2": {"S": "Gardening Supplies"},
":lo": {"N": "500"},
":hi": {"N": "600"}
}

Note

En la expresin de condicin, : (signo de dos puntos) indica un valor de atributo de expresin


(un marcador de posicin del valor real). Para obtener ms informacin, consulte Valores de los
atributos de expresin (p. 359).
Para obtener ms informacin sobre IN, AND y otras palabras clave, consulte Operador de
comparacin y referencia de funciones (p. 363).

En este ejemplo, la comparacin de ProductCategory se evala en true, pero la comparacin de Price


se evala en false. Esto hace que la expresin de condicin se evale en false y, por consiguiente, la
operacin DeleteItem no se lleva a cabo.

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.

API Version 2012-08-10


362
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

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:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id": {"N": "456"}}' \
--update-expression "SET Price = Price - :discount" \
--condition-expression "Price > :limit" \
--expression-attribute-values file://values.json

Los argumentos de --item se almacenan en el archivo values.json:

{
":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

En la expresin de condicin, : (signo de dos puntos) indica un valor de atributo de expresin


(un marcador de posicin del valor real). Para obtener ms informacin, consulte Valores de los
atributos de expresin (p. 359).
Para obtener ms informacin sobre ">" y otros operadores, consulte Operador de comparacin y
referencia de funciones (p. 363).

Operador de comparacin y referencia de funciones


En esta seccin se describen las funciones y las palabras clave integradas para escribir expresiones de
condicin en DynamoDB.

Temas
Sintaxis de las expresiones de condicin (p. 364)
Realizacin de comparaciones (p. 364)
Funciones (p. 365)

API Version 2012-08-10


363
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Evaluaciones lgicas (p. 367)


Parntesis (p. 368)
Precedencia en las condiciones (p. 368)

Sintaxis de las expresiones de condicin

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:

a = b: es true si a es igual que b.


a <> b: es true si a es distinto de b.
a < b: es true si a es menor que b.
a <= b: es true si a es menor o igual que b.
a > b: es true si a es mayor que b.
a >= b: es true si a es mayor o igual que b.

Use las palabras clave BETWEEN e IN para comparar un operando con un rango o una lista de valores:

a BETWEEN b AND c: es true si a es mayor o igual que b y menor o igual que c.


a IN (b, c, d) : es true si a es igual a cualquiera de los valores de la lista; por ejemplo, en este
caso, a b, c o d. La lista puede contener hasta 100valores separadas por comas.

API Version 2012-08-10


364
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

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 (path) Es true si el elemento contiene el atributo


especificado por path.

Ejemplo: Comprobacin de si un elemento de la


tabla Product tiene una imagen de vista lateral.

attribute_exists (Pictures.SideView)

attribute_not_exists (path) Es true si el atributo especificado en path no est


presente en el elemento.

Ejemplo: Comprobacin de si un elemento tiene el


atributo Manufacturer

attribute_not_exists (Manufacturer)

attribute_type (path, type) Es true si el atributo de la ruta especificada es de


un tipo de datos determinado. El parmetro type
debe ser uno de los siguientes:

S Cadena
SS: String Set
N: Number
NS: Number Set
B: Binary
BS: Binary Set
BOOL: Boolean
NULL Null
L List
M: Map

Debe utilizar un valor de atributo de expresin para


el parmetro type.

Ejemplo: Comprobacin de si el atributo


QuantityOnHand es del tipo List. En este
ejemplo, :v_sub es un marcador de posicin para
la L.

attribute_type
(ProductReviews.FiveStar, :v_sub)

Debe utilizar un valor de atributo de expresin para


el segundo parmetro.

begins_with (path, substr) Es true si el atributo especificado por path


comienza por una subcadena determinada.

API Version 2012-08-10


365
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

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)

El valor de atributo de expresin :v_sub es un


marcador de posicin para http://.

contains (path, operand) Es true si el atributo especificado por path es:

un valor de tipo String que contiene una


determinada subcadena;
un valor de tipo Set que contiene una entrada
determinada perteneciente al conjunto.

En cualquier caso, operand debe ser de tipo


String.

La ruta y el operando deben ser nicos; es decir,


contains (a, a) devolver un error.

Ejemplo: Comprobacin de si el atributo Brand


contiene la subcadena Company.

contains (Brand, :v_sub)

El valor de atributo de expresin :v_sub es un


marcador de posicin para Company.

Ejemplo: Comprobacin de si el producto est


disponible en color rojo.

contains (Color, :v_sub)

El valor de atributo de expresin :v_sub es un


marcador de posicin para Red.

API Version 2012-08-10


366
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Funcin Descripcin

size (path) Devuelve un nmero que representa el tamao de


un atributo. A continuacin se muestran los tipos
de datos vlidos para usarlos con size.

Si el atributo es de tipo String, size devuelve la


longitud de la cadena.

Ejemplo: Comprobacin de si la cadena Brand


es menor o igual que 20caracteres. El valor de
atributo de expresin :v_sub es un marcador de
posicin para 20.

size (Brand) <= :v_sub

Si el atributo es de tipo Binary, size devuelve el


nmero de bytes del valor del atributo.

Ejemplo: Supongamos que el elemento


ProductCatalog tiene un atributo de tipo Binary
denominado VideoClip, que contiene vdeo
breve sobre el uso del producto. En la siguiente
expresin se comprueba si VideoClip supera
los 64000bytes. El valor de atributo de expresin
:v_sub es un marcador de posicin para 64000.

size(VideoClip) > :v_sub

Si el tipo de datos del atributo es Set, size


devuelve el nmero de entradas del conjunto.

Ejemplo: Comprobacin de si el producto est


disponible en ms de un color. El valor de atributo
de expresin :v_sub es un marcador de posicin
para 1.

size (Color) < :v_sub

Si el atributo es de tipo List o Map, size devuelve


el nmero de elementos secundarios.

Ejemplo: Compruebe si el nmero de opiniones


OneStar ha superado un umbral determinado.
El valor de atributo de expresin :v_sub es un
marcador de posicin para 3.

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.

a AND b: es true si a y b son true.

API Version 2012-08-10


367
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

a OR b: es true si a o b (o ambas) son true.


NOT a: es true si a es false; es false si a es true.

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.

Precedencia en las condiciones

DynamoDB evala las condiciones de izquierda a derecha aplicando las siguientes normas de prioridad:

= <> < <= > >=


IN
BETWEEN
attribute_exists attribute_not_exists begins_with contains
Parntesis
NOT
AND
OR

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.

A continuacin se muestra un resumen de la sintaxis de las expresiones de actualizacin:

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

API Version 2012-08-10


368
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

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)

SET: modificacin o adicin de atributos de elementos


Utilice la accin SET en una expresin de actualizacin para agregar uno o varios atributos a un elemento.
Si cualquiera de estos atributos ya existe, se sobrescribir con los nuevos valores.

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.

En el resumen de sintaxis siguiente:

El componente path es la ruta de documento del elemento.


Un componente operand puede ser una ruta de documento a un elemento o una funcin.

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:

aws dynamodb put-item \


--table-name ProductCatalog \
--item file://item.json

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},

API Version 2012-08-10


369
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

"Brand": {"S": "Acme"}


}

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

Actualice los atributos ProductCategory y Price:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET ProductCategory = :c, Price = :p" \
--expression-attribute-values file://values.json \
--return-values ALL_NEW

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":c": { "S": "Hardware" },
":p": { "N": "60" }
}

Note

En la operacin UpdateItem, --return-values ALL_NEW hace que DynamoDB devuelva el


elemento tal y como aparece despus de la actualizacin.

Adicin de listas y mapas

Example

Agregue una lista y un mapa nuevos.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET RelatedItems = :ri, ProductReviews = :pr" \
--expression-attribute-values file://values.json \
--return-values ALL_NEW

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

API Version 2012-08-10


370
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

{
":ri": {
"L": [
{ "S": "Hammer" }
]
},
":pr": {
"M": {
"FiveStar": {
"L": [
{ "S": "Best product ever!" }
]
}
}
}
}

Adicin de entradas a una lista

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.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET RelatedItems[1] = :ri" \
--expression-attribute-values file://values.json \
--return-values ALL_NEW

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":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.

Adicin de atributos de mapa anidados

Example

Agregue algunos atributos de mapa anidados:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET #pr.#5star[1] = :r5, #pr.#3star = :r3" \

API Version 2012-08-10


371
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

--expression-attribute-names file://names.json \
--expression-attribute-values file://values.json \
--return-values ALL_NEW

Los argumentos de --expression-attribute-names se almacenan en el archivo names.json:

{
"#pr": "ProductReviews",
"#5star": "FiveStar",
"#3star": "ThreeStar"
}

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":r5": { "S": "Very happy with my purchase" },
":r3": {
"L": [
{ "S": "Just OK - not that great" }
]
}
}

Aumento y reduccin de atributos numricos

Puede sumar o restar un valor a un atributo numrico. Para ello, se utilizan los operadores + (ms) y -
(menos).

Example

Reduccin del valor de Price de un elemento:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET Price = Price - :p" \
--expression-attribute-values '{":p": {"N":"15"}}' \
--return-values ALL_NEW

Para aumentar el valor de Price, se utiliza el operador + en la expresin de actualizacin.

Adicin de entradas a una lista

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:

list_append (list1, list2)

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:

API Version 2012-08-10


372
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET #ri = list_append(#ri, :vals)" \
--expression-attribute-names '{"#ri": "RelatedItems"}' \
--expression-attribute-values file://values.json \
--return-values ALL_NEW

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":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.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET #ri = list_append(:vals, #ri)" \
--expression-attribute-names '{"#ri": "RelatedItems"}' \
--expression-attribute-values '{":vals": {"L": [ { "S": "Chisel" }]}}' \
--return-values ALL_NEW

Ahora, el atributo RelatedItems resultante contiene cinco entradas, el siguiente orden: Chisel, Hammer,
Nails, Screwdriver y Hacksaw.

Cmo evitar sobrescribir un atributo existente

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:

if_not_exists (path, value)

Si el elemento no contiene un atributo en la ruta path especificada, entonces if_not_exists se evala


en value; en caso contrario, se evala en path.

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.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "SET Price = if_not_exists(Price, :p)" \

API Version 2012-08-10


373
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

--expression-attribute-values '{":p": {"N": "100"}}' \


--return-values ALL_NEW

REMOVE: eliminacin de atributos de un elemento


Utilice la accin REMOVE en una expresin de actualizacin para eliminar uno o varios atributos de un
elemento. Para llevar a cabo varias acciones REMOVE, debe separarlas por comas.

A continuacin se muestra un resumen de la sintaxis de REMOVE en una expresin de actualizacin. El


nico operando es la ruta de documento del atributo que se desea eliminar:

remove-action ::=
path

Example

Elimine algunos atributos de un elemento. Si el atributo no existe, no sucede nada.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "REMOVE Brand, InStock, QuantityOnHand" \
--return-values ALL_NEW

Eliminacin de entradas de una lista

Puede utilizar REMOVE para eliminar entradas individuales de una lista.

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

En el siguiente ejemplo de la AWS CLI se eliminan Hammer y Nails de la lista.

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "REMOVE RelatedItems[1], RelatedItems[2]" \
--return-values ALL_NEW

Despus de eliminar Hammer y Nails, los elementos siguientes se reordenan. Ahora, la lista contiene lo
siguiente:

API Version 2012-08-10


374
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

[0]Chisel
[1]Screwdriver
[2]Hacksaw

ADD: actualizacin de nmeros y conjuntos


Note

En general, recomendamos utilizar SET en lugar de ADD.

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.

En el resumen de sintaxis siguiente:

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

Supongamos que el atributo QuantityOnHand no existe. En el siguiente ejemplo de la AWS CLI se


establece QuantityOnHand en 5:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "ADD QuantityOnHand :q" \
--expression-attribute-values '{":q": {"N": "5"}}' \
--return-values ALL_NEW

Ahora que QuantityOnHand ya existe, puede volver a ejecutar el ejemplo para incrementar
QuantityOnHand en 5cada vez.

API Version 2012-08-10


375
Amazon DynamoDB Developer Guide
Uso de expresiones en DynamoDB

Adicin de entradas a un conjunto

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:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "ADD Color :c" \
--expression-attribute-values '{":c": {"SS":["Orange", "Purple"]}}' \
--return-values ALL_NEW

Ahora que Color ya existe, podemos agregarle ms entradas:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "ADD Color :c" \
--expression-attribute-values '{":c": {"SS":["Yellow", "Green", "Blue"]}}' \
--return-values ALL_NEW

DELETE: eliminacin de entradas de un conjunto


Important

La accin DELETE solo es compatible con los tipos de datos Set.

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.

En el resumen de sintaxis siguiente:

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:

aws dynamodb update-item \


--table-name ProductCatalog \
--key '{"Id":{"N":"789"}}' \
--update-expression "DELETE Color :p" \
--expression-attribute-values '{":p": {"SS": ["Yellow", "Purple"]}}' \
--return-values ALL_NEW

API Version 2012-08-10


376
Amazon DynamoDB Developer Guide
Tiempo de vida

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.

Para comenzar a usar el TTL:

1. Comprenda Tiempo de vida: funcionamiento (p. 377).


2. Lea la seccin Antes de comenzar a usar Tiempo de vida (p. 379).
3. Habilite el TTL en una tabla determinada y elija el nombre de un atributo que contendr la marca
temporal de vencimiento. A continuacin, podr agregar o actualizar elementos en la tabla con marcas
temporales en el atributo que ha elegido. Para obtener ms informacin, consulte Cmo habilitar Tiempo
de vida (p. 379).

Tiempo de vida: funcionamiento


Cuando Tiempo de vida est habilitado en una tabla, un trabajo en segundo plano comprueba el atributo
TTL de los elementos para saber si han vencido.

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

DynamoDB suele eliminar los elementos en el plazo de 48horas desde su vencimiento. La


duracin exacta que se tarda en eliminar un elemento despus de que ha vencido es especfica
de la carga de trabajo y del tamao de la tabla. Los elementos que han vencido, pero no se han
eliminado, continan apareciendo en las lecturas, las consultas y los exmenes.

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.

API Version 2012-08-10


377
Amazon DynamoDB Developer Guide
Tiempo de vida

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.

En el siguiente diagrama se muestra cmo se organizaran los elementos de la tabla. El atributo


ExpirationTime se establece como el atributo Tiempo de vida (TTL). No se muestran todos los atributos.

SessionData

UserName SessionId CreationTime ExpirationTime SessionInfo


(TTL)

user1 74686572652773 1461931200 1461938400 {JSON ...


Document}

user2 6e6f7468696e67 1461920400 1461927600 {JSON ...


Document}

user3 746f2073656520 1461922200 1461929400 {JSON ...


Document}

user4 68657265212121 1461925380 1461932580 {JSON


Document}

user5 6e6572642e2e2e 1461920400 1461927600 {JSON ...


Document}

... ... ... ... ...

En este ejemplo, cada elemento tiene un valor del atributo ExpirationTime que se establece al crearlo.
Tomemos el primer registro:

SessionData

UserName SessionId CreationTime ExpirationTime SessionInfo


(TTL)

user1 74686572652773 1461931200 1461938400 {JSON ...


Document}

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).

API Version 2012-08-10


378
Amazon DynamoDB Developer Guide
Tiempo de vida

Antes de comenzar a usar Tiempo de vida


Antes de habilitar Tiempo de vida en una tabla, tenga en cuenta lo siguiente:

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).

Cmo habilitar Tiempo de vida


En esta seccin se describe cmo utilizar la consola de DynamoDB o la CLI para habilitar Tiempo de vida.
Para utilizar el API en su lugar, consulte la Amazon DynamoDB API Reference.

Temas
Cmo habilitar Tiempo de vida (consola) (p. 379)
Cmo habilitar Tiempo de vida (CLI) (p. 381)

Cmo habilitar Tiempo de vida (consola)


Para habilitar Tiempo de vida mediante la consola de DynamoDB:

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/home.


2. Elija Tables y, a continuacin, seleccione la tabla que desee modificar.
3. En Table details, junto a TTL attribute, elija Manage TTL.

API Version 2012-08-10


379
Amazon DynamoDB Developer Guide
Tiempo de vida

4. En el cuadro de dilogo Manage TTL, elija Enable TTL y despus especifique un nombre para TTL
attribute.

API Version 2012-08-10


380
Amazon DynamoDB Developer Guide
Tiempo de vida

Hay tres valores en Manage TTL:

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

De este modo, se le proporcionar un ejemplo de lista de elementos. No se trata de una lista


completa de todos los elementos que TTL eliminar.
6. Elija Continue para guardar la configuracin y habilitar TTL.

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.

Cmo habilitar Tiempo de vida (CLI)


Para habilitar TTL en la tabla "TTLExample":

aws dynamodb update-time-to-live --table-name TTLExample --time-to-live-specification


"Enabled=true, AttributeName=ttl"

Para describir TTL en la tabla "TTLExample":

aws dynamodb describe-time-to-live --table-name TTLExample


{
"TimeToLiveDescription": {
"AttributeName": "ttl",
"TimeToLiveStatus": "ENABLED"
}
}

API Version 2012-08-10


381
Amazon DynamoDB Developer Guide
Uso de elementos: Java

Para agregar un elemento a la tabla "TTLExample" con el atributo de Tiempo de vida establecido utilizando
el shell de BASH y la CLI:

EXP=`date -d '+5 days' +%s`


aws dynamodb put-item --table-name "TTLExample" --item '{"id": {"N": "1"}, "ttl": {"N":
"'$EXP'"}}'

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:

Terminal Linux: date +%s


Python: import time; long(time.time())
Java: System.currentTimeMillis() / 1000L
JavaScript: Math.floor(Date.now() / 1000)

Uso de elementos: Java


Temas
Colocacin de un elemento (p. 383)
Obtencin de un elemento (p. 385)
Escritura por lotes: colocacin y eliminacin de varios elementos (p. 387)
Obtencin por lotes: obtencin de varios elementos (p. 388)
Actualizacin de un elemento (p. 389)
Eliminacin de un elemento (p. 391)
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)

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)

API Version 2012-08-10


382
Amazon DynamoDB Developer Guide
Uso de elementos: Java

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).

Sigue estos pasos:

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table para representar la tabla que desea usar.
3. Cree una instancia de la clase Item para representar el nuevo elemento. Debe especificar la clave
principal del nuevo elemento y sus atributos.
4. Llame al mtodo putItem del objeto Table utilizando el Item que cre en el paso anterior.

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

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ProductCatalog");

// Build a list of related items


List<Number> relatedItems = new ArrayList<Number>();
relatedItems.add(341);
relatedItems.add(472);
relatedItems.add(649);

//Build a map of product pictures


Map<String, String> pictures = new HashMap<String, String>();
pictures.put("FrontView", "http://example.com/products/123_front.jpg");
pictures.put("RearView", "http://example.com/products/123_rear.jpg");
pictures.put("SideView", "http://example.com/products/123_left_side.jpg");

//Build a map of product reviews


Map<String, List<String>> reviews = new HashMap<String, List<String>>();

List<String> fiveStarReviews = new ArrayList<String>();


fiveStarReviews.add("Excellent! Can't recommend it highly enough! Buy it!");
fiveStarReviews.add("Do yourself a favor and buy this");
reviews.put("FiveStar", fiveStarReviews);

List<String> oneStarReviews = new ArrayList<String>();


oneStarReviews.add("Terrible product! Do not buy this.");
reviews.put("OneStar", oneStarReviews);

// Build the item


Item item = new Item()
.withPrimaryKey("Id", 123)
.withString("Title", "Bicycle 123")
.withString("Description", "123 description")
.withString("BicycleType", "Hybrid")
.withString("Brand", "Brand-Company C")

API Version 2012-08-10


383
Amazon DynamoDB Developer Guide
Uso de elementos: Java

.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);

// Write the item to the table


PutItemOutcome outcome = table.putItem(item);

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).

Especificacin de parmetros opcionales


Junto con los parmetros requeridos, puede especificar tambin otros opcionales en el mtodo putItem.
Por ejemplo, en el fragmento de cdigo Java siguiente se utiliza un parmetro opcional que permite
especificar una condicin para cargar el elemento. Si la condicin especificada no se cumple, el AWS SDK
para Java genera una excepcin ConditionalCheckFailedException. En el fragmento de cdigo se
especifican los parmetros opcionales siguientes en el mtodo putItem:

Una expresin ConditionExpression que define las condiciones de la solicitud. En el fragmento se


define la condicin siguiente: si el elemento existente tiene la misma clave principal, solo se sustituir si
tiene tambin un atributo ISBN igual a un valor especfico.
Mapa de ExpressionAttributeValues que se usar en la condicin. En este caso, solo se requiere
una sustitucin: el marcador de posicin :val de la expresin de condicin se sustituir en tiempo de
ejecucin por el valor de ISBN real que se va a comprobar.

En el siguiente ejemplo se agrega un nuevo elemento de libro utilizando estos parmetros opcionales.

Example

Item item = new Item()


.withPrimaryKey("Id", 104)
.withString("Title", "Book 104 Title")
.withString("ISBN", "444-4444444444")
.withNumber("Price", 20)
.withStringSet("Authors",
new HashSet<String>(Arrays.asList("Author1", "Author2")));

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();


expressionAttributeValues.put(":val", "444-4444444444");

PutItemOutcome outcome = table.putItem(


item,
"ISBN = :val", // ConditionExpression parameter
null, // ExpressionAttributeNames parameter - we're not using it for this
example
expressionAttributeValues);

PutItem y documentos JSON


Puede almacenar un documento JSON como atributo en una tabla de DynamoDB. Para ello, se utiliza
el mtodo withJSON de Item. Este mtodo analizar el documento JSON y mapear cada componente
nativo a un tipo de datos nativo de DynamoDB.

Supongamos que desea almacenar el siguiente documento JSON, que contiene los proveedores que
pueden servir pedidos de un producto determinado:

API Version 2012-08-10


384
Amazon DynamoDB Developer Guide
Uso de elementos: Java

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.

// Convert the document into a String. Must escape all double-quotes.


String vendorDocument = "{"
+ " \"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\""
+ " ]"
+ " }"
+ " }";

Item item = new Item()


.withPrimaryKey("Id", 210)
.withString("Title", "Book 210 Title")
.withString("ISBN", "210-2102102102")
.withNumber("Price", 30)
.withJSON("VendorInfo", vendorDocument);

PutItemOutcome outcome = table.putItem(item);

Obtencin de un elemento
Para recuperar un solo elemento, utilice el mtodo getItem de un objeto Table. Sigue estos pasos:

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table para representar la tabla que desea usar.
3. Llame al mtodo getItem de la instancia de Table. Es preciso especificar la clave principal del
elemento que se desea recuperar.

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.

API Version 2012-08-10


385
Amazon DynamoDB Developer Guide
Uso de elementos: Java

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ProductCatalog");

Item item = table.getItem("Id", 101);

Especificacin de parmetros opcionales


Junto con los parmetros requeridos, puede especificar tambin otros opcionales del mtodo getItem.
Por ejemplo, en el siguiente fragmento de cdigo Java se utiliza un mtodo opcional para recuperar solo
una lista concreta de atributos y especificar lecturas de consistencia alta. Para obtener ms informacin
sobre la consistencia de lectura, consulte Consistencia de lectura (p. 16).

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

GetItemSpec spec = new GetItemSpec()


.withPrimaryKey("Id", 206)
.withProjectionExpression("Id, Title, RelatedItems[0], Reviews.FiveStar")
.withConsistentRead(true);

Item item = table.getItem(spec);

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"
}

GetItem y documentos JSON


En la seccin PutItem y documentos JSON (p. 384), hemos almacenado un documento JSON en un
atributo de tipo Map denominado VendorInfo. Puede usar el mtodo getItem para recuperar todo el
documento en formato JSON o usar la notacin de ruta de documento para recuperar solo algunos de los
componentes de ese documento. En el siguiente fragmento de cdigo Java se muestran estas tcnicas.

GetItemSpec spec = new GetItemSpec()


.withPrimaryKey("Id", 210);

System.out.println("All vendor info:");

API Version 2012-08-10


386
Amazon DynamoDB Developer Guide
Uso de elementos: Java

spec.withProjectionExpression("VendorInfo");
System.out.println(table.getItem(spec).toJSON());

System.out.println("A single vendor:");


spec.withProjectionExpression("VendorInfo.V03");
System.out.println(table.getItem(spec).toJSON());

System.out.println("First office location for this vendor:");


spec.withProjectionExpression("VendorInfo.V03.Offices[0]");
System.out.println(table.getItem(spec).toJSON());

El resultado del ejemplo anterior tiene este aspecto:

All vendor info:


{"VendorInfo":{"V03":{"Name":"Better Buy Books","Offices":["Tokyo","Los
Angeles","Sydney"]},"V02":{"Name":"New Publishers, Inc.","Offices":["London","New
York"]},"V01":{"Name":"Acme Books","Offices":["Seattle"]}}}
A single vendor:
{"VendorInfo":{"V03":{"Name":"Better Buy Books","Offices":["Tokyo","Los
Angeles","Sydney"]}}}
First office location for a single vendor:
{"VendorInfo":{"V03":{"Offices":["Tokyo"]}}}

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:

GetItemSpec spec = new GetItemSpec()


.withPrimaryKey("Id", 210)
.withProjectionExpression("VendorInfo.V01, Title, Price");

Item item = table.getItem(spec);


System.out.println(item.toJSON());

El resultado tendr este aspecto:

{"VendorInfo":{"V01":{"Name":"Acme Books","Offices":
["Seattle"]}},"Price":30,"Title":"Book 210 Title"}

Escritura por lotes: colocacin y eliminacin de varios elementos


La escritura por lotes se refiere a colocar y eliminar varios elementos en un lote. El mtodo
batchWriteItem permite colocar y eliminar varios elementos de una o varias tablas con una sola
llamada. A continuacin se indican los pasos para colocar o eliminar varios elementos mediante el API de
documentos del AWS SDK for Java.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase TableWriteItems que describe todas las operaciones de colocacin
y eliminacin de una tabla. Si desea escribir en varias tablas en una misma operacin de escritura por
lotes, deber crear una instancia de TableWriteItems por cada tabla.
3. Llame al mtodo batchWriteItem proporcionando el o los objetos TableWriteItems que cre en el
paso anterior.
4. Procese la respuesta. Debe comprobar si en la respuesta se ha devuelto algn elemento de solicitud sin
procesar. Esto puede ocurrir si se alcanza el lmite de desempeo provisionado o se produce algn otro
error transitorio. Adems, DynamoDB limita el tamao de la solicitud y el nmero de operaciones que se

API Version 2012-08-10


387
Amazon DynamoDB Developer Guide
Uso de elementos: Java

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:

Colocar un elemento en la tabla Forum


Colocar y eliminar un elemento en la tabla Thread

A continuacin, el cdigo llama a batchWriteItem para llevar a cabo la operacin.

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

TableWriteItems forumTableWriteItems = new TableWriteItems("Forum")


.withItemsToPut(
new Item()
.withPrimaryKey("Name", "Amazon RDS")
.withNumber("Threads", 0));

TableWriteItems threadTableWriteItems = new TableWriteItems(Thread)


.withItemsToPut(
new Item()
.withPrimaryKey("ForumName","Amazon RDS","Subject","Amazon RDS Thread 1")
.withHashAndRangeKeysToDelete("ForumName","Some partition key value", "Amazon S3",
"Some sort key value");

BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(forumTableWriteItems,


threadTableWriteItems);

// Code for checking unprocessed items is omitted in this example

Para ver un ejemplo prctico, consulte Ejemplo: Operacin de escritura por lotes mediante el API de
documentos del AWS SDK for Java (p. 396).

Obtencin por lotes: obtencin de varios elementos


El mtodo batchGetItem permite recuperar varios elementos de una o varias tablas. Para recuperar un
solo elemento, puede usar el mtodo getItem.

Sigue estos pasos:

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase TableKeysAndAttributes que describe una lista de valores de clave
principal que se van a recuperar de una tabla. Si desea leer de varias tablas en una misma operacin de
obtencin por lotes, deber crear una instancia de TableKeysAndAttributes por cada tabla.
3. Llame al mtodo batchGetItem proporcionando el o los objetos TableKeysAndAttributes que
cre en el paso anterior.

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.

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

TableKeysAndAttributes forumTableKeysAndAttributes = new


TableKeysAndAttributes(forumTableName);

API Version 2012-08-10


388
Amazon DynamoDB Developer Guide
Uso de elementos: Java

forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name",
"Amazon S3",
"Amazon DynamoDB");

TableKeysAndAttributes threadTableKeysAndAttributes = new


TableKeysAndAttributes(threadTableName);
threadTableKeysAndAttributes.addHashAndRangePrimaryKeys("ForumName", "Subject",
"Amazon DynamoDB","DynamoDB Thread 1",
"Amazon DynamoDB","DynamoDB Thread 2",
"Amazon S3","S3 Thread 1");

BatchGetItemOutcome outcome = dynamoDB.batchGetItem(


forumTableKeysAndAttributes, threadTableKeysAndAttributes);

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);
}
}

Especificacin de parmetros opcionales


Junto con los parmetros requeridos, puede especificar tambin otros opcionales cuando use
batchGetItem. Por ejemplo, puede proporcionar una expresin ProjectionExpression con cada
TableKeysAndAttributes que defina. Esto le permite especificar los atributos que desea recuperar de
la tabla.

En el siguiente fragmento de cdigo se recuperan dos elementos de la tabla Forum. El parmetro


withProjectionExpression especifica que solamente hay que recuperar el atributo Threads.

Example

TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes("Forum")


.withProjectionExpression("Threads");

forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name",
"Amazon S3",
"Amazon DynamoDB");

BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes);

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.

El mtodo updateItem se comporta de la siguiente manera:

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,

API Version 2012-08-10


389
Amazon DynamoDB Developer Guide
Uso de elementos: Java

putItem sustituir el elemento completo. Si hay atributos en el elemento existente que no se


especifican en la informacin de entrada, putItem los eliminar del elemento.
En general, recomendamos usar updateItem siempre que desee modificar atributos de
elementos. El mtodo updateItem solo modificar los atributos del elemento que especifique en
la informacin de entrada, pero dejar los dems atributos del elemento tal cual estaban.

Sigue estos pasos:

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.

Se utiliza un mapa ExpressionAttributeValues en UpdateExpression. Los marcadores de


posicin :val1 y :val2 se sustituirn en tiempo de ejecucin por los valores reales de Authors y Price.

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ProductCatalog");

Map<String, String> expressionAttributeNames = new HashMap<String, String>();


expressionAttributeNames.put("#A", "Authors");
expressionAttributeNames.put("#P", "Price");
expressionAttributeNames.put("#I", "ISBN");

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();


expressionAttributeValues.put(":val1",
new HashSet<String>(Arrays.asList("Author YY","Author ZZ")));
expressionAttributeValues.put(":val2", 1); //Price

UpdateItemOutcome outcome = table.updateItem(


"Id", // key attribute name
101, // key attribute value
"add #A :val1 set #P = #P - :val2 remove #I", // UpdateExpression
expressionAttributeNames,
expressionAttributeValues);

Especificacin de parmetros opcionales


Junto con los parmetros requeridos, puede especificar tambin parmetros opcionales para el
mtodo updateItem, incluida una condicin que debe cumplirse para que se lleve a cabo la
actualizacin. Si la condicin especificada no se cumple, el AWS SDK para Java genera una excepcin
ConditionalCheckFailedException. Por ejemplo, el siguiente fragmento de cdigo Java actualiza de
forma condicional el precio de un elemento de libro a 25. Especifica una expresin ConditionExpression en
la que se indica que el precio solo debe actualizarse si el precio actual es 20.

Example

Table table = dynamoDB.getTable("ProductCatalog");

Map<String, String> expressionAttributeNames = new HashMap<String, String>();


expressionAttributeNames.put("#P", "Price");

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();


expressionAttributeValues.put(":val1", 25); // update Price to 25...

API Version 2012-08-10


390
Amazon DynamoDB Developer Guide
Uso de elementos: Java

expressionAttributeValues.put(":val2", 20); //...but only if existing Price is 20

UpdateItemOutcome outcome = table.updateItem(


new PrimaryKey("Id",101),
"set #P = :val1", // UpdateExpression
"#P = :val2", // ConditionExpression
expressionAttributeNames,
expressionAttributeValues);

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.

En el siguiente fragmento de cdigo Java se pone en prctica lo anterior y se incrementa el atributo


Quantity en una unidad. Tambin se demuestra cmo usar el parmetro ExpressionAttributeNames
en una expresin UpdateExpression.

Table table = dynamoDB.getTable("ProductCatalog");

Map<String,String> expressionAttributeNames = new HashMap<String,String>();


expressionAttributeNames.put("#p", "PageCount");

Map<String,Object> expressionAttributeValues = new HashMap<String,Object>();


expressionAttributeValues.put(":val", 1);

UpdateItemOutcome outcome = table.updateItem(


"Id", 121,
"set #p = #p + :val",
expressionAttributeNames,
expressionAttributeValues);

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.

Sigue estos pasos:

1. Cree una instancia del cliente de DynamoDB.


2. Llame al mtodo deleteItem proporcionando la clave del elemento que desea eliminar.

En el siguiente fragmento de cdigo Java se muestran estas tareas.

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ProductCatalog");

DeleteItemOutcome outcome = table.deleteItem("Id", 101);

Especificacin de parmetros opcionales


Puede especificar parmetros opcionales para deleteItem. Por ejemplo, el siguiente fragmento de
cdigo Java incluye una expresin ConditionExpression que indica que un elemento de libro de

API Version 2012-08-10


391
Amazon DynamoDB Developer Guide
Uso de elementos: Java

ProductCatalog solo se puede eliminar si el libro est descatalogado (el atributo InPublication es
false).

Example

Map<String,Object> expressionAttributeValues = new HashMap<String,Object>();


expressionAttributeValues.put(":val", false);

DeleteItemOutcome outcome = table.deleteItem("Id",103,


"InPublication = :val",
null, // ExpressionAttributeNames - not used in this example
expressionAttributeValues);

Ejemplo: Operaciones CRUD mediante el API de documentos del


AWS SDK for Java
En el siguiente ejemplo de cdigo se ilustran las operaciones CRUD en un elemento. En el ejemplo se crea
un elemento, se recupera, se llevan a cabo varias actualizaciones y, por ltimo, se elimina.
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).
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).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPIItemCRUDExample {

API Version 2012-08-10


392
Amazon DynamoDB Developer Guide
Uso de elementos: Java

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

static String tableName = "ProductCatalog";

public static void main(String[] args) throws IOException {

createItems();

retrieveItem();

// Perform various updates.


updateMultipleAttributes();
updateAddNewAttribute();
updateExistingAttributeConditionally();

// Delete the item.


deleteItem();

private static void createItems() {

Table table = dynamoDB.getTable(tableName);


try {

Item item = new Item().withPrimaryKey("Id", 120).withString("Title", "Book 120


Title")
.withString("ISBN", "120-1111111111")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author12",
"Author22")))
.withNumber("Price", 20).withString("Dimensions",
"8.5x11.0x.75").withNumber("PageCount", 500)
.withBoolean("InPublication", false).withString("ProductCategory", "Book");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 121).withString("Title", "Book 121


Title")
.withString("ISBN", "121-1111111111")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author21",
"Author 22")))
.withNumber("Price", 20).withString("Dimensions",
"8.5x11.0x.75").withNumber("PageCount", 500)
.withBoolean("InPublication", true).withString("ProductCategory", "Book");
table.putItem(item);

}
catch (Exception e) {
System.err.println("Create items failed.");
System.err.println(e.getMessage());

}
}

private static void retrieveItem() {


Table table = dynamoDB.getTable(tableName);

try {

Item item = table.getItem("Id", 120, "Id, ISBN, Title, Authors", null);

System.out.println("Printing item after retrieving it....");


System.out.println(item.toJSONPretty());

}
catch (Exception e) {

API Version 2012-08-10


393
Amazon DynamoDB Developer Guide
Uso de elementos: Java

System.err.println("GetItem failed.");
System.err.println(e.getMessage());
}

private static void updateAddNewAttribute() {


Table table = dynamoDB.getTable(tableName);

try {

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("Id", 121)


.withUpdateExpression("set #na = :val1").withNameMap(new
NameMap().with("#na", "NewAttribute"))
.withValueMap(new ValueMap().withString(":val1", "Some
value")).withReturnValues(ReturnValue.ALL_NEW);

UpdateItemOutcome outcome = table.updateItem(updateItemSpec);

// Check the response.


System.out.println("Printing item after adding new attribute...");
System.out.println(outcome.getItem().toJSONPretty());

}
catch (Exception e) {
System.err.println("Failed to add new attribute in " + tableName);
System.err.println(e.getMessage());
}
}

private static void updateMultipleAttributes() {

Table table = dynamoDB.getTable(tableName);

try {

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("Id", 120)


.withUpdateExpression("add #a :val1 set #na=:val2")
.withNameMap(new NameMap().with("#a", "Authors").with("#na",
"NewAttribute"))
.withValueMap(
new ValueMap().withStringSet(":val1", "Author YY", "Author
ZZ").withString(":val2", "someValue"))
.withReturnValues(ReturnValue.ALL_NEW);

UpdateItemOutcome outcome = table.updateItem(updateItemSpec);

// Check the response.


System.out.println("Printing item after multiple attribute update...");
System.out.println(outcome.getItem().toJSONPretty());

}
catch (Exception e) {
System.err.println("Failed to update multiple attributes in " + tableName);
System.err.println(e.getMessage());

}
}

private static void updateExistingAttributeConditionally() {

Table table = dynamoDB.getTable(tableName);

try {

// Specify the desired price (25.00) and also the condition (price =

API Version 2012-08-10


394
Amazon DynamoDB Developer Guide
Uso de elementos: Java

// 20.00)

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("Id", 120)


.withReturnValues(ReturnValue.ALL_NEW).withUpdateExpression("set #p
= :val1")
.withConditionExpression("#p = :val2").withNameMap(new NameMap().with("#p",
"Price"))
.withValueMap(new ValueMap().withNumber(":val1", 25).withNumber(":val2",
20));

UpdateItemOutcome outcome = table.updateItem(updateItemSpec);

// Check the response.


System.out.println("Printing item after conditional update to new
attribute...");
System.out.println(outcome.getItem().toJSONPretty());

}
catch (Exception e) {
System.err.println("Error updating item in " + tableName);
System.err.println(e.getMessage());
}
}

private static void deleteItem() {

Table table = dynamoDB.getTable(tableName);

try {

DeleteItemSpec deleteItemSpec = new DeleteItemSpec().withPrimaryKey("Id", 120)


.withConditionExpression("#ip = :val").withNameMap(new
NameMap().with("#ip", "InPublication"))
.withValueMap(new ValueMap().withBoolean(":val",
false)).withReturnValues(ReturnValue.ALL_OLD);

DeleteItemOutcome outcome = table.deleteItem(deleteItemSpec);

// Check the response.


System.out.println("Printing item that was deleted...");
System.out.println(outcome.getItem().toJSONPretty());

}
catch (Exception e) {
System.err.println("Error deleting item in " + tableName);
System.err.println(e.getMessage());
}
}
}

Ejemplo: Operaciones por lotes mediante el API de documentos


del AWS SDK for Java
Temas
Ejemplo: Operacin de escritura por lotes mediante el API de documentos del AWS SDK for
Java (p. 396)
Ejemplo: Operacin de obtencin por lotes mediante el API de documentos del AWS SDK for
Java (p. 397)

En esta seccin se proporcionan ejemplos de operaciones de escritura y obtencin por lotes mediante el
API de documentos del AWS SDK for Java.

API Version 2012-08-10


395
Amazon DynamoDB Developer Guide
Uso de elementos: 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).

Ejemplo: Operacin de escritura por lotes mediante el API de documentos del


AWS SDK for Java
En el siguiente ejemplo de cdigo Java se usa el mtodo batchWriteItem para llevar a cabo las
siguientes operaciones de colocacin y eliminacin:

Colocar un elemento en la tabla Forum


Colocar un elemento y eliminar un elemento de la tabla Thread.

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

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPIBatchWrite {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

static String forumTableName = "Forum";


static String threadTableName = "Thread";

API Version 2012-08-10


396
Amazon DynamoDB Developer Guide
Uso de elementos: Java

public static void main(String[] args) throws IOException {

writeMultipleItemsBatchWrite();

private static void writeMultipleItemsBatchWrite() {


try {

// Add a new item to Forum


TableWriteItems forumTableWriteItems = new TableWriteItems(forumTableName) //
Forum
.withItemsToPut(new Item().withPrimaryKey("Name", "Amazon
RDS").withNumber("Threads", 0));

// Add a new item, and delete an existing item, from Thread


// This table has a partition key and range key, so need to specify
// both of them
TableWriteItems threadTableWriteItems = new TableWriteItems(threadTableName)
.withItemsToPut(new Item().withPrimaryKey("ForumName", "Amazon RDS",
"Subject", "Amazon RDS Thread 1")
.withString("Message", "ElastiCache Thread 1 message")
.withStringSet("Tags", new HashSet<String>(Arrays.asList("cache", "in-
memory"))))
.withHashAndRangeKeysToDelete("ForumName", "Subject", "Amazon S3", "S3
Thread 100");

System.out.println("Making the request.");


BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(forumTableWriteItems,
threadTableWriteItems);

do {

// Check for unprocessed keys which could happen if you exceed


// provisioned throughput

Map<String, List<WriteRequest>> unprocessedItems =


outcome.getUnprocessedItems();

if (outcome.getUnprocessedItems().size() == 0) {
System.out.println("No unprocessed items found");
}
else {
System.out.println("Retrieving the unprocessed items");
outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems);
}

} while (outcome.getUnprocessedItems().size() > 0);

}
catch (Exception e) {
System.err.println("Failed to retrieve items: ");
e.printStackTrace(System.err);
}

Ejemplo: Operacin de obtencin por lotes mediante el API de documentos del


AWS SDK for Java
En el siguiente ejemplo de cdigo Java 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

API Version 2012-08-10


397
Amazon DynamoDB Developer Guide
Uso de elementos: Java

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

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPIBatchGet {


static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
static DynamoDB dynamoDB = new DynamoDB(client);

static String forumTableName = "Forum";


static String threadTableName = "Thread";

public static void main(String[] args) throws IOException {


retrieveMultipleItemsBatchGet();
}

private static void retrieveMultipleItemsBatchGet() {

try {

TableKeysAndAttributes forumTableKeysAndAttributes = new


TableKeysAndAttributes(forumTableName);
// Add a partition key
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name", "Amazon S3", "Amazon
DynamoDB");

TableKeysAndAttributes threadTableKeysAndAttributes = new


TableKeysAndAttributes(threadTableName);
// Add a partition key and a sort key
threadTableKeysAndAttributes.addHashAndRangePrimaryKeys("ForumName", "Subject",
"Amazon DynamoDB",
"DynamoDB Thread 1", "Amazon DynamoDB", "DynamoDB Thread 2", "Amazon S3",
"S3 Thread 1");

System.out.println("Making the request.");

BatchGetItemOutcome outcome =
dynamoDB.batchGetItem(forumTableKeysAndAttributes,
threadTableKeysAndAttributes);

API Version 2012-08-10


398
Amazon DynamoDB Developer Guide
Uso de elementos: Java

Map<String, KeysAndAttributes> unprocessed = null;

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());
}
}

// Check for unprocessed keys which could happen if you exceed


// provisioned
// throughput or reach the limit on response size.
unprocessed = outcome.getUnprocessedKeys();

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());
}

Ejemplo: Control de atributos de tipo Binary mediante el API de


documentos de AWS SDK for Java
En el siguiente ejemplo se ilustra cmo se controlan los atributos de tipo Binary. Adems, se agrega
un elemento a la tabla Reply. El elemento incluye un atributo de tipo Binary (ExtendedMessage) que
almacena datos comprimidos. A continuacin, en el ejemplo se recupera el elemento y se imprimen todos
los valores de los atributos. Con fines ilustrativos, el ejemplo usa la clase GZIPOutputStream para
comprimir un ejemplo de secuencia y asignrsela al atributo ExtendedMessage. Cuando se recupera el
atributo binario, se descomprime mediante la clase GZIPInputStream.
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).

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).

API Version 2012-08-10


399
Amazon DynamoDB Developer Guide
Uso de elementos: Java

Example

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPIItemBinaryExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

static String tableName = "Reply";


static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-
dd'T'HH:mm:ss.SSS'Z'");

public static void main(String[] args) throws IOException {


try {

// Format the primary key values


String threadId = "Amazon DynamoDB#DynamoDB Thread 2";

dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String replyDateTime = dateFormatter.format(new Date());

// Add a new reply with a binary attribute type


createItem(threadId, replyDateTime);

// Retrieve the reply with a binary attribute type


retrieveItem(threadId, replyDateTime);

// clean up by deleting the item


deleteItem(threadId, replyDateTime);
}
catch (Exception e) {
System.err.println("Error running the binary attribute type example: " + e);
e.printStackTrace(System.err);
}
}

public static void createItem(String threadId, String replyDateTime) throws IOException


{

Table table = dynamoDB.getTable(tableName);

// Craft a long message


String messageInput = "Long message to be compressed in a lengthy forum reply";

// Compress the long message

API Version 2012-08-10


400
Amazon DynamoDB Developer Guide
Uso de elementos: Java

ByteBuffer compressedMessage = compressString(messageInput.toString());

table.putItem(new Item().withPrimaryKey("Id", threadId).withString("ReplyDateTime",


replyDateTime)
.withString("Message", "Long message follows").withBinary("ExtendedMessage",
compressedMessage)
.withString("PostedBy", "User A"));
}

public static void retrieveItem(String threadId, String replyDateTime) throws


IOException {

Table table = dynamoDB.getTable(tableName);

GetItemSpec spec = new GetItemSpec().withPrimaryKey("Id", threadId,


"ReplyDateTime", replyDateTime)
.withConsistentRead(true);

Item item = table.getItem(spec);

// Uncompress the reply message and print


String uncompressed =
uncompressString(ByteBuffer.wrap(item.getBinary("ExtendedMessage")));

System.out.println("Reply message:\n" + " Id: " + item.getString("Id") + "\n" + "


ReplyDateTime: "
+ item.getString("ReplyDateTime") + "\n" + " PostedBy: " +
item.getString("PostedBy") + "\n" + " Message: "
+ item.getString("Message") + "\n" + " ExtendedMessage (uncompressed): " +
uncompressed + "\n");
}

public static void deleteItem(String threadId, String replyDateTime) {

Table table = dynamoDB.getTable(tableName);


table.deleteItem("Id", threadId, "ReplyDateTime", replyDateTime);
}

private static ByteBuffer compressString(String input) throws IOException {


// Compress the UTF-8 encoded String into a byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream os = new GZIPOutputStream(baos);
os.write(input.getBytes("UTF-8"));
os.close();
baos.close();
byte[] compressedBytes = baos.toByteArray();

// The following code writes the compressed bytes to a ByteBuffer.


// A simpler way to do this is by simply calling
// ByteBuffer.wrap(compressedBytes);
// However, the longer form below shows the importance of resetting the
// position of the buffer
// back to the beginning of the buffer if you are writing bytes directly
// to it, since the SDK
// will consider only the bytes after the current position when sending
// data to DynamoDB.
// Using the "wrap" method automatically resets the position to zero.
ByteBuffer buffer = ByteBuffer.allocate(compressedBytes.length);
buffer.put(compressedBytes, 0, compressedBytes.length);
buffer.position(0); // Important: reset the position of the ByteBuffer
// to the beginning
return buffer;
}

private static String uncompressString(ByteBuffer input) throws IOException {


byte[] bytes = input.array();

API Version 2012-08-10


401
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);


ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPInputStream is = new GZIPInputStream(bais);

int chunkSize = 1024;


byte[] buffer = new byte[chunkSize];
int length = 0;
while ((length = is.read(buffer, 0, chunkSize)) != -1) {
baos.write(buffer, 0, length);
}

String result = new String(baos.toByteArray(), "UTF-8");

is.close();
baos.close();
bais.close();

return result;
}
}

Uso de elementos: .NET


Temas
Colocacin de un elemento (p. 403)
Obtencin de un elemento (p. 404)
Actualizacin de un elemento (p. 405)
Contador atmico (p. 407)
Eliminacin de un elemento (p. 408)
Escritura por lotes: colocacin y eliminacin de varios elementos (p. 409)
Obtencin por lotes: obtencin de varios elementos (p. 410)
Ejemplo: Operaciones CRUD mediante el API de bajo nivel del AWS SDK para .NET (p. 413)
Ejemplo: Operaciones por lotes mediante el API de bajo nivel del AWS SDK para .NET (p. 417)
Ejemplo: Control de atributos de tipo Binary mediante el API de bajo nivel del AWS SDK
para .NET (p. 422)

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.

1. Cree una instancia de la clase AmazonDynamoDBClient (el cliente).


2. Proporcione los parmetros requeridos especficos de la operacin en el objeto de solicitud
correspondiente.

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.

El cliente AmazonDynamoDBClient proporciona los mtodos PutItem, GetItem, UpdateItem y


DeleteItem para las operaciones CRUD.

API Version 2012-08-10


402
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase PutItemRequest para proporcionar los parmetros requeridos.

Para colocar un elemento, debe proporcionar el nombre de la tabla y el elemento.


3. Ejecute el mtodo PutItem proporcionando el objeto PutItemRequest que cre en el paso anterior.

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

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new PutItemRequest


{
TableName = tableName,
Item = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue { N = "201" }},
{ "Title", new AttributeValue { S = "Book 201 Title" }},
{ "ISBN", new AttributeValue { S = "11-11-11-11" }},
{ "Price", new AttributeValue { S = "20.00" }},
{
"Authors",
new AttributeValue
{ SS = new List<string>{"Author1", "Author2"} }
}
}
};
client.PutItem(request);

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.

Especificacin de parmetros opcionales


Tambin puede usar el objeto PutItemRequest para proporcionar parmetros opcionales, como se
muestra en el siguiente fragmento de cdigo C#. En el ejemplo se especifican los parmetros opcionales
siguientes:

ExpressionAttributeNames, ExpressionAttributeValues y ConditionExpression


especifican que el elemento existente se puede sustituir nicamente si su atributo ISBN tiene un valor
especfico.

API Version 2012-08-10


403
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

El parmetro ReturnValues para solicitar el elemento anterior en la respuesta.

Example

var request = new PutItemRequest


{
TableName = tableName,
Item = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue { N = "104" }},
{ "Title", new AttributeValue { S = "Book 104 Title" }},
{ "ISBN", new AttributeValue { S = "444-4444444444" }},
{ "Authors",
new AttributeValue { SS = new List<string>{"Author3"}}}
},
// Optional parameters.
ExpressionAttributeNames = new Dictionary<string,string>()
{
{"#I", "ISBN"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":isbn",new AttributeValue {S = "444-4444444444"}}
},
ConditionExpression = "#I = :isbn"

};
var response = client.PutItem(request);

Para obtener ms informacin, consulte PutItem.

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase GetItemRequest para proporcionar los parmetros requeridos.

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.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el ejemplo se


recupera un elemento de la tabla ProductCatalog.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new GetItemRequest


{
TableName = tableName,

API Version 2012-08-10


404
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

Key = new Dictionary<string,AttributeValue>() { { "Id", new AttributeValue { N =


"202" } } },
};
var response = client.GetItem(request);

// Check the response.


var result = response.GetItemResult;
var attributeMap = result.Item; // Attribute list in the response.

Especificacin de parmetros opcionales


Tambin puede usar el objeto GetItemRequest para proporcionar parmetros opcionales, como se
muestra en el siguiente fragmento de cdigo C#. En el ejemplo se especifican los parmetros opcionales
siguientes:

El parmetro ProjectionExpression para especificar los atributos que se van a recuperar.


El parmetro ConsistentRead para realizar una lectura de consistencia alta. Para obtener ms
informacin sobre la consistencia de lectura, consulte Consistencia de lectura (p. 16).

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new GetItemRequest


{
TableName = tableName,
Key = new Dictionary<string,AttributeValue>() { { "Id", new AttributeValue { N =
"202" } } },
// Optional parameters.
ProjectionExpression = "Id, ISBN, Title, Authors",
ConsistentRead = true
};

var response = client.GetItem(request);

// Check the response.


var result = response.GetItemResult;
var attributeMap = result.Item;

Para obtener ms informacin, consulte GetItem.

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.

La operacin UpdateItem se rige por las directrices siguientes:

Si el elemento no existe, UpdateItem agrega un elemento nuevo utilizando la clave principal


especificada en la informacin de entrada.
Si el elemento existe, UpdateItem aplica las actualizaciones como se indica a continuacin:
Sustituye los valores de los atributos existentes por los valores de la actualizacin.
Si el atributo que se proporciona en la informacin de entrada no existe, agrega un nuevo atributo al
elemento.
Si el atributo de entrada es null, elimina el atributo, en caso de que est presente.

API Version 2012-08-10


405
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase UpdateItemRequest para proporcionar los parmetros requeridos.

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.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el ejemplo se


actualiza un elemento de libro de la tabla ProductCatalog. Se agrega un nuevo autor a la coleccin Authors
y se elimina el atributo ISBN existente. Tambin se reduce el precio en una unidad.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new UpdateItemRequest


{
TableName = tableName,
Key = new Dictionary<string,AttributeValue>() { { "Id", new AttributeValue { N =
"202" } } },
ExpressionAttributeNames = new Dictionary<string,string>()
{
{"#A", "Authors"},
{"#P", "Price"},
{"#NA", "NewAttribute"},
{"#I", "ISBN"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":auth",new AttributeValue { SS = {"Author YY","Author ZZ"}}},
{":p",new AttributeValue {N = "1"}},
{":newattr",new AttributeValue {S = "someValue"}},
},

// This expression does the following:


// 1) Adds two new authors to the list
// 2) Reduces the price
// 3) Adds a new attribute to the item
// 4) Removes the ISBN attribute from the item
UpdateExpression = "ADD #A :auth SET #P = #P - :p, #NA = :newattr REMOVE #I"
};

API Version 2012-08-10


406
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

var response = client.UpdateItem(request);

Especificacin de parmetros opcionales


Tambin puede usar el objeto UpdateItemRequest para proporcionar parmetros opcionales, como
se muestra en el siguiente fragmento de cdigo C#. En l se especifican los parmetros opcionales
siguientes:

ExpressionAttributeValues y ConditionExpression para especificar que el precio solo puede


actualizarse si el precio actual es 20.00.
El parmetro ReturnValues para solicitar el elemento actualizado en la respuesta.

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new UpdateItemRequest


{
Key = new Dictionary<string,AttributeValue>() { { "Id", new AttributeValue { N =
"202" } } },

// Update price only if the current price is 20.00.


ExpressionAttributeNames = new Dictionary<string,string>()
{
{"#P", "Price"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":newprice",new AttributeValue {N = "22"}},
{":currprice",new AttributeValue {N = "20"}}
},
UpdateExpression = "SET #P = :newprice",
ConditionExpression = "#P = :currprice",
TableName = tableName,
ReturnValues = "ALL_NEW" // Return all the attributes of the updated item.
};

var response = client.UpdateItem(request);

Para obtener ms informacin, consulte UpdateItem.

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.

En el siguiente fragmento de cdigo Java se pone en prctica lo anterior y se incrementa el atributo


Quantity en una unidad.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new UpdateItemRequest


{
Key = new Dictionary<string, AttributeValue>() { { "Id", new AttributeValue { N =
"121" } } },

API Version 2012-08-10


407
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

ExpressionAttributeNames = new Dictionary<string, string>()


{
{"#Q", "Quantity"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":incr",new AttributeValue {N = "1"}}
},
UpdateExpression = "SET #Q = #Q + :incr",
TableName = tableName
};

var response = client.UpdateItem(request);

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase DeleteItemRequest para proporcionar los parmetros requeridos.

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

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "ProductCatalog";

var request = new DeleteItemRequest


{
TableName = tableName,
Key = new Dictionary<string,AttributeValue>() { { "Id", new AttributeValue { N =
"201" } } },
};

var response = client.DeleteItem(request);

Especificacin de parmetros opcionales


Tambin puede usar el objeto DeleteItemRequest para proporcionar parmetros opcionales, como
se muestra en el siguiente fragmento de cdigo C#. En l se especifican los parmetros opcionales
siguientes:

ExpressionAttributeValues y ConditionExpression para especificar que el elemento de libro


solo se puede eliminar si est descatalogado (el valor del atributo InPublication es false).
El parmetro ReturnValues para solicitar el elemento eliminado en la respuesta.

Example

var request = new DeleteItemRequest


{

API Version 2012-08-10


408
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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"
};

var response = client.DeleteItem(request);

Para obtener ms informacin, consulte DeleteItem.

Escritura por lotes: colocacin y eliminacin de varios elementos


La escritura por lotes se refiere a colocar y eliminar varios elementos en un lote. El mtodo
BatchWriteItem permite colocar y eliminar varios elementos de una o varias tablas con una sola
llamada. A continuacin se indican los pasos que hay que seguir para recuperar varios elementos
mediante el API de bajo nivel del SDK para .NET.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase BatchWriteItemRequest para describir todas las operaciones de
colocacin y eliminacin.
3. Ejecute el mtodo BatchWriteItem proporcionando el objeto BatchWriteItemRequest que cre en
el paso anterior.
4. Procese la respuesta. Debe comprobar si en la respuesta se ha devuelto algn elemento de solicitud sin
procesar. Esto puede ocurrir si se alcanza el lmite de desempeo provisionado o se produce algn otro
error transitorio. Adems, DynamoDB limita el tamao de la solicitud y el nmero de operaciones que se
pueden especificar en ella. Si supera estos lmites, DynamoDB rechaza la solicitud. Para obtener ms
informacin, consulte BatchWriteItem.

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:

Colocar un elemento en la tabla Forum


Colocar y eliminar un elemento en la tabla Thread

A continuacin, el cdigo ejecuta BatchWriteItem para llevar a cabo una operacin por lotes.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();

string table1Name = "Forum";


string table2Name = "Thread";

var request = new BatchWriteItemRequest


{
RequestItems = new Dictionary<string, List<WriteRequest>>
{
{
table1Name, new List<WriteRequest>

API Version 2012-08-10


409
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

{
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).

Obtencin por lotes: obtencin de varios elementos


El mtodo BatchGetItem permite recuperar varios elementos de una o varias tablas.
Note

Para recuperar un solo elemento, puede usar el mtodo GetItem.

A continuacin se indican los pasos que hay que seguir para recuperar varios elementos mediante el API
de bajo nivel del SDK para .NET.

1. Cree una instancia de la clase AmazonDynamoDBClient.

API Version 2012-08-10


410
Amazon DynamoDB Developer Guide
Uso de elementos: .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.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores. En el ejemplo se


recuperan elementos de dos tablas, Forum y Thread. La solicitud especifica dos elementos en la tabla
Forum y tres en la tabla Thread. La respuesta incluye elementos de ambas tablas. En el cdigo se muestra
cmo procesar la respuesta.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();

string table1Name = "Forum";


string table2Name = "Thread";

var request = new BatchGetItemRequest


{
RequestItems = new Dictionary<string, KeysAndAttributes>()
{
{ table1Name,
new KeysAndAttributes
{
Keys = new List<Dictionary<string, AttributeValue>>()
{
new Dictionary<string, AttributeValue>()
{
{ "Name", new AttributeValue { S = "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 = "DynamoDB" } },
{ "Subject", new AttributeValue { S = "DynamoDB Thread 1" } }
},
new Dictionary<string, AttributeValue>()
{
{ "ForumName", new AttributeValue { S = "DynamoDB" } },
{ "Subject", new AttributeValue { S = "DynamoDB Thread 2" } }
},
new Dictionary<string, AttributeValue>()
{
{ "ForumName", new AttributeValue { S = "Amazon S3" } },
{ "Subject", new AttributeValue { S = "Amazon S3 Thread 1" } }
}
}
}

API Version 2012-08-10


411
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

}
}
};

var response = client.BatchGetItem(request);

// Check the response.


var result = response.BatchGetItemResult;
var responses = result.Responses; // The attribute list in the response.

var table1Results = responses[table1Name];


Console.WriteLine("Items in table {0}" + table1Name);
foreach (var item1 in table1Results.Items)
{
PrintItem(item1);
}

var table2Results = responses[table2Name];


Console.WriteLine("Items in table {1}" + table2Name);
foreach (var item2 in table2Results.Items)
{
PrintItem(item2);
}
// Any unprocessed keys? could happen if you exceed ProvisionedThroughput or some other
error.
Dictionary<string, KeysAndAttributes> unprocessedKeys = result.UnprocessedKeys;
foreach (KeyValuePair<string, KeysAndAttributes> pair in unprocessedKeys)
{
Console.WriteLine(pair.Key, pair.Value);
}

Especificacin de parmetros opcionales


Tambin puede usar el objeto BatchGetItemRequest para proporcionar parmetros opcionales,
como se muestra en el siguiente fragmento de cdigo C#. En los ejemplos de cdigo se recuperan dos
elementos de la tabla Forum. En l se especifica el parmetro opcional siguiente:

El parmetro ProjectionExpression para especificar los atributos que se van a recuperar.

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();

string table1Name = "Forum";

var request = new BatchGetItemRequest


{
RequestItems = new Dictionary<string, KeysAndAttributes>()
{
{ table1Name,
new KeysAndAttributes
{
Keys = new List<Dictionary<string, AttributeValue>>()
{
new Dictionary<string, AttributeValue>()
{
{ "Name", new AttributeValue { S = "DynamoDB" } }
},
new Dictionary<string, AttributeValue>()
{
{ "Name", new AttributeValue { S = "Amazon S3" } }
}
}

API Version 2012-08-10


412
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

},
// Optional - name of an attribute to retrieve.
ProjectionExpression = "Title"
}
}
};

var response = client.BatchGetItem(request);

Para obtener ms informacin, consulte BatchGetItem.

Ejemplo: Operaciones CRUD mediante el API de bajo nivel del


AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se ilustran las operaciones de creacin, lectura, actualizacin y
eliminacin (CRUD, Create, Read, Update and Delete) en un elemento. En el ejemplo se agrega un
elemento a la tabla ProductCatalog, se recupera, se llevan a cabo varias actualizaciones y, por ltimo,
se elimina. Si ha seguido los pasos de Creacin de tablas y carga de ejemplos de datos (p. 291), habr
creado ya la tabla ProductCatalog. 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.Model;
using Amazon.Runtime;
using Amazon.SecurityToken;

namespace com.amazonaws.codesamples
{
class LowLevelItemCRUDExample
{
private static string tableName = "ProductCatalog";
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();

static void Main(string[] args)


{
try
{
CreateItem();
RetrieveItem();

// Perform various updates.


UpdateMultipleAttributes();
UpdateExistingAttributeConditionally();

// Delete item.
DeleteItem();
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("To continue, press Enter");

API Version 2012-08-10


413
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

Console.ReadLine();
}
}

private static void CreateItem()


{
var request = new PutItemRequest
{
TableName = tableName,
Item = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
N = "1000"
}},
{ "Title", new AttributeValue {
S = "Book 201 Title"
}},
{ "ISBN", new AttributeValue {
S = "11-11-11-11"
}},
{ "Authors", new AttributeValue {
SS = new List<string>{"Author1", "Author2" }
}},
{ "Price", new AttributeValue {
N = "20.00"
}},
{ "Dimensions", new AttributeValue {
S = "8.5x11.0x.75"
}},
{ "InPublication", new AttributeValue {
BOOL = false
} }
}
};
client.PutItem(request);
}

private static void RetrieveItem()


{
var request = new GetItemRequest
{
TableName = tableName,
Key = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
N = "1000"
} }
},
ProjectionExpression = "Id, ISBN, Title, Authors",
ConsistentRead = true
};
var response = client.GetItem(request);

// Check the response.


var attributeList = response.Item; // attribute list in the response.
Console.WriteLine("\nPrinting item after retrieving it ............");
PrintItem(attributeList);
}

private static void UpdateMultipleAttributes()


{
var request = new UpdateItemRequest
{
Key = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {

API Version 2012-08-10


414
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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"
}}
},

UpdateExpression = "ADD #A :auth SET #NA = :new REMOVE #I",

TableName = tableName,
ReturnValues = "ALL_NEW" // Give me all attributes of the updated item.
};
var response = client.UpdateItem(request);

// Check the response.


var attributeList = response.Attributes; // attribute list in the response.
// print attributeList.
Console.WriteLine("\nPrinting item after multiple attribute
update ............");
PrintItem(attributeList);
}

private static void UpdateExistingAttributeConditionally()


{
var request = new UpdateItemRequest
{
Key = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
N = "1000"
} }
},
ExpressionAttributeNames = new Dictionary<string, string>()
{
{"#P", "Price"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":newprice",new AttributeValue {
N = "22.00"
}},
{":currprice",new AttributeValue {
N = "20.00"
}}
},
// This updates price only if current price is 20.00.
UpdateExpression = "SET #P = :newprice",
ConditionExpression = "#P = :currprice",

TableName = tableName,

API Version 2012-08-10


415
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

ReturnValues = "ALL_NEW" // Give me all attributes of the updated item.


};
var response = client.UpdateItem(request);

// Check the response.


var attributeList = response.Attributes; // attribute list in the response.
Console.WriteLine("\nPrinting item after updating price value
conditionally ............");
PrintItem(attributeList);
}

private static void DeleteItem()


{
var request = new DeleteItemRequest
{
TableName = tableName,
Key = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
N = "1000"
} }
},

// Return the entire item as it appeared before the update.


ReturnValues = "ALL_OLD",
ExpressionAttributeNames = new Dictionary<string, string>()
{
{"#IP", "InPublication"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":inpub",new AttributeValue {
BOOL = false
}}
},
ConditionExpression = "#IP = :inpub"
};

var response = client.DeleteItem(request);

// Check the response.


var attributeList = response.Attributes; // Attribute list in the response.
// Print item.
Console.WriteLine("\nPrinting item that was just deleted ............");
PrintItem(attributeList);
}

private static void PrintItem(Dictionary<string, AttributeValue> attributeList)


{
foreach (KeyValuePair<string, AttributeValue> kvp in attributeList)
{
string attributeName = kvp.Key;
AttributeValue value = kvp.Value;

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("************************************************");
}

API Version 2012-08-10


416
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

}
}

Ejemplo: Operaciones por lotes mediante el API de bajo nivel del


AWS SDK para .NET
Temas
Ejemplo: Operacin de escritura por lotes mediante el API de bajo nivel del AWS SDK
para .NET (p. 417)
Ejemplo: Operacin de obtencin por lotes mediante el API de bajo nivel del AWS SDK
para .NET (p. 420)

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:

Colocar un elemento en la tabla Forum


Colocar un elemento y eliminar un elemento de la tabla Thread.

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.

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 los pasos de Creacin de tablas y carga de ejemplos de
datos (p. 291), habr creado ya las tablas Forum y Thread. 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 LowLevelBatchWrite
{
private static string table1Name = "Forum";

API Version 2012-08-10


417
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

private static string table2Name = "Thread";


private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();

static void Main(string[] args)


{
try
{
TestBatchWrite();
}
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}

private static void TestBatchWrite()


{
var request = new BatchWriteItemRequest
{
ReturnConsumedCapacity = "TOTAL",
RequestItems = new Dictionary<string, List<WriteRequest>>
{
{
table1Name, new List<WriteRequest>
{
new WriteRequest
{
PutRequest = new PutRequest
{
Item = new Dictionary<string, AttributeValue>
{
{ "Name", new AttributeValue {
S = "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 = "S3 forum"
} },
{ "Subject", new AttributeValue {
S = "My sample question"
} },
{ "Message", new AttributeValue {
S = "Message Text."
} },
{ "KeywordTags", new AttributeValue {
SS = new List<string> { "S3", "Bucket" }
} }
}
}

API Version 2012-08-10


418
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

},
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);
}

private static void CallBatchWriteTillCompletion(BatchWriteItemRequest request)


{
BatchWriteItemResponse response;

int callCount = 0;
do
{
Console.WriteLine("Making request");
response = client.BatchWriteItem(request);
callCount++;

// Check the response.

var tableConsumedCapacities = response.ConsumedCapacity;


var unprocessed = response.UnprocessedItems;

Console.WriteLine("Per-table consumed capacity");


foreach (var tableConsumedCapacity in tableConsumedCapacities)
{
Console.WriteLine("{0} - {1}", tableConsumedCapacity.TableName,
tableConsumedCapacity.CapacityUnits);
}

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);

Console.WriteLine("Total # of batch write API calls made: {0}", callCount);


}
}
}

API Version 2012-08-10


419
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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();

static void Main(string[] args)


{
try
{
RetrieveMultipleItemsBatchGet();

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
}

private static void RetrieveMultipleItemsBatchGet()


{
var request = new BatchGetItemRequest
{
RequestItems = new Dictionary<string, KeysAndAttributes>()
{
{ table1Name,
new KeysAndAttributes
{
Keys = new List<Dictionary<string, AttributeValue> >()
{
new Dictionary<string, AttributeValue>()
{
{ "Name", new AttributeValue {

API Version 2012-08-10


420
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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);

// Check the response.


var responses = response.Responses; // Attribute list in the response.

foreach (var tableResponse in responses)


{
var tableResults = tableResponse.Value;
Console.WriteLine("Items retrieved from table {0}", tableResponse.Key);
foreach (var item1 in tableResults)
{
PrintItem(item1);

API Version 2012-08-10


421
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

}
}

// Any unprocessed keys? could happen if you exceed ProvisionedThroughput


or some other error.
Dictionary<string, KeysAndAttributes> unprocessedKeys =
response.UnprocessedKeys;
foreach (var unprocessedTableKeys in unprocessedKeys)
{
// Print table name.
Console.WriteLine(unprocessedTableKeys.Key);
// Print unprocessed primary keys.
foreach (var key in unprocessedTableKeys.Value.Keys)
{
PrintItem(key);
}
}

request.RequestItems = unprocessedKeys;
} while (response.UnprocessedKeys.Count > 0);
}

private static void PrintItem(Dictionary<string, AttributeValue> attributeList)


{
foreach (KeyValuePair<string, AttributeValue> kvp in attributeList)
{
string attributeName = kvp.Key;
AttributeValue value = kvp.Value;

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("************************************************");
}
}
}

Ejemplo: Control de atributos de tipo Binary mediante el API de


bajo nivel del AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se ilustra cmo se controlan los atributos de tipo Binary. Adems, se
agrega un elemento a la tabla Reply. El elemento incluye un atributo de tipo Binary (ExtendedMessage)
que almacena datos comprimidos. A continuacin, en el ejemplo se recupera el elemento y se
imprimen todos los valores de los atributos. Con fines ilustrativos, el ejemplo usa la clase GZipStream
para comprimir un ejemplo de secuencia y asignrsela al atributo ExtendedMessage; despus, la
descomprime al imprimir el valor del atributo.

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).

API Version 2012-08-10


422
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

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();

static void Main(string[] args)


{
// Reply table primary key.
string replyIdPartitionKey = "Amazon DynamoDB#DynamoDB Thread 1";
string replyDateTimeSortKey = Convert.ToString(DateTime.UtcNow);

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); }
}

private static void CreateItem(string partitionKey, string sortKey)


{
MemoryStream compressedMessage = ToGzipMemoryStream("Some long extended message
to compress.");
var request = new PutItemRequest
{
TableName = tableName,
Item = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
S = partitionKey
}},
{ "ReplyDateTime", new AttributeValue {
S = sortKey
}},
{ "Subject", new AttributeValue {
S = "Binary type "
}},
{ "Message", new AttributeValue {
S = "Some message about the binary type"
}},
{ "ExtendedMessage", new AttributeValue {
B = compressedMessage
}}
}
};
client.PutItem(request);
}

API Version 2012-08-10


423
Amazon DynamoDB Developer Guide
Uso de elementos: .NET

private static void RetrieveItem(string partitionKey, string sortKey)


{
var request = new GetItemRequest
{
TableName = tableName,
Key = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
S = partitionKey
} },
{ "ReplyDateTime", new AttributeValue {
S = sortKey
} }
},
ConsistentRead = true
};
var response = client.GetItem(request);

// Check the response.


var attributeList = response.Item; // attribute list in the response.
Console.WriteLine("\nPrinting item after retrieving it ............");

PrintItem(attributeList);
}

private static void DeleteItem(string partitionKey, string sortKey)


{
var request = new DeleteItemRequest
{
TableName = tableName,
Key = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
S = partitionKey
} },
{ "ReplyDateTime", new AttributeValue {
S = sortKey
} }
}
};
var response = client.DeleteItem(request);
}

private static void PrintItem(Dictionary<string, AttributeValue> attributeList)


{
foreach (KeyValuePair<string, AttributeValue> kvp in attributeList)
{
string attributeName = kvp.Key;
AttributeValue value = kvp.Value;

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("************************************************");
}

private static MemoryStream ToGzipMemoryStream(string value)

API Version 2012-08-10


424
Amazon DynamoDB Developer Guide
Uso de consultas

{
MemoryStream output = new MemoryStream();
using (GZipStream zipStream = new GZipStream(output, CompressionMode.Compress,
true))
using (StreamWriter writer = new StreamWriter(zipStream))
{
writer.Write(value);
}
return output;
}

private static string FromGzipMemoryStream(MemoryStream stream)


{
using (GZipStream zipStream = new GZipStream(stream,
CompressionMode.Decompress))
using (StreamReader reader = new StreamReader(zipStream))
{
return reader.ReadToEnd();
}
}
}
}

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.

Expresiones de condicin de clave


Para especificar los criterios de bsqueda, se utiliza una expresin de condicin de clave; se trata de
una cadena que determina los elementos que se van a leer en la tabla o el ndice. Debe especificar el
nombre y valor de la clave de particin como una condicin de igualdad. Si lo desea, puede proporcionar
una segunda condicin para la clave de ordenacin (en caso de incluirse). En la condicin de clave de
ordenacin se debe utilizar uno de los siguientes operadores de comparacin:

a = b: es true si el atributo a es igual al valor b.

API Version 2012-08-10


425
Amazon DynamoDB Developer Guide
Expresiones de condicin de clave

a < b: es true si a es menor que b.


a <= b: es true si a es menor o igual que b.
a > b: es true si a es mayor que b.
a >= b: es true si a es mayor o igual que b.
a BETWEEN b AND c: es true si a es mayor o igual que b y menor o igual que c.

Tambin se admite la siguiente funcin:

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.

aws dynamodb query \


--table-name Thread \
--key-condition-expression "ForumName = :name" \
--expression-attribute-values '{":name":{"S":"Amazon DynamoDB"}}'

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).

aws dynamodb query \


--table-name Thread \
--key-condition-expression "ForumName = :name and Subject = :sub" \
--expression-attribute-values file://values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":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.

aws dynamodb query \

API Version 2012-08-10


426
Amazon DynamoDB Developer Guide
Expresiones de filtro para Query

--table-name Reply \
--key-condition-expression "Id = :id and begins_with(ReplyDateTime, :dt)" \
--expression-attribute-values file://values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo 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.

Una operacin Query siempre devuelve un conjunto de resultados. Si no se encuentran elementos


coincidentes, el conjunto de resultados estar vaco.

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)).

Expresiones de filtro para Query


Si tiene que refinar ms los resultados de Query, si lo desea puede indicar una expresin de filtro. Una
expresin de filtro determina qu elementos de los resultados de Query se deben devolver al usuario.
Todos los dems resultados se descartan.

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).

API Version 2012-08-10


427
Amazon DynamoDB Developer Guide
Limitacin del nmero de elementos
del conjunto de resultados

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.

aws dynamodb query \


--table-name Thread \
--key-condition-expression "ForumName = :fn" \
--filter-expression "#v >= :num" \
--expression-attribute-names '{"#v": "Views"}' \
--expression-attribute-values file://values.json

Los argumentos de --expression-attribute-values se almacenan en el archivo values.json:

{
":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.

Limitacin del nmero de elementos del conjunto de


resultados
La operacin Query permite limitar el nmero de elementos que devuelve en el resultado. Para ello,
establezca el parmetro Limit en el nmero mximo de elementos que desee.

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.

Paginacin de los resultados


DynamoDB pagina los resultados de las operaciones Query. La paginacin permite dividir los resultados
de Query en "pginas" de datos con un tamao de 1 MB (o menos). Una aplicacin puede procesar la
primera pgina de resultados, luego la segunda pgina, y as sucesivamente.

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:

API Version 2012-08-10


428
Amazon DynamoDB Developer Guide
Paginacin de los resultados

1. Examinar el resultado de Query de bajo nivel:


Si el resultado contiene una entrada LastEvaluatedKey, vaya al paso2.
Si no figura LastEvaluatedKey en el resultado, no hay ms elementos que recuperar.
2. Crear una nueva solicitud Query con los mismos parmetros que la anterior, pero, esta vez, tomando el
valor LastEvaluatedKey del paso1 y usndolo como parmetro ExclusiveStartKey en la nueva
solicitud Query.
3. Ejecutar la nueva solicitud Query.
4. Ir al paso 1.

Es decir, el valor de LastEvaluatedKey de la respuesta de Query debe utilizarse como valor de


ExclusiveStartKey en la siguiente solicitud Query. Si no hay una entrada LastEvaluatedKey en
una respuesta de Query, significa que se ha recuperado la ltima pgina de resultados. La ausencia de
LastEvaluatedKey es la nica forma de saber que se ha alcanzado el final del conjunto de resultados.

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:

aws dynamodb query --table-name Movies \


--projection-expression "title" \
--key-condition-expression "#y = :yyyy" \
--expression-attribute-names '{"#y":"year"}' \
--expression-attribute-values '{":yyyy":{"N":"1989"}}' \
--page-size 5 \
--debug

Normalmente, la AWS CLI se encarga de la paginacin automticamente, pero, en este ejemplo, el


parmetro --page-size de la CLI limita el nmero de elementos por pgina. El parmetro --debug
muestra informacin de bajo nivel de las solicitudes y las respuestas.

Si ejecuta el ejemplo, la primera respuesta de DynamoDB ser similar a la siguiente:

2017-07-07 11:13:15,603 - MainThread - botocore.parsers - DEBUG - Response body:


b'{"Count":5,"Items":[{"title":{"S":"Always"}},{"title":{"S":"Back to the Future Part
II"}},
{"title":{"S":"Batman"}},{"title":{"S":"Bill & Ted\'s Excellent Adventure"}},{"title":
{"S":"Black Rain"}}],
"LastEvaluatedKey":{"year":{"N":"1989"},"title":{"S":"Black Rain"}},
"ScannedCount":5}

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:

2017-07-07 11:13:16,291 - MainThread - botocore.parsers - DEBUG - Response body:


b'{"Count":2,"Items":[{"title":{"S":"Uncle Buck"}},{"title":{"S":"Weekend at Bernie\'s"}}],
"ScannedCount":2}'

La ausencia de LastEvaluatedKey indica que no hay ms elementos que recuperar.


Note

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.

API Version 2012-08-10


429
Amazon DynamoDB Developer Guide
Recuento de los elementos de los resultados

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.

Recuento de los elementos de los resultados


Adems de los elementos que coinciden con los criterios, la respuesta de Query contiene las entradas
siguientes:

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 no se utiliza una expresin de filtro, ScannedCount y Count tendrn el mismo valor.

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.

Unidades de capacidad que Query consume


Puede consultar con Query cualquier tabla o ndice secundario, siempre y cuando tengan una clave
principal compuesta (una clave de particin y una clave de ordenacin). Las operaciones Query consumen
unidades de capacidad de lectura, como se indica a continuacin:

Si Query se aplica a... DynamoDB consume unidades de capacidad de


lectura de...

Tabla La capacidad de lectura provisionada de la tabla.

Global secondary index La capacidad de lectura provisionada del ndice.

ndice secundario local La capacidad de lectura provisionada de la tabla


base.

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:

NONE: no se devuelven datos de capacidad consumida. (Esta es la opcin predeterminada.)


TOTAL: la respuesta incluye el nmero total de unidades de capacidad de lectura consumidas.
INDEXES: la respuesta muestra el nmero total de unidades de capacidad de lectura consumidas, as
como la capacidad consumida de cada tabla e ndice a los que se ha obtenido acceso.

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

API Version 2012-08-10


430
Amazon DynamoDB Developer Guide
Consistencia de lectura de Query

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.

Consistencia de lectura de Query


De forma predeterminada, una operacin Query lleva a cabo lecturas consistentes finales. Esto significa
que los resultados de Query podran no reflejar los cambios provocados por operaciones PutItem
o UpdateItem realizadas recientemente. Para obtener ms informacin, consulte Consistencia de
lectura (p. 16).

Si requiere lecturas de consistencia alta, establezca el parmetro ConsistentRead en true en la solicitud


Query.

Consulta de tablas e ndices: Java


La operacin Query permite consultar una tabla o un ndice secundario. Debe proporcionar un valor de
clave de particin y una condicin de igualdad. Si la tabla o el ndice tienen una clave de ordenacin,
puede refinar los resultados proporcionando un valor de clave de ordenacin y una condicin.
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).

A continuacin se indican los pasos que hay que seguir para recuperar un elemento mediante el API de
documentos del AWS SDK for Java.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table para representar la tabla que desea usar.
3. Llame al mtodo query de la instancia de Table. Debe especificar el valor de clave de particin de los
elementos que desea recuperar, junto con los parmetros de consulta opcionales.

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).

Reply ( Id, ReplyDateTime, ... )

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

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()


.withRegion(Regions.US_WEST_2).build();
DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("Reply");

QuerySpec spec = new QuerySpec()

API Version 2012-08-10


431
Amazon DynamoDB Developer Guide
Consultas: Java

.withKeyConditionExpression("Id = :v_id")
.withValueMap(new ValueMap()
.withString(":v_id", "Amazon DynamoDB#DynamoDB Thread 1"));

ItemCollection<QueryOutcome> items = table.query(spec);

Iterator<Item> iterator = items.iterator();


Item item = null;
while (iterator.hasNext()) {
item = iterator.next();
System.out.println(item.toJSONPretty());
}

Especificacin de parmetros opcionales


El mtodo query admite varios parmetros opcionales. Por ejemplo, si lo desea puede especificar una
condicin para delimitar los resultados de la consulta anterior y que se devuelvan las respuestas de las
dos ltimas semanas. La condicin se denomina condicin de clave de ordenacin, ya que DynamoDB
evala la condicin de consulta que se ha especificado con respecto a la clave de ordenacin de la clave
principal. Puede especificar otros parmetros opcionales para recuperar solo una lista especfica de
atributos de los elementos presentes en el resultado de la consulta.

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:

Una expresin KeyConditionExpression para recuperar las respuestas de un foro de debate


concreto (clave de particin) y, dentro de ese conjunto de elementos, las respuestas que se han
publicado en los ltimos 15das (clave de ordenacin).
Una expresin FilterExpression para devolver solamente las respuestas de un usuario
determinado. El filtro se aplica despus de procesar la consulta, pero antes de devolver los resultados al
usuario.
Un mapa ValueMap para definir los valores reales de los marcadores de posicin de
KeyConditionExpression.
ConsistentRead establecido en true, para solicitar una lectura de consistencia alta.

En este fragmento se utiliza un objeto QuerySpec que proporciona acceso a todos los parmetros de
entrada de bajo nivel de Query.

Example

Table table = dynamoDB.getTable("Reply");

long twoWeeksAgoMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L);


Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String twoWeeksAgoStr = df.format(twoWeeksAgo);

QuerySpec spec = new QuerySpec()


.withKeyConditionExpression("Id = :v_id and ReplyDateTime > :v_reply_dt_tm")
.withFilterExpression("PostedBy = :v_posted_by")
.withValueMap(new ValueMap()
.withString(":v_id", "Amazon DynamoDB#DynamoDB Thread 1")
.withString(":v_reply_dt_tm", twoWeeksAgoStr)
.withString(":v_posted_by", "User B"))
.withConsistentRead(true);

ItemCollection<QueryOutcome> items = table.query(spec);

API Version 2012-08-10


432
Amazon DynamoDB Developer Guide
Consultas: Java

Iterator<Item> iterator = items.iterator();


while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}

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.

En el siguiente fragmento de cdigo Java se modifica la especificacin de consulta mostrada


anteriormente. Esta vez, la especificacin de consulta utiliza el mtodo withMaxPageSize. La clase Page
proporciona un iterador que permite que el cdigo procese los elementos de cada pgina.

Example

spec.withMaxPageSize(10);

ItemCollection<QueryOutcome> items = table.query(spec);

// Process each page of results


int pageNum = 0;
for (Page<Item, QueryOutcome> page : items.pages()) {

System.out.println("\nPage: " + ++pageNum);

// Process each item on the current page


Iterator<Item> item = page.iterator();
while (item.hasNext()) {
System.out.println(item.next().toJSONPretty());
}
}

Ejemplo: Consulta mediante Java


En las siguientes tablas se almacena informacin sobre una coleccin de foros. Para obtener ms
informacin, consulte Creacin de tablas y carga de ejemplos de datos (p. 291).
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).

Example

Forum ( Name, ... )


Thread ( ForumName, Subject, Message, LastPostedBy, LastPostDateTime, ...)
Reply ( Id, ReplyDateTime, Message, PostedBy, ...)

En este ejemplo de cdigo Java, puede ejecutar variaciones de bsqueda de respuestas para la
conversacin "DynamoDB Thread 1" del foro "DynamoDB".

Buscar las respuestas a una conversacin.


Buscar las respuestas a una conversacin, especificando un lmite para el nmero de elementos que
contendr cada pgina de resultados. Si el nmero de elementos del conjunto de resultados supera el
tamao de pgina, se obtiene nicamente la primera pgina de resultados. Este patrn de codificacin
garantiza que el cdigo procese todas las pginas del resultado de la consulta.

API Version 2012-08-10


433
Amazon DynamoDB Developer Guide
Consultas: Java

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.

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).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPIQuery {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

static String tableName = "Reply";

public static void main(String[] args) throws Exception {

String forumName = "Amazon DynamoDB";


String threadSubject = "DynamoDB Thread 1";

findRepliesForAThread(forumName, threadSubject);
findRepliesForAThreadSpecifyOptionalLimit(forumName, threadSubject);
findRepliesInLast15DaysWithConfig(forumName, threadSubject);
findRepliesPostedWithinTimePeriod(forumName, threadSubject);
findRepliesUsingAFilterExpression(forumName, threadSubject);
}

private static void findRepliesForAThread(String forumName, String threadSubject) {

Table table = dynamoDB.getTable(tableName);

String replyId = forumName + "#" + threadSubject;

QuerySpec spec = new QuerySpec().withKeyConditionExpression("Id = :v_id")


.withValueMap(new ValueMap().withString(":v_id", replyId));

ItemCollection<QueryOutcome> items = table.query(spec);

API Version 2012-08-10


434
Amazon DynamoDB Developer Guide
Consultas: Java

System.out.println("\nfindRepliesForAThread results:");

Iterator<Item> iterator = items.iterator();


while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}

private static void findRepliesForAThreadSpecifyOptionalLimit(String forumName, String


threadSubject) {

Table table = dynamoDB.getTable(tableName);

String replyId = forumName + "#" + threadSubject;

QuerySpec spec = new QuerySpec().withKeyConditionExpression("Id = :v_id")


.withValueMap(new ValueMap().withString(":v_id", replyId)).withMaxPageSize(1);

ItemCollection<QueryOutcome> items = table.query(spec);

System.out.println("\nfindRepliesForAThreadSpecifyOptionalLimit results:");

// Process each page of results


int pageNum = 0;
for (Page<Item, QueryOutcome> page : items.pages()) {

System.out.println("\nPage: " + ++pageNum);

// Process each item on the current page


Iterator<Item> item = page.iterator();
while (item.hasNext()) {
System.out.println(item.next().toJSONPretty());
}
}
}

private static void findRepliesInLast15DaysWithConfig(String forumName, String


threadSubject) {

Table table = dynamoDB.getTable(tableName);

long twoWeeksAgoMilli = (new Date()).getTime() - (15L * 24L * 60L * 60L * 1000L);


Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String twoWeeksAgoStr = df.format(twoWeeksAgo);

String replyId = forumName + "#" + threadSubject;

QuerySpec spec = new QuerySpec().withProjectionExpression("Message, ReplyDateTime,


PostedBy")
.withKeyConditionExpression("Id = :v_id and ReplyDateTime <= :v_reply_dt_tm")
.withValueMap(new ValueMap().withString(":v_id",
replyId).withString(":v_reply_dt_tm", twoWeeksAgoStr));

ItemCollection<QueryOutcome> items = table.query(spec);

System.out.println("\nfindRepliesInLast15DaysWithConfig results:");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}

API Version 2012-08-10


435
Amazon DynamoDB Developer Guide
Consultas: .NET

private static void findRepliesPostedWithinTimePeriod(String forumName, String


threadSubject) {

Table table = dynamoDB.getTable(tableName);

long startDateMilli = (new Date()).getTime() - (15L * 24L * 60L * 60L * 1000L);


long endDateMilli = (new Date()).getTime() - (5L * 24L * 60L * 60L * 1000L);
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-
dd'T'HH:mm:ss.SSS'Z'");
String startDate = df.format(startDateMilli);
String endDate = df.format(endDateMilli);

String replyId = forumName + "#" + threadSubject;

QuerySpec spec = new QuerySpec().withProjectionExpression("Message, ReplyDateTime,


PostedBy")
.withKeyConditionExpression("Id = :v_id and ReplyDateTime between :v_start_dt
and :v_end_dt")
.withValueMap(new ValueMap().withString(":v_id",
replyId).withString(":v_start_dt", startDate)
.withString(":v_end_dt", endDate));

ItemCollection<QueryOutcome> items = table.query(spec);

System.out.println("\nfindRepliesPostedWithinTimePeriod results:");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}

private static void findRepliesUsingAFilterExpression(String forumName, String


threadSubject) {

Table table = dynamoDB.getTable(tableName);

String replyId = forumName + "#" + threadSubject;

QuerySpec spec = new QuerySpec().withProjectionExpression("Message, ReplyDateTime,


PostedBy")
.withKeyConditionExpression("Id = :v_id").withFilterExpression("PostedBy
= :v_postedby")
.withValueMap(new ValueMap().withString(":v_id",
replyId).withString(":v_postedby", "User B"));

ItemCollection<QueryOutcome> items = table.query(spec);

System.out.println("\nfindRepliesUsingAFilterExpression results:");
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}

Consulta de tablas e ndices: .NET


La operacin Query permite consultar una tabla o un ndice secundario. Debe proporcionar un valor de
clave de particin y una condicin de igualdad. Si la tabla o el ndice tienen una clave de ordenacin,
puede refinar los resultados proporcionando un valor de clave de ordenacin y una condicin.

API Version 2012-08-10


436
Amazon DynamoDB Developer Guide
Consultas: .NET

A continuacin se indican los pasos que hay que seguir para consultar una tabla mediante el API de bajo
nivel del SDK para .NET.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase QueryRequest y proporcione los parmetros de la operacin de
consulta.
3. Ejecute el mtodo Query y proporcione el objeto QueryRequest que cre en el paso anterior.

La respuesta incluye el objeto QueryResult que proporciona todos los elementos devueltos por la
consulta.

En el siguiente fragmento de cdigo C# 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).

Example

Reply ( <emphasis role="underline">Id</emphasis>, <emphasis


role="underline">ReplyDateTime</emphasis>, ... )

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

AmazonDynamoDBClient client = new AmazonDynamoDBClient();

var request = new QueryRequest


{
TableName = "Reply",
KeyConditionExpression = "Id = :v_Id",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_Id", new AttributeValue { S = "Amazon DynamoDB#DynamoDB Thread 1" }}}
};

var response = client.Query(request);

foreach (Dictionary<string, AttributeValue> item in response.Items)


{
// Process the result.
PrintItem(item);
}

Especificacin de parmetros opcionales


El mtodo Query admite varios parmetros opcionales. Por ejemplo, si lo desea puede especificar una
condicin para delimitar el resultado de la consulta anterior y que se devuelvan las respuestas de las
dos ltimas semanas. La condicin se denomina condicin de clave de ordenacin, ya que Amazon
DynamoDB evala la condicin de consulta que se ha especificado con respecto a la clave de ordenacin
de la clave principal. Puede especificar otros parmetros opcionales para recuperar solo una lista
especfica de atributos de los elementos presentes en el resultado de la consulta. Para obtener ms
informacin, consulte Query.

En el siguiente fragmento de cdigo C# se recuperan las respuestas de las conversaciones de un foro


publicadas en los ltimos 15das. En el fragmento se especifican los parmetros opcionales siguientes:

API Version 2012-08-10


437
Amazon DynamoDB Developer Guide
Consultas: .NET

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

DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);


string twoWeeksAgoString = twoWeeksAgoDate.ToString(AWSSDKUtils.ISO8601DateFormat);

var request = new QueryRequest


{
TableName = "Reply",
KeyConditionExpression = "Id = :v_Id and ReplyDateTime > :v_twoWeeksAgo",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_Id", new AttributeValue { S = "Amazon DynamoDB#DynamoDB Thread 2" }},
{":v_twoWeeksAgo", new AttributeValue { S = twoWeeksAgoString }}
},
ProjectionExpression = "Subject, ReplyDateTime, PostedBy",
ConsistentRead = true
};

var response = client.Query(request);

foreach (Dictionary<string, AttributeValue> item in response.Items)


{
// Process the result.
PrintItem(item);
}

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.

En el siguiente fragmento de cdigo C# se consulta la tabla Reply. En la solicitud, se especifican los


parmetros opcionales Limit y ExclusiveStartKey. El bucle do/while contina examinando una
pgina cada vez hasta que LastEvaluatedKey devuelve el valor null.

Example

Dictionary<string,AttributeValue> lastKeyEvaluated = null;

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.

API Version 2012-08-10


438
Amazon DynamoDB Developer Guide
Consultas: .NET

Limit = 1,
ExclusiveStartKey = lastKeyEvaluated
};

var response = client.Query(request);

// Process the query result.


foreach (Dictionary<string, AttributeValue> item in response.Items)
{
PrintItem(item);
}

lastKeyEvaluated = response.LastEvaluatedKey;

} while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);

Ejemplo: Consulta mediante el AWS SDK para .NET


En las siguientes tablas se almacena informacin sobre una coleccin de foros. Para obtener ms
informacin, consulte Creacin de tablas y carga de ejemplos de datos (p. 291).

Example

Forum ( <emphasis role="underline">Name</emphasis>, ... )


Thread ( <emphasis role="underline">ForumName</emphasis>, <emphasis
role="underline">Subject</emphasis>, Message, LastPostedBy, LastPostDateTime, ...)
Reply ( <emphasis role="underline">Id</emphasis>, <emphasis
role="underline">ReplyDateTime</emphasis>, Message, PostedBy, ...)

En este ejemplo de cdigo C#, puede ejecutar variaciones de la bsqueda de respuestas para la
conversacin "DynamoDB Thread 1" del foro "DynamoDB".

Buscar las respuestas a una conversacin.


Buscar las respuestas a una conversacin. Especificar el parmetro Limit de la consulta para establecer
el tamao de la pgina.

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

API Version 2012-08-10


439
Amazon DynamoDB Developer Guide
Consultas: .NET

{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();

static void Main(string[] args)


{
try
{
// Query a specific forum and thread.
string forumName = "Amazon DynamoDB";
string threadSubject = "DynamoDB Thread 1";

FindRepliesForAThread(forumName, threadSubject);
FindRepliesForAThreadSpecifyOptionalLimit(forumName, threadSubject);
FindRepliesInLast15DaysWithConfig(forumName, threadSubject);
FindRepliesPostedWithinTimePeriod(forumName, threadSubject);

Console.WriteLine("Example complete. To continue, press Enter");


Console.ReadLine();
}
catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message);
Console.ReadLine(); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message);
Console.ReadLine(); }
catch (Exception e) { Console.WriteLine(e.Message); Console.ReadLine(); }
}

private static void FindRepliesPostedWithinTimePeriod(string forumName, string


threadSubject)
{
Console.WriteLine("*** Executing FindRepliesPostedWithinTimePeriod() ***");
string replyId = forumName + "#" + threadSubject;
// You must provide date value based on your test data.
DateTime startDate = DateTime.UtcNow - TimeSpan.FromDays(21);
string start = startDate.ToString(AWSSDKUtils.ISO8601DateFormat);

// You provide date value based on your test data.


DateTime endDate = DateTime.UtcNow - TimeSpan.FromDays(5);
string end = endDate.ToString(AWSSDKUtils.ISO8601DateFormat);

var request = new QueryRequest


{
TableName = "Reply",
ReturnConsumedCapacity = "TOTAL",
KeyConditionExpression = "Id = :v_replyId and ReplyDateTime
between :v_start and :v_end",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_replyId", new AttributeValue {
S = replyId
}},
{":v_start", new AttributeValue {
S = start
}},
{":v_end", new AttributeValue {
S = end
}}
}
};

var response = client.Query(request);

Console.WriteLine("\nNo. of reads used (by query in


FindRepliesPostedWithinTimePeriod) {0}",
response.ConsumedCapacity.CapacityUnits);
foreach (Dictionary<string, AttributeValue> item
in response.Items)
{

API Version 2012-08-10


440
Amazon DynamoDB Developer Guide
Consultas: .NET

PrintItem(item);
}
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}

private static void FindRepliesInLast15DaysWithConfig(string forumName, string


threadSubject)
{
Console.WriteLine("*** Executing FindRepliesInLast15DaysWithConfig() ***");
string replyId = forumName + "#" + threadSubject;

DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15);


string twoWeeksAgoString =
twoWeeksAgoDate.ToString(AWSSDKUtils.ISO8601DateFormat);

var request = new QueryRequest


{
TableName = "Reply",
ReturnConsumedCapacity = "TOTAL",
KeyConditionExpression = "Id = :v_replyId and ReplyDateTime > :v_interval",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_replyId", new AttributeValue {
S = replyId
}},
{":v_interval", new AttributeValue {
S = twoWeeksAgoString
}}
},

// Optional parameter.
ProjectionExpression = "Id, ReplyDateTime, PostedBy",
// Optional parameter.
ConsistentRead = true
};

var response = client.Query(request);

Console.WriteLine("No. of reads used (by query in


FindRepliesInLast15DaysWithConfig) {0}",
response.ConsumedCapacity.CapacityUnits);
foreach (Dictionary<string, AttributeValue> item
in response.Items)
{
PrintItem(item);
}
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}

private static void FindRepliesForAThreadSpecifyOptionalLimit(string forumName,


string threadSubject)
{
Console.WriteLine("*** Executing FindRepliesForAThreadSpecifyOptionalLimit()
***");
string replyId = forumName + "#" + threadSubject;

Dictionary<string, AttributeValue> lastKeyEvaluated = null;


do
{
var request = new QueryRequest
{
TableName = "Reply",
ReturnConsumedCapacity = "TOTAL",
KeyConditionExpression = "Id = :v_replyId",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {

API Version 2012-08-10


441
Amazon DynamoDB Developer Guide
Consultas: .NET

{":v_replyId", new AttributeValue {


S = replyId
}}
},
Limit = 2, // The Reply table has only a few sample items. So the page
size is smaller.
ExclusiveStartKey = lastKeyEvaluated
};

var response = client.Query(request);

Console.WriteLine("No. of reads used (by query in


FindRepliesForAThreadSpecifyLimit) {0}\n",
response.ConsumedCapacity.CapacityUnits);
foreach (Dictionary<string, AttributeValue> item
in response.Items)
{
PrintItem(item);
}
lastKeyEvaluated = response.LastEvaluatedKey;
} while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);

Console.WriteLine("To continue, press Enter");

Console.ReadLine();
}

private static void FindRepliesForAThread(string forumName, string threadSubject)


{
Console.WriteLine("*** Executing FindRepliesForAThread() ***");
string replyId = forumName + "#" + threadSubject;

var request = new QueryRequest


{
TableName = "Reply",
ReturnConsumedCapacity = "TOTAL",
KeyConditionExpression = "Id = :v_replyId",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":v_replyId", new AttributeValue {
S = replyId
}}
}
};

var response = client.Query(request);


Console.WriteLine("No. of reads used (by query in FindRepliesForAThread)
{0}\n",
response.ConsumedCapacity.CapacityUnits);
foreach (Dictionary<string, AttributeValue> item in response.Items)
{
PrintItem(item);
}
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}

private static void PrintItem(


Dictionary<string, AttributeValue> attributeList)
{
foreach (KeyValuePair<string, AttributeValue> kvp in attributeList)
{
string attributeName = kvp.Key;
AttributeValue value = kvp.Value;

Console.WriteLine(

API Version 2012-08-10


442
Amazon DynamoDB Developer Guide
Uso de operaciones de examen

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("************************************************");
}
}
}

Uso de operaciones de examen


Temas
Expresiones de filtro para Scan (p. 443)
Limitacin del nmero de elementos del conjunto de resultados (p. 444)
Paginacin de los resultados (p. 444)
Recuento de los elementos de los resultados (p. 445)
Unidades de capacidad que Scan consume (p. 446)
Consistencia de lectura de Scan (p. 446)
Examen en paralelo (p. 447)
Examen de tablas e ndices: Java (p. 448)
Examen de tablas e ndices: .NET (p. 456)

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.

Scan siempre devuelve un conjunto de resultados. Si no se encuentran elementos coincidentes, el


conjunto de resultados estar vaco.

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.

Expresiones de filtro para Scan


Si tiene que refinar ms los resultados de Scan, si lo desea puede indicar una expresin de filtro. Una
expresin de filtro determina qu elementos de los resultados de Scan se deben devolver al usuario.
Todos los dems resultados se descartan.

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.

API Version 2012-08-10


443
Amazon DynamoDB Developer Guide
Limitacin del nmero de elementos
del conjunto de resultados

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.

aws dynamodb scan \


--table-name Thread \
--filter-expression "LastPostedBy = :name" \
--expression-attribute-values '{":name":{"S":"User A"}}'

Limitacin del nmero de elementos del conjunto de


resultados
La operacin Scan permite limitar el nmero de elementos que devuelve en el resultado. Para ello,
establezca el parmetro Limit en el nmero mximo de elementos que desee.

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.

Paginacin de los resultados


DynamoDB pagina los resultados de las operaciones Scan. La paginacin permite dividir los resultados de
Scan en "pginas" de datos con un tamao de 1 MB (o menos). Una aplicacin puede procesar la primera
pgina de resultados, luego la segunda pgina, y as sucesivamente.

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:

1. Examinar el resultado de Scan de bajo nivel:


Si el resultado contiene una entrada LastEvaluatedKey, vaya al paso2.
Si no figura LastEvaluatedKey en el resultado, no hay ms elementos que recuperar.
2. Crear una nueva solicitud Scan con los mismos parmetros que la anterior, pero, esta vez, tomando el
valor LastEvaluatedKey del paso1 y usndolo como parmetro ExclusiveStartKey en la nueva
solicitud Scan.
3. Ejecutar la nueva solicitud Scan.
4. Ir al paso 1.

Es decir, el valor de LastEvaluatedKey de la respuesta de Scan debe utilizarse como valor de


ExclusiveStartKey en la siguiente solicitud Scan. Si no hay una entrada LastEvaluatedKey en
una respuesta de Scan, significa que se ha recuperado la ltima pgina de resultados. La ausencia de
LastEvaluatedKey es la nica forma de saber que se ha alcanzado el final del conjunto de resultados.

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.

API Version 2012-08-10


444
Amazon DynamoDB Developer Guide
Recuento de los elementos de 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:

aws dynamodb scan \


--table-name Movies \
--projection-expression "title" \
--filter-expression 'contains(info.genres,:gen)' \
--expression-attribute-values '{":gen":{"S":"Sci-Fi"}}' \
--page-size 100 \
--debug

Normalmente, la AWS CLI se encarga de la paginacin automticamente, pero, en este ejemplo, el


parmetro --page-size de la CLI limita el nmero de elementos por pgina. El parmetro --debug
muestra informacin de bajo nivel de las solicitudes y las respuestas.

Si ejecuta el ejemplo, la primera respuesta de DynamoDB ser similar a la siguiente:

2017-07-07 12:19:14,389 - MainThread - botocore.parsers - DEBUG - Response body:


b'{"Count":7,"Items":[{"title":{"S":"Monster on the Campus"}},{"title":{"S":"+1"}},
{"title":{"S":"100 Degrees Below Zero"}},{"title":{"S":"About Time"}},{"title":{"S":"After
Earth"}},
{"title":{"S":"Age of Dinosaurs"}},{"title":{"S":"Cloudy with a Chance of Meatballs 2"}}],
"LastEvaluatedKey":{"year":{"N":"2013"},"title":{"S":"Curse of
Chucky"}},"ScannedCount":100}'

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:

2017-07-07 12:19:17,830 - MainThread - botocore.parsers - DEBUG - Response body:


b'{"Count":1,"Items":[{"title":{"S":"WarGames"}}],"ScannedCount":6}'

La ausencia de LastEvaluatedKey indica que no hay ms elementos que recuperar.


Note

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.

Recuento de los elementos de los resultados


Adems de los elementos que coinciden con los criterios, la respuesta de Scan contiene las entradas
siguientes:

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 no se utiliza una expresin de filtro, ScannedCount y Count tendrn el mismo valor.

API Version 2012-08-10


445
Amazon DynamoDB Developer Guide
Unidades de capacidad que Scan consume

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.

Unidades de capacidad que Scan consume


Puede utilizar la operacin Scan para examinar cualquier tabla o ndice secundario. Las operaciones Scan
consumen unidades de capacidad de lectura, como se indica a continuacin:

Si Scan se aplica a... DynamoDB consume unidades de capacidad de


lectura de...

Tabla La capacidad de lectura provisionada de la tabla.

Global secondary index La capacidad de lectura provisionada del ndice.

ndice secundario local La capacidad de lectura provisionada de la tabla


base.

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:

NONE: no se devuelven datos de capacidad consumida. (Esta es la opcin predeterminada.)


TOTAL: la respuesta incluye el nmero total de unidades de capacidad de lectura consumidas.
INDEXES: la respuesta muestra el nmero total de unidades de capacidad de lectura consumidas, as
como la capacidad consumida de cada tabla e ndice a los que se ha obtenido acceso.

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.

Consistencia de lectura de Scan


De forma predeterminada, una operacin Scan lleva a cabo lecturas consistentes finales. Esto significa
que los resultados de Scan podran no reflejar los cambios provocados por operaciones PutItem
o UpdateItem realizadas recientemente. Para obtener ms informacin, consulte Consistencia de
lectura (p. 16).

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

API Version 2012-08-10


446
Amazon DynamoDB Developer Guide
Examen en paralelo

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:

API Version 2012-08-10


447
Amazon DynamoDB Developer Guide
Examen: Java

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.

Examen de tablas e ndices: Java


La operacin Scan lee todos los elementos de una tabla o un ndice.

API Version 2012-08-10


448
Amazon DynamoDB Developer Guide
Examen: Java

A continuacin se indican los pasos que hay que seguir para examinar una tabla con el API de documentos
del AWS SDK for Java.

1. Cree una instancia de la clase AmazonDynamoDB.


2. Cree una instancia de la clase ScanRequest y proporcione el parmetro de examen.

El nico parmetro obligatorio es el nombre de la tabla.


3. Ejecute el mtodo scan y proporcione el objeto ScanRequest que cre en el paso anterior.

En la siguiente tabla Reply se almacenan las respuestas de las conversaciones del foro.

Example

Reply ( Id, ReplyDateTime, Message, PostedBy )

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

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

ScanRequest scanRequest = new ScanRequest()


.withTableName("Reply");

ScanResult result = client.scan(scanRequest);


for (Map<String, AttributeValue> item : result.getItems()){
printItem(item);
}

Especificacin de parmetros opcionales


El mtodo scan admite varios parmetros opcionales. Por ejemplo, si lo desea puede utilizar una
expresin de filtro para filtrar el resultado del examen. En una expresin de filtro, puede especificar una
condicin, as como los nombres y valores de atributos respecto a los que debe evaluarse esa condicin.
Para obtener ms informacin, consulte Scan.

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

Map<String, AttributeValue> expressionAttributeValues =


new HashMap<String, AttributeValue>();
expressionAttributeValues.put(":val", new AttributeValue().withN("0"));

ScanRequest scanRequest = new ScanRequest()


.withTableName("ProductCatalog")

API Version 2012-08-10


449
Amazon DynamoDB Developer Guide
Examen: Java

.withFilterExpression("Price < :val")


.withProjectionExpression("Id")
.withExpressionAttributeValues(expressionAttributeValues);

ScanResult result = client.scan(scanRequest);


for (Map<String, AttributeValue> item : result.getItems()) {
printItem(item);
}

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.

En el siguiente fragmento de cdigo Java se examina la tabla ProductCatalog. En la solicitud, se utilizan


los mtodos withLimit y withExclusiveStartKey. El bucle do/while contina examinando una
pgina cada vez hasta que el mtodo getLastEvaluatedKey del resultado devuelve el valor null.

Example

Map<String, AttributeValue> lastKeyEvaluated = null;


do {
ScanRequest scanRequest = new ScanRequest()
.withTableName("ProductCatalog")
.withLimit(10)
.withExclusiveStartKey(lastKeyEvaluated);

ScanResult result = client.scan(scanRequest);


for (Map<String, AttributeValue> item : result.getItems()){
printItem(item);
}
lastKeyEvaluated = result.getLastEvaluatedKey();
} while (lastKeyEvaluated != null);

Ejemplo: Examen mediante Java


En el siguiente ejemplo de cdigo Java se utiliza una muestra de trabajo que examina la tabla
ProductCatalog para buscar los elementos cuyo precio es menor que 100.
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).
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).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.

API Version 2012-08-10


450
Amazon DynamoDB Developer Guide
Examen: Java

// Licensed under the Apache License, Version 2.0.


package com.amazonaws.codesamples.document;

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;

public class DocumentAPIScan {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);
static String tableName = "ProductCatalog";

public static void main(String[] args) throws Exception {

findProductsForPriceLessThanZero();
}

private static void findProductsForPriceLessThanZero() {

Table table = dynamoDB.getTable(tableName);

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();


expressionAttributeValues.put(":pr", 100);

ItemCollection<ScanOutcome> items = table.scan("Price < :pr", // FilterExpression


"Id, Title, ProductCategory, Price", // ProjectionExpression
null, // ExpressionAttributeNames - not used in this example
expressionAttributeValues);

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());
}
}

Ejemplo: Examen en paralelo mediante Java


En el siguiente ejemplo de cdigo Java se muestra un examen en paralelo. El programa elimina y vuelve
a crear una tabla denominada ParallelScanTest; a continuacin, carga datos en ella. Una vez finalizada
la carga de datos, el programa crea varios subprocesos y emite solicitudes Scan en paralelo. El programa
imprime estadsticas en tiempo de ejecucin de cada solicitud en paralelo.
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).

API Version 2012-08-10


451
Amazon DynamoDB Developer Guide
Examen: Java

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).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPIParallelScan {

// total number of sample items


static int scanItemCount = 300;

// number of items each scan request should return


static int scanItemLimit = 10;

// number of logical segments for parallel scan


static int parallelScanThreads = 16;

// table that will be used for scanning


static String parallelScanTestTableName = "ParallelScanTest";

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

public static void main(String[] args) throws Exception {


try {

// Clean up the table


deleteTable(parallelScanTestTableName);
createTable(parallelScanTestTableName, 10L, 5L, "Id", "N");

// Upload sample data for scan


uploadSampleProducts(parallelScanTestTableName, scanItemCount);

// Scan the table using multiple threads


parallelScan(parallelScanTestTableName, scanItemLimit, parallelScanThreads);

API Version 2012-08-10


452
Amazon DynamoDB Developer Guide
Examen: Java

}
catch (AmazonServiceException ase) {
System.err.println(ase.getMessage());
}
}

private static void parallelScan(String tableName, int itemLimit, int numberOfThreads)


{
System.out.println(
"Scanning " + tableName + " using " + numberOfThreads + " threads " + itemLimit
+ " items at a time");
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

// Divide DynamoDB table into logical segments


// Create one task for scanning each segment
// Each thread will be scanning one segment
int totalSegments = numberOfThreads;
for (int segment = 0; segment < totalSegments; segment++) {
// Runnable task that will only scan one segment
ScanSegmentTask task = new ScanSegmentTask(tableName, itemLimit, totalSegments,
segment);

// Execute the task


executor.execute(task);
}

shutDownExecutorService(executor);
}

// Runnable task for scanning a single segment of a DynamoDB table


private static class ScanSegmentTask implements Runnable {

// DynamoDB table to scan


private String tableName;

// number of items each scan request should return


private int itemLimit;

// Total number of segments


// Equals to total number of threads scanning the table in parallel
private int totalSegments;

// Segment that will be scanned with by this task


private int segment;

public ScanSegmentTask(String tableName, int itemLimit, int totalSegments, int


segment) {
this.tableName = tableName;
this.itemLimit = itemLimit;
this.totalSegments = totalSegments;
this.segment = segment;
}

@Override
public void run() {
System.out.println("Scanning " + tableName + " segment " + segment + " out of "
+ totalSegments
+ " segments " + itemLimit + " items at a time...");
int totalScannedItemCount = 0;

Table table = dynamoDB.getTable(tableName);

try {
ScanSpec spec = new
ScanSpec().withMaxResultSize(itemLimit).withTotalSegments(totalSegments)
.withSegment(segment);

API Version 2012-08-10


453
Amazon DynamoDB Developer Guide
Examen: Java

ItemCollection<ScanOutcome> items = table.scan(spec);


Iterator<Item> iterator = items.iterator();

Item currentItem = null;


while (iterator.hasNext()) {
totalScannedItemCount++;
currentItem = iterator.next();
System.out.println(currentItem.toString());
}

}
catch (Exception e) {
System.err.println(e.getMessage());
}
finally {
System.out.println("Scanned " + totalScannedItemCount + " items from
segment " + segment + " out of "
+ totalSegments + " of " + tableName);
}
}
}

private static void uploadSampleProducts(String tableName, int itemCount) {


System.out.println("Adding " + itemCount + " sample items to " + tableName);
for (int productIndex = 0; productIndex < itemCount; productIndex++) {
uploadProduct(tableName, productIndex);
}
}

private static void uploadProduct(String tableName, int productIndex) {

Table table = dynamoDB.getTable(tableName);

try {
System.out.println("Processing record #" + productIndex);

Item item = new Item().withPrimaryKey("Id", productIndex)


.withString("Title", "Book " + productIndex + " Title").withString("ISBN",
"111-1111111111")
.withStringSet("Authors", new
HashSet<String>(Arrays.asList("Author1"))).withNumber("Price", 2)
.withString("Dimensions", "8.5 x 11.0 x 0.5").withNumber("PageCount", 500)
.withBoolean("InPublication", true).withString("ProductCategory", "Book");
table.putItem(item);

}
catch (Exception e) {
System.err.println("Failed to create item " + productIndex + " in " +
tableName);
System.err.println(e.getMessage());
}
}

private static void deleteTable(String tableName) {


try {

Table table = dynamoDB.getTable(tableName);


table.delete();
System.out.println("Waiting for " + tableName + " to be deleted...this may take
a while...");
table.waitForDelete();

}
catch (Exception e) {
System.err.println("Failed to delete table " + tableName);

API Version 2012-08-10


454
Amazon DynamoDB Developer Guide
Examen: Java

e.printStackTrace(System.err);
}
}

private static void createTable(String tableName, long readCapacityUnits, long


writeCapacityUnits,
String partitionKeyName, String partitionKeyType) {

createTable(tableName, readCapacityUnits, writeCapacityUnits, partitionKeyName,


partitionKeyType, null, null);
}

private static void createTable(String tableName, long readCapacityUnits, long


writeCapacityUnits,
String partitionKeyName, String partitionKeyType, String sortKeyName, String
sortKeyType) {

try {
System.out.println("Creating table " + tableName);

List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new
KeySchemaElement().withAttributeName(partitionKeyName).withKeyType(KeyType.HASH)); //
Partition

// key

List<AttributeDefinition> attributeDefinitions = new


ArrayList<AttributeDefinition>();
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName(partitionKeyName).withAttributeType(partitionKeyType));

if (sortKeyName != null) {
keySchema.add(new
KeySchemaElement().withAttributeName(sortKeyName).withKeyType(KeyType.RANGE)); // Sort

// key
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName(sortKeyName).withAttributeType(sortKeyType));
}

Table table = dynamoDB.createTable(tableName, keySchema, attributeDefinitions,


new ProvisionedThroughput()

.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);
}
}

private static void shutDownExecutorService(ExecutorService executor) {


executor.shutdown();
try {
if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
}
catch (InterruptedException e) {

API Version 2012-08-10


455
Amazon DynamoDB Developer Guide
Examen: .NET

executor.shutdownNow();

// Preserve interrupt status


Thread.currentThread().interrupt();
}
}
}

Examen de tablas e ndices: .NET


La operacin Scan lee todos los elementos de una tabla o un ndice.

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase ScanRequest y proporcione los parmetros de la operacin de examen.

El nico parmetro obligatorio es el nombre de la tabla.


3. Ejecute el mtodo Scan y proporcione el objeto QueryRequest que cre en el paso anterior.

En la siguiente tabla Reply se almacenan las respuestas de las conversaciones del foro.

Example

>Reply ( <emphasis role="underline">Id</emphasis>, <emphasis


role="underline">ReplyDateTime</emphasis>, Message, PostedBy )

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

AmazonDynamoDBClient client = new AmazonDynamoDBClient();

var request = new ScanRequest


{
TableName = "Reply",
};

var response = client.Scan(request);


var result = response.ScanResult;

foreach (Dictionary<string, AttributeValue> item in response.ScanResult.Items)


{
// Process the result.
PrintItem(item);
}

Especificacin de parmetros opcionales


El mtodo Scan admite varios parmetros opcionales. Por ejemplo, si lo desea puede utilizar un filtro de
examen para filtrar el resultado del examen. En un filtro de examen, puede especificar una condicin, as

API Version 2012-08-10


456
Amazon DynamoDB Developer Guide
Examen: .NET

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

var forumScanRequest = new ScanRequest


{
TableName = "ProductCatalog",
// Optional parameters.
ExpressionAttributeValues = new Dictionary<string,AttributeValue> {
{":val", new AttributeValue { N = "0" }}
},
FilterExpression = "Price < :val",
ProjectionExpression = "Id"
};

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.

En el siguiente fragmento de cdigo C# se examina la tabla ProductCatalog. En la solicitud, se especifican


los parmetros opcionales Limit y ExclusiveStartKey. El bucle do/while contina examinando una
pgina cada vez hasta que LastEvaluatedKey devuelve el valor null.

Example

Dictionary<string, AttributeValue> lastKeyEvaluated = null;


do
{
var request = new ScanRequest
{
TableName = "ProductCatalog",
Limit = 10,
ExclusiveStartKey = lastKeyEvaluated
};

var response = client.Scan(request);

foreach (Dictionary<string, AttributeValue> item


in response.Items)
{
PrintItem(item);
}
lastKeyEvaluated = response.LastEvaluatedKey;

API Version 2012-08-10


457
Amazon DynamoDB Developer Guide
Examen: .NET

} while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);

Ejemplo: Examen mediante .NET


En el siguiente ejemplo de cdigo C# se utiliza una muestra de trabajo que examina la tabla
ProductCatalog para buscar los elementos cuyo precio es menor que 0.

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();

static void Main(string[] args)


{
try
{
FindProductsForPriceLessThanZero();

Console.WriteLine("Example complete. To continue, press Enter");


Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("To continue, press Enter");
Console.ReadLine();
}
}

private static void FindProductsForPriceLessThanZero()


{
Dictionary<string, AttributeValue> lastKeyEvaluated = null;
do
{
var request = new ScanRequest
{
TableName = "ProductCatalog",
Limit = 2,
ExclusiveStartKey = lastKeyEvaluated,
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":val", new AttributeValue {
N = "0"
}}
},
FilterExpression = "Price < :val",

ProjectionExpression = "Id, Title, Price"


};

var response = client.Scan(request);

foreach (Dictionary<string, AttributeValue> item

API Version 2012-08-10


458
Amazon DynamoDB Developer Guide
Examen: .NET

in response.Items)
{
Console.WriteLine("\nScanThreadTableUsePaging - printing.....");
PrintItem(item);
}
lastKeyEvaluated = response.LastEvaluatedKey;
} while (lastKeyEvaluated != null && lastKeyEvaluated.Count != 0);

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}

private static void PrintItem(


Dictionary<string, AttributeValue> attributeList)
{
foreach (KeyValuePair<string, AttributeValue> kvp in attributeList)
{
string attributeName = kvp.Key;
AttributeValue value = kvp.Value;

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("************************************************");
}
}
}

Ejemplo: Examen en paralelo mediante .NET


En el siguiente ejemplo de cdigo C# se muestra un examen en paralelo. El programa elimina y vuelve a
crear la tabla ProductCatalog; a continuacin, carga datos en ella. Una vez finalizada la carga de datos, el
programa crea varios subprocesos y emite solicitudes Scan en paralelo. Por ltimo, el programa imprime
un resumen de las estadsticas de tiempo de ejecucin.

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;

API Version 2012-08-10


459
Amazon DynamoDB Developer Guide
Examen: .NET

static void Main(string[] args)


{
try
{
DeleteExampleTable();
CreateExampleTable();
UploadExampleData();
ParallelScanExampleTable();
}
catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }

Console.WriteLine("To continue, press Enter");


Console.ReadLine();
}

private static void ParallelScanExampleTable()


{
Console.WriteLine("\n*** Creating {0} Parallel Scan Tasks to scan {1}",
totalSegments, tableName);
Task[] tasks = new Task[totalSegments];
for (int segment = 0; segment < totalSegments; segment++)
{
int tmpSegment = segment;
Task task = Task.Factory.StartNew(() =>
{
ScanSegment(totalSegments, tmpSegment);
});

tasks[segment] = task;
}

Console.WriteLine("All scan tasks are created, waiting for them to complete.");


Task.WaitAll(tasks);

Console.WriteLine("All scan tasks are completed.");


}

private static void ScanSegment(int totalSegments, int segment)


{
Console.WriteLine("*** Starting to Scan Segment {0} of {1} out of {2} total
segments ***", segment, tableName, totalSegments);
Dictionary<string, AttributeValue> lastEvaluatedKey = null;
int totalScannedItemCount = 0;
int totalScanRequestCount = 0;
do
{
var request = new ScanRequest
{
TableName = tableName,
Limit = scanItemLimit,
ExclusiveStartKey = lastEvaluatedKey,
Segment = segment,
TotalSegments = totalSegments
};

var response = client.Scan(request);


lastEvaluatedKey = response.LastEvaluatedKey;
totalScanRequestCount++;
totalScannedItemCount += response.ScannedCount;
foreach (var item in response.Items)
{
Console.WriteLine("Segment: {0}, Scanned Item with Title: {1}",
segment, item["Title"].S);

API Version 2012-08-10


460
Amazon DynamoDB Developer Guide
Examen: .NET

}
} while (lastEvaluatedKey.Count != 0);

Console.WriteLine("*** Completed Scan Segment {0} of {1}.


TotalScanRequestCount: {2}, TotalScannedItemCount: {3} ***", segment, tableName,
totalScanRequestCount, totalScannedItemCount);
}

private static void UploadExampleData()


{
Console.WriteLine("\n*** Uploading {0} Example Items to {1} Table***",
exampleItemCount, tableName);
Console.Write("Uploading Items: ");
for (int itemIndex = 0; itemIndex < exampleItemCount; itemIndex++)
{
Console.Write("{0}, ", itemIndex);
CreateItem(itemIndex.ToString());
}
Console.WriteLine();
}

private static void CreateItem(string itemIndex)


{
var request = new PutItemRequest
{
TableName = tableName,
Item = new Dictionary<string, AttributeValue>()
{
{ "Id", new AttributeValue {
N = itemIndex
}},
{ "Title", new AttributeValue {
S = "Book " + itemIndex + " Title"
}},
{ "ISBN", new AttributeValue {
S = "11-11-11-11"
}},
{ "Authors", new AttributeValue {
SS = new List<string>{"Author1", "Author2" }
}},
{ "Price", new AttributeValue {
N = "20.00"
}},
{ "Dimensions", new AttributeValue {
S = "8.5x11.0x.75"
}},
{ "InPublication", new AttributeValue {
BOOL = false
} }
}
};
client.PutItem(request);
}

private static void CreateExampleTable()


{
Console.WriteLine("\n*** Creating {0} Table ***", tableName);
var request = new CreateTableRequest
{
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "Id",
AttributeType = "N"
}

API Version 2012-08-10


461
Amazon DynamoDB Developer Guide
Examen: .NET

},
KeySchema = new List<KeySchemaElement>
{
new KeySchemaElement
{
AttributeName = "Id",
KeyType = "HASH" //Partition key
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 5,
WriteCapacityUnits = 6
},
TableName = tableName
};

var response = client.CreateTable(request);

var result = response;


var tableDescription = result.TableDescription;
Console.WriteLine("{1}: {0} \t ReadsPerSec: {2} \t WritesPerSec: {3}",
tableDescription.TableStatus,
tableDescription.TableName,
tableDescription.ProvisionedThroughput.ReadCapacityUnits,
tableDescription.ProvisionedThroughput.WriteCapacityUnits);

string status = tableDescription.TableStatus;


Console.WriteLine(tableName + " - " + status);

WaitUntilTableReady(tableName);
}

private static void DeleteExampleTable()


{
try
{
Console.WriteLine("\n*** Deleting {0} Table ***", tableName);
var request = new DeleteTableRequest
{
TableName = tableName
};

var response = client.DeleteTable(request);


var result = response;
Console.WriteLine("{0} is being deleted...", tableName);
WaitUntilTableDeleted(tableName);
}
catch (ResourceNotFoundException)
{
Console.WriteLine("{0} Table delete failed: Table does not exist",
tableName);
}
}

private static void WaitUntilTableReady(string tableName)


{
string status = null;
// Let us wait until table is created. Call DescribeTable.
do
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{

API Version 2012-08-10


462
Amazon DynamoDB Developer Guide
Uso de ndices

TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
catch (ResourceNotFoundException)
{
// DescribeTable is eventually consistent. So you might
// get resource not found. So we handle the potential exception.
}
} while (status != "ACTIVE");
}

private static void WaitUntilTableDeleted(string tableName)


{
string status = null;
// Let us wait until table is deleted. Call DescribeTable.
do
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
catch (ResourceNotFoundException)
{
Console.WriteLine("Table name: {0} is not found. It is deleted",
tableName);
return;
}
} while (status == "DELETING");
}
}
}

Uso de ndices secundarios para mejorar el acceso


a los datos
Temas
ndices secundarios globales (p. 466)
ndices secundarios locales (p. 505)

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.

API Version 2012-08-10


463
Amazon DynamoDB Developer Guide
Uso de 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.

DynamoDB admite dos tipos de ndices secundarios:

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:

Caracterstica ndice secundario global ndice secundario local

Esquema de claves La clave principal de un ndices La clave principal de un local


secundario global puede ser secondary index debe ser
simple (clave de particin) o compuesta (clave de particin y
compuesta (clave de particin y clave de ordenacin).
clave de ordenacin).

Atributos de clave La clave de particin y la clave La clave de particin del ndice


de ordenacin (si procede) del es el mismo atributo que la clave
ndice pueden ser cualesquiera de particin de la tabla base. La
atributos de tipo String, Number o clave de ordenacin puede ser
Binary de la tabla base. cualquier atributo de tipo String,
Number o Binary de la tabla
base.

Restricciones de tamao por No se aplican restricciones de Para cada valor de clave de


valor de clave de particin tamao a los ndices secundarios particin, el tamao total de
globales. todos los elementos indexados
debe ser de 10 GB o menos.

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

API Version 2012-08-10


464
Amazon DynamoDB Developer Guide
Uso de ndices

Caracterstica ndice secundario global ndice secundario local


la vez que se crea una tabla. tabla. No se puede agregar un
Tambin se puede agregar local secondary index a una tabla
un nuevo ndices secundario existente, ni tampoco se puede
global a una tabla o eliminar eliminar ningn local secondary
un ndices secundario global index que ya exista.
presente en ella. Para obtener
ms informacin, consulte
Administracin de ndices
secundarios globales (p. 474).

Consultas y particiones Un ndices secundario global Un local secondary index permite


permite realizar consultas en consultar una sola particin,
toda la tabla y en todas las segn lo especificado por el
particiones. valor de clave de particin de la
consulta.

Consistencia de lectura Las consultas de ndices Cuando se realiza una consulta


secundarios globales solo en un local secondary index, se
admiten la consistencia final. puede elegir entre la consistencia
final o alta.

Consumo de desempeo Cada ndices secundario global Las consultas o exmenes de un


provisionado tiene sus propios ajustes de local secondary index consumen
desempeo provisionado para la unidades de capacidad de
actividad de lectura y escritura. lectura de la tabla base. Al
Las consultas o exmenes escribir en una tabla, sus
de un ndices secundario ndices secundarios locales
global consumen unidades de tambin se actualizan y estas
capacidad del ndice, no de la actualizaciones consumen
tabla base. Esto mismo sucede unidades de capacidad de
con las actualizaciones de los escritura de la tabla base.
ndices secundarios globales
debidas a escrituras en la tabla.

Atributos proyectados Cuando se consulta o examina Cuando se consulta o examina


un ndices secundario global, un local secondary index, se
solo se pueden solicitar los pueden solicitar los atributos
atributos que se han proyectado que no se hayan proyectado
en l. DynamoDB no recupera en l. DynamoDB recuperar
ningn atributo de la tabla. automticamente estos atributos
de la tabla.

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.

Para cada ndice secundario, debe especificar lo siguiente:

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.

API Version 2012-08-10


465
Amazon DynamoDB Developer Guide
ndices secundarios globales

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).

ndices secundarios globales


Temas
Proyecciones de atributos (p. 469)
Consulta de un ndice secundario global (p. 470)
Examen de un ndice secundario global (p. 471)
Sincronizacin de datos entre tablas e ndices secundarios globales (p. 471)
Consideraciones sobre el desempeo provisionado para los ndices secundarios globales (p. 472)
Consideraciones sobre el almacenamiento para los ndices secundarios globales (p. 473)
Administracin de ndices secundarios globales (p. 474)
Uso de ndices secundarios globales: Java (p. 487)
Uso de ndices secundarios globales: .NET (p. 494)

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

API Version 2012-08-10


466
Amazon DynamoDB Developer Guide
ndices secundarios globales

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:

Cul es la puntuacin mxima que se ha registrado en el juego Meteor Blasters?


Qu usuario ha obtenido la mejor puntuacin en Galaxy Invaders?
Cul es la mayor proporcin de partidas ganadas respecto a las perdidas?

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:

API Version 2012-08-10


467
Amazon DynamoDB Developer Guide
ndices secundarios globales

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:

UserId GameTitle TopScore

123 Comet Quest 0

201 Comet Quest 0

301 Comet Quest 0

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:

API Version 2012-08-10


468
Amazon DynamoDB Developer Guide
ndices secundarios globales

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

400 Comet Quest

Al no haber especificado el atributo TopScore, DynamoDB no propagar este elemento a GameTitleIndex.


Por lo tanto, si consultase GameScores para obtener todos los elementos Comet Quest, obtendra los
siguientes cuatro elementos:

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.

API Version 2012-08-10


469
Amazon DynamoDB Developer Guide
ndices secundarios globales

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.

Consulta de un ndice secundario global


Puede utilizar la operacinQuerypara obtener acceso a uno o varios elementos de un ndices secundario
global. En la consulta se debe especificar el nombre de la tabla base y el nombre del ndice que se desea

API Version 2012-08-10


470
Amazon DynamoDB Developer Guide
ndices secundarios globales

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.

Examen de un ndice secundario global


Puede usar la operacin Scan para recuperar todos los datos de un ndices secundario global. Debe
proporcionar el nombre de la tabla base y el nombre del ndice en la solicitud. Con una operacin Scan,
DynamoDB lee todos los datos del ndice y los devuelve a la aplicacin. Tambin puede solicitar que
solo se devuelvan algunos de los datos y se descarten los dems. Para ello, se utiliza el parmetro
FilterExpression de la operacin Scan. Para obtener ms informacin, consulte Expresiones de filtro
para Scan (p. 443).

Sincronizacin de datos entre tablas e ndices secundarios


globales
DynamoDB sincroniza automticamente cada ndice secundario global con su tabla base. Cuando una
aplicacin escribe o elimina elementos en una tabla, los ndices secundarios globales de esa tabla se
actualizan de forma asincrnica, aplicando un modelo de consistencia final. Las aplicaciones nunca
escriben directamente en un ndice. Sin embargo, es importante comprender las implicaciones de cmo
DynamoDB mantiene estos ndices.

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

API Version 2012-08-10


471
Amazon DynamoDB Developer Guide
ndices secundarios globales

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).

Consideraciones sobre el desempeo provisionado para los


ndices secundarios globales
Al crear un ndices secundario global, debe especificar las unidades de capacidad de lectura y escritura
para la carga de trabajo prevista de ese ndice. Los ajustes de desempeo provisionado de un ndices
secundario global son independientes de los de su tabla base. Una operacin Query en un ndices
secundario global consume unidades de capacidad de lectura del ndice, no de la tabla base. Al colocar,
actualizar o eliminar elementos en una tabla, los ndices secundarios globales de esa tabla tambin se
actualizan; estas actualizaciones del ndice consumen unidades de capacidad de escritura del ndice, no
de la tabla base.

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.

Unidades de capacidad de lectura


Los ndices secundarios globales admiten las lecturas consistentes finales, cada una de la cuales consume
la mitad de una unidad de capacidad de lectura. Esto quiere decir que una sola consulta en un ndices
secundario global permite recuperar hasta 2 4 KB = 8KB por unidad de capacidad de lectura.

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.

API Version 2012-08-10


472
Amazon DynamoDB Developer Guide
ndices secundarios globales

Unidades de capacidad de escritura


Cuando se agrega, actualiza o elimina un elemento de una tabla y esto afecta a un ndices secundario
global, este ltimo consume unidades de capacidad de escritura provisionadas por esta operacin. El costo
total de desempeo provisionado de una escritura es la suma de las unidades de capacidad de escritura
consumidas al escribir en la tabla base y aquellas consumidas al actualizar los ndices secundarios
globales. Tenga en cuenta que si una escritura en una tabla no requiere que se actualice un ndices
secundario global, entonces no se consume ninguna capacidad de escritura del ndice.

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.

El costo de escribir un elemento en un ndices secundario global depende de varios factores:

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.

Consideraciones sobre el almacenamiento para los ndices


secundarios globales
Cuando una aplicacin escribe un elemento en una tabla, DynamoDB copia automticamente el
subconjunto de atributos en todos los ndices secundarios globales en los que deban aparecer esos
atributos. Se aplica un cargo en su cuenta de AWS por el almacenamiento del elemento en la tabla base y
tambin por el almacenamiento de los atributos en todos los ndices secundarios globales de esa tabla.

La cantidad de espacio utilizado por un elemento de ndice es la suma de lo siguiente:

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.

API Version 2012-08-10


473
Amazon DynamoDB Developer Guide
ndices secundarios globales

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.

Administracin de ndices secundarios globales


En esta seccin se describe cmo crear, modificar y eliminar ndices secundarios globales.

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)

Creacin de una tabla con ndices secundarios globales


Para crear una tabla con uno o varios ndices secundarios globales, use la operacin CreateTable con el
parmetro GlobalSecondaryIndexes. Para disfrutar de la mxima flexibilidad en las consultas, puede
crear hasta 5 ndices secundarios globales por tabla.

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).

Debe proporcionar para el ndice los ajustes de ProvisionedThroughput, que constan de


ReadCapacityUnits y WriteCapacityUnits. Estos ajustes de desempeo provisionado
son independientes de los de la tabla pero se comportan de forma parecida. Para obtener ms
informacin, consulte Consideraciones sobre el desempeo provisionado para los ndices secundarios
globales (p. 472).

Descripcin de los ndices secundarios globales de una tabla


Para ver el estado de todos los ndices secundarios globales de una tabla, se usa la operacin
DescribeTable. La parte GlobalSecondaryIndexes de la respuesta enumera todos los ndices de la
tabla, junto con el estado actual de cada uno de ellos (IndexStatus).

En un ndices secundario global, IndexStatus puede tener uno de los siguientes valores:

CREATING: el ndice est en proceso de creacin y an no est disponible para usarlo.


ACTIVE: el ndice est listo para usarlo y las aplicaciones pueden realizar operaciones Query en l.
UPDATING: se estn cambiando los ajustes de desempeo provisionado del ndice.
DELETING: el ndice se est eliminando y ya no se puede utilizar.

API Version 2012-08-10


474
Amazon DynamoDB Developer Guide
ndices secundarios globales

Cuando DynamoDB ha terminado de crear un ndices secundario global, el estado de este ltimo cambia
de CREATING a ACTIVE.

Adicin de un ndice secundario global a una tabla existente


Para agregar un ndices secundario global a una tabla existente, se usa la operacin UpdateTable con el
parmetro GlobalSecondaryIndexUpdates. Debe proporcionar lo siguiente:

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

No se puede cancelar una creacin de un ndices secundario global en proceso.

Fases de creacin de los ndices

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.

En segundo plano, DynamoDB crea el ndice en dos fases:

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.

Mientras el ndice se encuentra en la fase de asignacin de recursos, no se puede eliminar su tabla


principal ni tampoco se puede modificar el desempeo provisionado del ndice ni de la tabla. No se
pueden agregar ni eliminar otros ndices en la tabla; sin embargo, s se puede modificar el desempeo
provisionado de estos otros ndices.
Reposicin

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

API Version 2012-08-10


475
Amazon DynamoDB Developer Guide
ndices secundarios globales

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

Durante la fase de reposicin, algunas escrituras de elementos infractores podran realizarse


correctamente y otras se rechazarn. Despus de la reposicin, se rechazarn todas las
escrituras en elementos que infrinjan el esquema de claves del nuevo ndice. Recomendamos
ejecutar la herramienta Violation Detector una vez que haya finalizado la fase de reposicin
para detectar y resolver cualquier infraccin de clave que pueda haberse producido. Para
obtener ms informacin, consulte Deteccin y correccin de infracciones de claves de
ndice (p. 478).

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

En algunos casos, DynamoDB no podr escribir datos de la tabla en el ndice debido a


infracciones de claves del ndice. Esto puede ocurrir si el tipo de datos de un valor de atributo no
coincide con el tipo de datos de un tipo de datos del esquema de claves del ndice o si el tamao
de un atributo supera la longitud mxima para un atributo de clave de ndice. Las infracciones
de claves del ndice no interfieren con la creacin de un ndices secundario global. Sin embargo,
cuando el ndice adquiera el estado ACTIVE, las claves infractoras no estarn presentes en l.
DynamoDB proporciona una herramienta independiente para encontrar y resolver estos
problemas. Para obtener ms informacin, consulte Deteccin y correccin de infracciones de
claves de ndice (p. 478).

Adicin de un ndice secundario global a una tabla grande

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

API Version 2012-08-10


476
Amazon DynamoDB Developer Guide
ndices secundarios globales

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.

Modificacin de la creacin de un ndice


Mientras se est creando un ndice, puede usar la operacin DescribeTable para determinar en qu
fase se encuentra. La descripcin del ndice incluye un atributo de tipo Boolean, Backfilling, que indica
si DynamoDB est cargando elementos de la tabla en el ndice en un momento dado. Si Backfilling es
true, significa que la fase de asignacin de recursos se ha completado y el ndice se encuentra en la fase
de reposicin.

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.

Durante la fase de reposicin, no se pueden agregar ni eliminar otros ndices de la tabla.


Note

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).

Eliminacin de un ndice secundario global de una tabla


Si ya no necesita un ndices secundario global, puede eliminarlo mediante la operacin UpdateTable.

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.

API Version 2012-08-10


477
Amazon DynamoDB Developer Guide
ndices secundarios globales

Note

Al eliminar una tabla mediante la accin DeleteTable, todos los ndices secundarios globales de
esa tabla se eliminan tambin.

Deteccin y correccin de infracciones de claves de ndice


Durante la fase de reposicin de la creacin de un ndices secundario global, DynamoDB examina cada
elemento de la tabla para determinar si es apto para incluirlo en el ndice. Algunos elementos podran no
ser aptos por la posibilidad de que causen infracciones de claves de ndice. En estos casos, el elemento en
cuestin permanecer en la tabla, pero el ndice no incluir la entrada correspondiente a dicho elemento.

Una infraccin de clave de ndice se produce si:

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.

Descarga y ejecucin de Violation Detector

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.

API Version 2012-08-10


478
Amazon DynamoDB Developer Guide
ndices secundarios globales

Para iniciar Violation Detector, vaya al directorio donde ha construido ViolationDetector.java y


escriba el siguiente comando:

java -jar ViolationDetector.jar [options]

La lnea de comandos de Violation Detector acepta las siguientes opciones:

-h | --help: imprime un resumen de uso y las opciones posibles de Violation Detector.


-p | --configFilePath value: nombre completo de un archivo de configuracin de Violation
Detector. Para obtener ms informacin, consulte Archivo de configuracin Violation Detector (p. 479) .
-t | --detect value: detecta las infracciones de claves de ndice de la tabla y las escribe en
el archivo de resultados de Violation Detector. Si el valor de este parmetro se establece en keep,
los elementos con infracciones de claves no se modificarn. Si el valor se establece en delete, los
elementos con infracciones de claves se eliminarn de la tabla.
-c | --correct value: lee las infracciones de claves de ndice en un archivo de informacin de
entrada y adopta medidas para corregir los elementos de la tabla. Si el valor de este parmetro se
establece en update, los elementos con infracciones de claves se actualizarn a otros valores sin
infracciones. Si el valor se establece en delete, los elementos con infracciones de claves se eliminarn
de la tabla.

Archivo de configuracin Violation Detector

En tiempo de ejecucin, la herramienta Violation Detector requiere un archivo de configuracin. Los


parmetros de este archivo determinan a qu recursos de DynamoDB puede obtener acceso la
herramienta Violation Detector y cunto desempeo provisionado puede consumir. En la tabla siguiente se
describen estos parmetros.

Nombre del parmetro Descripcin Obligatorio?

awsCredentialsFile Nombre completo de un archivo S


que contiene las credenciales de
AWS. El archivo de credenciales
debe tener el siguiente formato:

accessKey
= access_key_id_goes_here
secretKey
= secret_key_goes_here

dynamoDBRegion Regin de AWS en la que la S


reside la tabla. Por ejemplo: us-
west-2.

tableName Nombre de la tabla de S


DynamoDB que se va a
examinar.

gsiHashKeyName Nombre de la clave de particin S


del ndice.

gsiHashKeyType Tipo de datos de la clave de S


particin del ndice: String,
Number o Binary.

S | N | B

API Version 2012-08-10


479
Amazon DynamoDB Developer Guide
ndices secundarios globales

Nombre del parmetro Descripcin Obligatorio?

gsiRangeKeyName Nombre de la clave de No


ordenacin del ndice. No
especifique este parmetro si
el ndice solo tiene una clave
principal simple (clave de
particin).

gsiRangeKeyType Tipo de datos de la clave de No


ordenacin del ndice: String,
Number o Binary.

S | N | B

No especifique este parmetro


si el ndice solo tiene una clave
principal simple (clave de
particin).

recordDetails Indica si se deben escribir todos No


los detalles de las infracciones
de claves de ndice en el archivo
de resultados. Si se establece
en true (valor predeterminado),
se registra toda la informacin
sobre los elementos infractores.
Si se establece en false,
solo se registra el nmero de
infracciones.

Indica si se deben escribir los


recordGsiValueInViolationRecord No
valores de las claves de ndice
infractoras en el archivo de
resultados. Si se establece
en true (predeterminado),
se registran los valores de
las claves. Si se establece en
false, los valores de las claves
no se registran.

API Version 2012-08-10


480
Amazon DynamoDB Developer Guide
ndices secundarios globales

Nombre del parmetro Descripcin Obligatorio?

detectionOutputPath Ruta completa del archivo de No


resultados de Violation Detector.
Este parmetro es compatible
con la escritura en un directorio
local o en Amazon Simple
Storage Service (Amazon S3).
A continuacin se muestran
algunos ejemplos:

detectionOutputPath
= //local/path/
filename.csv

detectionOutputPath =
s3://bucket/filename.csv

La informacin del archivo de


resultados aparece en formato
CSV (valores separados por
comas). Si no se establece
detectionOutputPath,
el archivo de resultados
se denomina
violation_detection.csv
y se escribe en el directorio de
trabajo actual.

API Version 2012-08-10


481
Amazon DynamoDB Developer Guide
ndices secundarios globales

Nombre del parmetro Descripcin Obligatorio?

numOfSegments El nmero de segmentos de No


examen en paralelo que se
utilizarn cuando Violation
Detector examine la tabla. El
valor predeterminado es 1, lo
que significa que la tabla se
examina de forma secuencial. Si
el valor es 2 o superior, entonces
Violation Detector dividir la tabla
en esa cantidad de segmentos
lgicos y un nmero igual de
subprocesos de examen.

El ajuste mximo de
numOfSegments es 4096.

En el caso de las tablas de


mayor tamao, un examen
en paralelo suele resultar
ms rpido que un examen
secuencial. Adems, si la tabla
es lo bastante grande para
abarcar varias particiones, un
examen en paralelo distribuir su
actividad de lectura de manera
uniforme entre varias particiones.
Para obtener ms informacin
sobre los exmenes en paralelo
en DynamoDB, consulte Examen
en paralelo (p. 447).

numOfViolations Lmite superior de infracciones No


de claves de ndice que se
escribirn en el archivo de
resultados. Si se establece en
-1 (valor predeterminado), se
examinar toda la tabla. Si se
establece en un nmero entero
positivo, entonces Violation
Detector se detendr despus de
haber detectado esa cantidad de
infracciones.

numOfRecords Nmero de elementos de la No


tabla que se va a examinar.
Si se establece en -1 (valor
predeterminado), se examinar
toda la tabla. Si se establece
en un nmero entero positivo,
entonces Violation Detector se
detendr despus de haber
examinado esa cantidad de
elementos en la tabla.

API Version 2012-08-10


482
Amazon DynamoDB Developer Guide
ndices secundarios globales

Nombre del parmetro Descripcin Obligatorio?

readWriteIOPSPercent Regula el porcentaje de unidades No


de capacidad de lectura
provisionadas que se consumen
durante un examen de la tabla.
Los valores vlidos van de 1 a
100. El valor predeterminado
(25) significa que Violation
Detector consumir no ms del
25% del desempeo de lectura
provisionado de la tabla.

correctionInputPath Ruta completa del archivo de No


informacin de entrada de
correccin de Violation Detector.
Si ejecuta Violation Detector
en modo de correccin, el
contenido de este archivo se
usa para modificar o eliminar
los elementos de datos de la
tabla que infringen el ndices
secundario global.

El formato del archivo


correctionInputPath es
el mismo que el del archivo
detectionOutputPath. Esto
permite procesar el resultado
del modo de deteccin como
informacin de entrada en el
modo de correccin.

API Version 2012-08-10


483
Amazon DynamoDB Developer Guide
ndices secundarios globales

Nombre del parmetro Descripcin Obligatorio?

correctionOutputPath Ruta completa del archivo de No


resultados de correccin de
Violation Detector. Este archivo
se crea solo si existen errores de
actualizacin.

Este parmetro es compatible


con la escritura en un directorio
local o en Amazon Simple
Storage Service (Amazon S3).
A continuacin se muestran
algunos ejemplos:

correctionOutputPath
= //local/path/
filename.csv

correctionOutputPath =
s3://bucket/filename.csv

La informacin del archivo de


resultados aparece en formato
CSV (valores separados por
comas). Si no se establece
correctionOutputPath,
el archivo de resultados
se denomina
violation_update_errors.csv
y se escribe en el directorio de
trabajo actual.

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.

Id (clave principal) Price

101 -2

102 20

103 200

201 100

202 200

203 300

204 400

205 500

API Version 2012-08-10


484
Amazon DynamoDB Developer Guide
ndices secundarios globales

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:

Id (clave principal) Price

999 "Hello"

Ahora, la tabla contiene un total de nueve elementos.

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:

# Properties file for violation detection tool configuration.


# Parameters that are not specified will use default values.

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

A continuacin, se ejecuta Violation Detector como en este ejemplo:

$ java -jar ViolationDetector.jar --configFilePath config.txt --detect keep

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

Si el parmetro de configuracin recordDetails se establece en true, entonces Violation Detector


escribe los detalles de cada infraccin en el archivo de resultados, como en el siguiente ejemplo:

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)

999,"{""S"":""Hello""}",Type Violation,Expected: N Found: S,,

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:

API Version 2012-08-10


485
Amazon DynamoDB Developer Guide
ndices secundarios globales

Table Hash Key: valor de la clave de particin del elemento de la tabla.


Table Range Key: valor de la clave de ordenacin del elemento de la tabla.
GSI Hash Key Value: valor de la clave de particin del ndices secundario global.
GSI Hash Key Violation Type: puede ser Type Violation o Size Violation.
GSI Hash Key Violation Description: causa de la infraccin.
GSI Hash Key Update Value(FOR USER): en el modo de correccin, nuevo valor suministrado por el
usuario para el atributo.
GSI Range Key Value: valor de la clave de ordenacin del ndices secundario global.
GSI Range Key Violation Type: puede ser Type Violation o Size Violation.
GSI Range Key Violation Description: causa de la infraccin.
GSI Range Key Update Value(FOR USER): en el modo de correccin, nuevo valor suministrado por el
usuario para el atributo.
Delete Blank Attribute When Updating(Y/N): en el modo de correccin, determina si el elemento infractor
se eliminar (Y) o se conservar (N) en la tabla, pero solamente si cualquiera de los campos siguientes
est en blanco:
GSI Hash Key Update Value(FOR USER)
GSI Range Key Update Value(FOR USER)

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.

Si continuamos con el ejemplo anterior de ProductCatalog, supongamos que deseamos eliminar el


elemento infractor de la tabla. Para ello, utilizamos la lnea de comandos siguiente:

$ java -jar ViolationDetector.jar --configFilePath config.txt --correct delete

API Version 2012-08-10


486
Amazon DynamoDB Developer Guide
ndices secundarios globales

En este momento, le pedir que confirme si desea eliminar los elementos infractores.

Are you sure to delete all violations on the table?y/n


y
Confirmed, will delete violations on the table...
Violation correction from file started: Reading records from file: ./
gsi_violation_check.csv, will delete these records from table.
Violation correction from file finished: Violations delete: 1, Violations Update: 0

Ahora, tanto ProductCatalog como PriceIndex tienen el mismo nmero de elementos.

Uso de ndices secundarios globales: Java


Puede utilizar el API de documentos del AWS SDK for Java para crear una tabla con uno o varios ndices
secundarios globales, describir los ndices de la tabla y utilizarlos para realizar consultas.

A continuacin se indican los pasos comunes para las operaciones con tablas.

1. Cree una instancia de la clase DynamoDB.


2. Cree los objetos de solicitud correspondientes para proporcionar los parmetros obligatorios y
opcionales de la operacin.
3. Llame al mtodo apropiado proporcionado por el cliente que ha creado en el paso anterior.

Creacin de una tabla con un ndice secundario global


Puede crear ndices secundarios globales a la vez que crea la tabla. Para ello, utilice CreateTable e
indique las especificaciones para uno o varios ndices secundarios globales. En el fragmento de cdigo
Java siguiente, se crea una tabla para contener informacin sobre datos meteorolgicos. La clave
de particin es Location (la ubicacin) y la ordenacin, Date (la fecha). Un ndices secundario global
denominado PrecipIndex permite obtener acceso rpido a los datos sobre precipitaciones de varias
ubicaciones.

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.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase CreateTableRequest para proporcionar la informacin de solicitud.

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.

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

API Version 2012-08-10


487
Amazon DynamoDB Developer Guide
ndices secundarios globales

// 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"));

// Table key schema


ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>();
tableKeySchema.add(new KeySchemaElement()
.withAttributeName("Location")
.withKeyType(KeyType.HASH)); //Partition key
tableKeySchema.add(new KeySchemaElement()
.withAttributeName("Date")
.withKeyType(KeyType.RANGE)); //Sort key

// PrecipIndex
GlobalSecondaryIndex precipIndex = new GlobalSecondaryIndex()
.withIndexName("PrecipIndex")
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits((long) 10)
.withWriteCapacityUnits((long) 1))
.withProjection(new Projection().withProjectionType(ProjectionType.ALL));

ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>();

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);

CreateTableRequest createTableRequest = new CreateTableRequest()


.withTableName("WeatherData")
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits((long) 5)
.withWriteCapacityUnits((long) 1))
.withAttributeDefinitions(attributeDefinitions)
.withKeySchema(tableKeySchema)
.withGlobalSecondaryIndexes(precipIndex);

Table table = dynamoDB.createTable(createTableRequest);


System.out.println(table.getDescription());

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.

Descripcin de una tabla con un ndice secundario global


Para obtener informacin acerca de los ndices secundarios globales de una tabla, use DescribeTable.
Para cada ndice, puede obtener acceso a su nombre, esquema de claves y atributos proyectados.

A continuacin se indican los pasos que debe seguir para obtener acceso a la informacin de ndices
secundario global de una tabla.

API Version 2012-08-10


488
Amazon DynamoDB Developer Guide
ndices secundarios globales

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table para representar el ndice que desea usar.
3. Llame al mtodo describe del objeto Table.

En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("WeatherData");


TableDescription tableDesc = table.describe();

Iterator<GlobalSecondaryIndexDescription> gsiIter =
tableDesc.getGlobalSecondaryIndexes().iterator();
while (gsiIter.hasNext()) {
GlobalSecondaryIndexDescription gsiDesc = gsiIter.next();
System.out.println("Info for index "
+ gsiDesc.getIndexName() + ":");

Iterator<KeySchemaElement> kseIter = gsiDesc.getKeySchema().iterator();


while (kseIter.hasNext()) {
KeySchemaElement kse = kseIter.next();
System.out.printf("\t%s: %s\n", kse.getAttributeName(), kse.getKeyType());
}
Projection projection = gsiDesc.getProjection();
System.out.println("\tThe projection type is: "
+ projection.getProjectionType());
if (projection.getProjectionType().toString().equals("INCLUDE")) {
System.out.println("\t\tThe non-key projected attributes are: "
+ projection.getNonKeyAttributes());
}
}

Consulta de un ndice secundario global


Query se puede utilizar en un ndices secundario global de un modo bastante parecido a como Query se
usa en una tabla. Debe especificar el nombre del ndice, los criterios de consulta de la clave de particin
y la clave de ordenacin (si procede) del ndice y los atributos que desea devolver. En este ejemplo, el
ndice es PrecipIndex, cuyas clave de particin y ordenacin son, respectivamente, Date y Precipitation. La
consulta del ndice devuelve todos los datos meteorolgicos de una determinada fecha cuando el valor de
Precipitation sea mayor que cero.

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.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table para representar el ndice que desea usar.
3. Cree una instancia de la clase Index para el ndice que desea consultar.
4. Llame al mtodo query del objeto Index.

El nombre de atributo Date es una palabra reservada de DynamoDB. Por consiguiente,


debemos usar un nombre de atributo de expresin como marcador de posicin en la expresin
KeyConditionExpression.

En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores.

API Version 2012-08-10


489
Amazon DynamoDB Developer Guide
ndices secundarios globales

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("WeatherData");


Index index = table.getIndex("PrecipIndex");

QuerySpec spec = new QuerySpec()


.withKeyConditionExpression("#d = :v_date and Precipitation = :v_precip")
.withNameMap(new NameMap()
.with("#d", "Date"))
.withValueMap(new ValueMap()
.withString(":v_date","2013-08-10")
.withNumber(":v_precip",0));

ItemCollection<QueryOutcome> items = index.query(spec);


Iterator<Item> iter = items.iterator();
while (iter.hasNext()) {
System.out.println(iter.next().toJSONPretty());
}

Ejemplo: Uso de ndices secundarios globales mediante el API de documentos del


AWS SDK for Java
En el siguiente ejemplo de cdigo Java 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:

CreateDateIndex: la clave de particin es CreateDate y la de ordenacin, IssueId. Adems de las


claves de tabla, se proyectan en el ndice los atributos Description y Status.
TitleIndex: la clave de particin es IssueId y la de ordenacin, Title. No se proyecta en el ndice
ningn otro atributo excepto las claves de tabla.
DueDateIndex: la clave de particin es DueDate y no hay clave de ordenacin. Todos los atributos de la
tabla se proyectan en el ndice.

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

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

API Version 2012-08-10


490
Amazon DynamoDB Developer Guide
ndices secundarios globales

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;

public class DocumentAPIGlobalSecondaryIndexExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

public static String tableName = "Issues";

public static void main(String[] args) throws Exception {

createTable();
loadData();

queryIndex("CreateDateIndex");
queryIndex("TitleIndex");
queryIndex("DueDateIndex");

deleteTable(tableName);

public static void createTable() {

// 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 schema for table


ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>();
tableKeySchema.add(new
KeySchemaElement().withAttributeName("IssueId").withKeyType(KeyType.HASH)); // Partition

// key
tableKeySchema.add(new
KeySchemaElement().withAttributeName("Title").withKeyType(KeyType.RANGE)); // Sort

// key

// Initial provisioned throughput settings for the indexes


ProvisionedThroughput ptIndex = new
ProvisionedThroughput().withReadCapacityUnits(1L)
.withWriteCapacityUnits(1L);

// CreateDateIndex
GlobalSecondaryIndex createDateIndex = new
GlobalSecondaryIndex().withIndexName("CreateDateIndex")

API Version 2012-08-10


491
Amazon DynamoDB Developer Guide
ndices secundarios globales

.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"));

CreateTableRequest createTableRequest = new


CreateTableRequest().withTableName(tableName)
.withProvisionedThroughput(
new ProvisionedThroughput().withReadCapacityUnits((long)
1).withWriteCapacityUnits((long) 1))
.withAttributeDefinitions(attributeDefinitions).withKeySchema(tableKeySchema)
.withGlobalSecondaryIndexes(createDateIndex, titleIndex, dueDateIndex);

System.out.println("Creating table " + tableName + "...");


dynamoDB.createTable(createTableRequest);

// Wait for table to become active


System.out.println("Waiting for " + tableName + " to become ACTIVE...");
try {
Table table = dynamoDB.getTable(tableName);
table.waitForActive();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void queryIndex(String indexName) {

Table table = dynamoDB.getTable(tableName);

System.out.println("\n***********************************************************
\n");
System.out.print("Querying index " + indexName + "...");

API Version 2012-08-10


492
Amazon DynamoDB Developer Guide
ndices secundarios globales

Index index = table.getIndex(indexName);

ItemCollection<QueryOutcome> items = null;

QuerySpec querySpec = new QuerySpec();

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;
}

Iterator<Item> iterator = items.iterator();

System.out.println("Query: printing results...");

while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}

public static void deleteTable(String tableName) {

System.out.println("Deleting table " + tableName + "...");

Table table = dynamoDB.getTable(tableName);


table.delete();

// Wait for table to be deleted


System.out.println("Waiting for " + tableName + " to be deleted...");
try {
table.waitForDelete();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void loadData() {

System.out.println("Loading data into table " + tableName + "...");

// IssueId, Title,

API Version 2012-08-10


493
Amazon DynamoDB Developer Guide
ndices secundarios globales

// Description,
// CreateDate, LastUpdateDate, DueDate,
// Priority, Status

putItem("A-101", "Compilation error", "Can't compile Project X - bad version


number. What does this mean?",
"2013-11-01", "2013-11-02", "2013-11-10", 1, "Assigned");

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");

putItem("A-103", "Test failure", "Functional test of Project X produces errors",


"2013-11-01", "2013-11-02",
"2013-11-10", 1, "In progress");

putItem("A-104", "Compilation error", "Variable 'messageCount' was not


initialized.", "2013-11-15",
"2013-11-16", "2013-11-30", 3, "Assigned");

putItem("A-105", "Network issue", "Can't ping IP address 127.0.0.1. Please fix


this.", "2013-11-15",
"2013-11-16", "2013-11-19", 5, "Assigned");

public static void putItem(

String issueId, String title, String description, String createDate, String


lastUpdateDate, String dueDate,
Integer priority, String status) {

Table table = dynamoDB.getTable(tableName);

Item item = new Item().withPrimaryKey("IssueId", issueId).withString("Title",


title)
.withString("Description", description).withString("CreateDate", createDate)
.withString("LastUpdateDate", lastUpdateDate).withString("DueDate", dueDate)
.withNumber("Priority", priority).withString("Status", status);

table.putItem(item);
}

Uso de ndices secundarios globales: .NET


Temas
Creacin de una tabla con un ndice secundario global (p. 495)
Descripcin de una tabla con un ndice secundario global (p. 496)
Consulta de un ndice secundario global (p. 497)
Ejemplo: ndices secundarios globales mediante el API de bajo nivel del AWS SDK
para .NET (p. 498)

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.

API Version 2012-08-10


494
Amazon DynamoDB Developer Guide
ndices secundarios globales

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree los objetos de solicitud correspondientes para proporcionar los parmetros obligatorios y
opcionales de la operacin.

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.

Creacin de una tabla con un ndice secundario global


Puede crear ndices secundarios globales a la vez que crea la tabla. Para ello, utilice CreateTable e
indique las especificaciones para uno o varios ndices secundarios globales. En el fragmento de cdigo C#
siguiente, se crea una tabla para contener informacin sobre datos meteorolgicos. La clave de particin
es Location (la ubicacin) y la ordenacin, Date (la fecha). Un ndices secundario global denominado
PrecipIndex permite obtener acceso rpido a los datos sobre precipitaciones de varias ubicaciones.

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase CreateTableRequest para proporcionar la informacin de solicitud.

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.

En el siguiente fragmento de cdigo C# 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.

client = new AmazonDynamoDBClient();


string tableName = "WeatherData";

// 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"}
}
};

// Table key schema


var tableKeySchema = new List<KeySchemaElement>()
{

API Version 2012-08-10


495
Amazon DynamoDB Developer Guide
ndices secundarios globales

{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" }
};

var indexKeySchema = new List<KeySchemaElement> {


{new KeySchemaElement { AttributeName = "Date", KeyType = "HASH"}}, //Partition key
{new KeySchemaElement{AttributeName = "Precipitation",KeyType = "RANGE"}} //Sort key
};

precipIndex.KeySchema = indexKeySchema;

CreateTableRequest createTableRequest = new CreateTableRequest


{
TableName = tableName,
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = (long)5,
WriteCapacityUnits = (long)1
},
AttributeDefinitions = attributeDefinitions,
KeySchema = tableKeySchema,
GlobalSecondaryIndexes = { precipIndex }
};

CreateTableResponse response = client.CreateTable(createTableRequest);


Console.WriteLine(response.CreateTableResult.TableDescription.TableName);
Console.WriteLine(response.CreateTableResult.TableDescription.TableStatus);

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.

Descripcin de una tabla con un ndice secundario global


Para obtener informacin acerca de los ndices secundarios globales de una tabla, use DescribeTable.
Para cada ndice, puede obtener acceso a su nombre, esquema de claves y atributos proyectados.

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase DescribeTableRequest para proporcionar la informacin de solicitud.
Debe proporcionar el nombre de la tabla.
3. Ejecute el mtodo describeTable proporcionando el objeto de solicitud como parmetro.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores.

API Version 2012-08-10


496
Amazon DynamoDB Developer Guide
ndices secundarios globales

Example

client = new AmazonDynamoDBClient();


string tableName = "WeatherData";

DescribeTableResponse response = client.DescribeTable(new DescribeTableRequest { TableName


= tableName});

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.

foreach (GlobalSecondaryIndexDescription gsiDescription in globalSecondaryIndexes) {


Console.WriteLine("Info for index " + gsiDescription.IndexName + ":");

foreach (KeySchemaElement kse in gsiDescription.KeySchema) {


Console.WriteLine("\t" + kse.AttributeName + ": key type is " + kse.KeyType);
}

Projection projection = gsiDescription.Projection;


Console.WriteLine("\tThe projection type is: " + projection.ProjectionType);

if (projection.ProjectionType.ToString().Equals("INCLUDE")) {
Console.WriteLine("\t\tThe non-key projected attributes are: "
+ projection.NonKeyAttributes);
}
}

Consulta de un ndice secundario global


Query se puede utilizar en un ndices secundario global de un modo bastante parecido a como Query se
usa en una tabla. Debe especificar el nombre del ndice, los criterios de consulta de la clave de particin
y la clave de ordenacin (si procede) del ndice y los atributos que desea devolver. En este ejemplo, el
ndice es PrecipIndex, cuyas clave de particin y ordenacin son, respectivamente, Date y Precipitation. La
consulta del ndice devuelve todos los datos meteorolgicos de una determinada fecha cuando el valor de
Precipitation sea mayor que cero.

A continuacin se indican los pasos que hay que seguir para consultar un ndices secundario global
mediante el API de bajo nivel de .NET.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase QueryRequest para proporcionar la informacin de solicitud.
3. Ejecute el mtodo query proporcionando el objeto de solicitud como parmetro.

El nombre de atributo Date es una palabra reservada de DynamoDB. Por consiguiente,


debemos usar un nombre de atributo de expresin como marcador de posicin en la expresin
KeyConditionExpression.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores.

Example

client = new AmazonDynamoDBClient();

QueryRequest queryRequest = new QueryRequest


{
TableName = "WeatherData",

API Version 2012-08-10


497
Amazon DynamoDB Developer Guide
ndices secundarios globales

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
};

var result = client.Query(queryRequest);

var items = result.Items;


foreach (var currentItem in items)
{
foreach (string attr in currentItem.Keys)
{
Console.Write(attr + "---> ");
if (attr == "Precipitation")
{
Console.WriteLine(currentItem[attr].N);
}
else
{
Console.WriteLine(currentItem[attr].S);
}

}
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:

CreateDateIndex: la clave de particin es CreateDate y la de ordenacin, IssueId. Adems de las claves


de tabla, se proyectan en el ndice los atributos Description y Status.
TitleIndex: la clave de particin es IssueId y la de ordenacin, Title. No se proyecta en el ndice ningn
otro atributo excepto las claves de tabla.
DueDateIndex: la clave de particin es DueDate y no hay clave de ordenacin. Todos los atributos de la
tabla se proyectan en el ndice.

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;

API Version 2012-08-10


498
Amazon DynamoDB Developer Guide
ndices secundarios globales

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";

public static void Main(string[] args)


{
CreateTable();
LoadData();

QueryIndex("CreateDateIndex");
QueryIndex("TitleIndex");
QueryIndex("DueDateIndex");

DeleteTable(tableName);

Console.WriteLine("To continue, press enter");


Console.Read();
}

private static void CreateTable()


{
// Attribute definitions
var attributeDefinitions = new List<AttributeDefinition>()
{
{new AttributeDefinition {
AttributeName = "IssueId", AttributeType = "S"
}},
{new AttributeDefinition {
AttributeName = "Title", AttributeType = "S"
}},
{new AttributeDefinition {
AttributeName = "CreateDate", AttributeType = "S"
}},
{new AttributeDefinition {
AttributeName = "DueDate", AttributeType = "S"
}}
};

// Key schema for table


var tableKeySchema = new List<KeySchemaElement>() {
{
new KeySchemaElement {
AttributeName= "IssueId",
KeyType = "HASH" //Partition key
}
},
{
new KeySchemaElement {
AttributeName = "Title",
KeyType = "RANGE" //Sort key
}
}
};

// Initial provisioned throughput settings for the indexes


var ptIndex = new ProvisionedThroughput

API Version 2012-08-10


499
Amazon DynamoDB Developer Guide
ndices secundarios globales

{
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"
}
};

var createTableRequest = new CreateTableRequest

API Version 2012-08-10


500
Amazon DynamoDB Developer Guide
ndices secundarios globales

{
TableName = tableName,
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = (long)1,
WriteCapacityUnits = (long)1
},
AttributeDefinitions = attributeDefinitions,
KeySchema = tableKeySchema,
GlobalSecondaryIndexes = {
createDateIndex, titleIndex, dueDateIndex
}
};

Console.WriteLine("Creating table " + tableName + "...");


client.CreateTable(createTableRequest);

WaitUntilTableReady(tableName);
}

private static void LoadData()


{
Console.WriteLine("Loading data into table " + tableName + "...");

// IssueId, Title,
// Description,
// CreateDate, LastUpdateDate, DueDate,
// Priority, Status

putItem("A-101", "Compilation error",


"Can't compile Project X - bad version number. What does this mean?",
"2013-11-01", "2013-11-02", "2013-11-10",
1, "Assigned");

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");

putItem("A-103", "Test failure",


"Functional test of Project X produces errors",
"2013-11-01", "2013-11-02", "2013-11-10",
1, "In progress");

putItem("A-104", "Compilation error",


"Variable 'messageCount' was not initialized.",
"2013-11-15", "2013-11-16", "2013-11-30",
3, "Assigned");

putItem("A-105", "Network issue",


"Can't ping IP address 127.0.0.1. Please fix this.",
"2013-11-15", "2013-11-16", "2013-11-19",
5, "Assigned");
}

private static void putItem(


String issueId, String title,
String description,
String createDate, String lastUpdateDate, String dueDate,
Int32 priority, String status)
{
Dictionary<String, AttributeValue> item = new Dictionary<string,
AttributeValue>();

item.Add("IssueId", new AttributeValue


{

API Version 2012-08-10


501
Amazon DynamoDB Developer Guide
ndices secundarios globales

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());
}
}

private static void QueryIndex(string indexName)


{
Console.WriteLine
("\n***********************************************************\n");
Console.WriteLine("Querying index " + indexName + "...");

QueryRequest queryRequest = new QueryRequest


{
TableName = tableName,
IndexName = indexName,
ScanIndexForward = true
};

String keyConditionExpression;
Dictionary<string, AttributeValue> expressionAttributeValues = new
Dictionary<string, AttributeValue>();

if (indexName == "CreateDateIndex")
{
Console.WriteLine("Issues filed on 2013-11-01\n");

API Version 2012-08-10


502
Amazon DynamoDB Developer Guide
ndices secundarios globales

keyConditionExpression = "CreateDate = :v_date and


begins_with(IssueId, :v_issue)";
expressionAttributeValues.Add(":v_date", new AttributeValue
{
S = "2013-11-01"
});
expressionAttributeValues.Add(":v_issue", new AttributeValue
{
S = "A-"
});
}
else if (indexName == "TitleIndex")
{
Console.WriteLine("Compilation errors\n");

keyConditionExpression = "Title = :v_title and


begins_with(IssueId, :v_issue)";
expressionAttributeValues.Add(":v_title", new AttributeValue
{
S = "Compilation error"
});
expressionAttributeValues.Add(":v_issue", new AttributeValue
{
S = "A-"
});

// Select
queryRequest.Select = "ALL_PROJECTED_ATTRIBUTES";
}
else if (indexName == "DueDateIndex")
{
Console.WriteLine("Items that are due on 2013-11-30\n");

keyConditionExpression = "DueDate = :v_date";


expressionAttributeValues.Add(":v_date", new AttributeValue
{
S = "2013-11-30"
});

// Select
queryRequest.Select = "ALL_PROJECTED_ATTRIBUTES";
}
else
{
Console.WriteLine("\nNo valid index name provided");
return;
}

queryRequest.KeyConditionExpression = keyConditionExpression;
queryRequest.ExpressionAttributeValues = expressionAttributeValues;

var result = client.Query(queryRequest);


var items = result.Items;
foreach (var currentItem in items)
{
foreach (string attr in currentItem.Keys)
{
if (attr == "Priority")
{
Console.WriteLine(attr + "---> " + currentItem[attr].N);
}
else
{
Console.WriteLine(attr + "---> " + currentItem[attr].S);
}

API Version 2012-08-10


503
Amazon DynamoDB Developer Guide
ndices secundarios globales

}
Console.WriteLine();
}
}

private static void DeleteTable(string tableName)


{
Console.WriteLine("Deleting table " + tableName + "...");
client.DeleteTable(new DeleteTableRequest
{
TableName = tableName
});
WaitForTableToBeDeleted(tableName);
}

private static void WaitUntilTableReady(string tableName)


{
string status = null;
// Let us wait until table is created. Call DescribeTable.
do
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
catch (ResourceNotFoundException)
{
// DescribeTable is eventually consistent. So you might
// get resource not found. So we handle the potential exception.
}
} while (status != "ACTIVE");
}

private static void WaitForTableToBeDeleted(string tableName)


{
bool tablePresent = true;

while (tablePresent)
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
}
catch (ResourceNotFoundException)
{
tablePresent = false;
}
}
}

API Version 2012-08-10


504
Amazon DynamoDB Developer Guide
ndices secundarios locales

}
}

ndices secundarios locales


Temas
Proyecciones de atributos (p. 507)
Creacin de un ndice secundario local (p. 509)
Consulta de un ndice secundario local (p. 509)
Examen de un ndice secundario local (p. 510)
Escrituras de elementos e ndices secundarios locales (p. 510)
Consideraciones sobre el desempeo provisionado para los ndices secundarios locales (p. 511)
Consideraciones sobre el almacenamiento para los ndices secundarios locales (p. 513)
Colecciones de elementos (p. 513)
Uso de ndices secundarios locales: Java (p. 516)
Uso de ndices secundarios locales: .NET (p. 525)

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

API Version 2012-08-10


505
Amazon DynamoDB Developer Guide
ndices secundarios locales

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:

Qu conversaciones del foro son las que suscitan ms visualizaciones y respuestas?


Qu conversacin de un foro determinado tiene mayor cantidad de mensajes?
Cuntas conversaciones se han publicado en un foro determinado dentro de un periodo concreto?

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 el siguiente diagrama se muestra un local secondary index denominado LastPostIndex. Tenga en


cuenta que la clave de particin es la misma que para la tabla Thread, pero que la clave de ordenacin es
LastPostDateTime.

Cada local secondary index debe cumplir las condiciones siguientes:

La clave de particin ha de ser la misma que aquella de la tabla base.

API Version 2012-08-10


506
Amazon DynamoDB Developer Guide
ndices secundarios locales

La clave de ordenacin consta exactamente de un atributo escalar.


La clave de ordenacin de la tabla base se proyectar en el ndice, donde actuar como atributo sin
clave.

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:

API Version 2012-08-10


507
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

API Version 2012-08-10


508
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

Creacin de un ndice secundario local


Para crear uno o varios ndices secundarios locales en una tabla, se utiliza el parmetro
LocalSecondaryIndexes de la operacin CreateTable. Los ndices secundarios locales de una
tabla se crean al crear esta ltima. Cuando se elimina una tabla, tambin se eliminan todos sus ndices
secundarios locales.

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).

Consulta de un ndice secundario local


En una tabla de DynamoDB, la combinacin de valor de clave de particin y valor de clave de ordenacin
de cada elemento debe ser nica. Sin embargo, en un local secondary index, no es preciso que el valor
de la clave de ordenacin sea exclusivo para un determinado valor de clave de particin. Si un local
secondary index contiene varios elementos que tienen el mismo valor de clave de ordenacin, una
operacin Query devolver todos los elementos que tengan el mismo valor de clave de particin. En la
respuesta, los elementos coincidentes no se devuelven en ningn orden concreto.

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:

API Version 2012-08-10


509
Amazon DynamoDB Developer Guide
ndices secundarios locales

{
"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.

Examen de un ndice secundario local


Puede usar Scan para recuperar todos los datos de un local secondary index. Debe proporcionar el
nombre de la tabla base y el nombre del ndice en la solicitud. Con una operacin Scan, DynamoDB lee
todos los datos del ndice y los devuelve a la aplicacin. Tambin puede solicitar que solo se devuelvan
algunos de los datos y se descarten los dems. Para ello, se utiliza el parmetro FilterExpression del
API Scan. Para obtener ms informacin, consulte Expresiones de filtro para Scan (p. 443).

Escrituras de elementos e ndices secundarios locales


DynamoDB mantiene sincronizados automticamente todos ndices secundarios locales con sus tablas
base respectivas. Las aplicaciones nunca escriben directamente en un ndice. Sin embargo, es importante
comprender las implicaciones de cmo DynamoDB mantiene estos ndices.

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

API Version 2012-08-10


510
Amazon DynamoDB Developer Guide
ndices secundarios locales

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).

Consideraciones sobre el desempeo provisionado para los


ndices secundarios locales
Al crear una tabla en DynamoDB, se provisionan unidades de capacidad de lectura y escritura para la
carga de trabajo prevista de esa tabla. Esta carga de trabajo incluye la actividad de lectura y escritura en
los ndices secundarios locales de la tabla.

Para ver las tarifas vigentes de capacidad de desempeo provisionada, visite https://aws.amazon.com/
dynamodb/precios.

Unidades de capacidad de lectura


Cuando se realiza una consulta en un local secondary index, el nmero de unidades de capacidad de
lectura consumidas depende de cmo se obtiene acceso a los datos.

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

API Version 2012-08-10


511
Amazon DynamoDB Developer Guide
ndices secundarios locales

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:

El tamao de los elementos coincidentes del ndice, redondeado al mltiplo de 4 KB inmediatamente


superior.
El tamao de cada elemento coincidente de la tabla base, redondeado individualmente al mltiplo de 4
KB inmediatamente superior.

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.

Por lo tanto, el tamao total de los datos del resultado es de 20KB.

Unidades de capacidad de escritura


Cuando se agrega, actualiza o elimina un elemento de una tabla, la actualizacin de los ndices
secundarios locales consumir unidades de capacidad de escritura provisionadas para la tabla. El costo
total de desempeo provisionado de una escritura es la suma de las unidades de capacidad de escritura
consumidas al escribir en la tabla y aquellas consumidas al actualizar los ndices secundarios locales.

El costo de escribir un elemento en un local secondary index depende de varios factores:

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.

API Version 2012-08-10


512
Amazon DynamoDB Developer Guide
ndices secundarios locales

Consideraciones sobre el almacenamiento para los ndices


secundarios locales
Cuando una aplicacin escribe un elemento en una tabla, DynamoDB copia automticamente el
subconjunto de atributos en todos los ndices secundarios locales en los que deban aparecer esos
atributos. Se aplica un cargo en su cuenta de AWS por el almacenamiento del elemento en la tabla base y
tambin por el almacenamiento de los atributos en todos los ndices secundarios locales de esa tabla.

La cantidad de espacio utilizado por un elemento de ndice es la suma de lo siguiente:

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 el siguiente diagrama se muestra la coleccin de elementos del foro S3:

API Version 2012-08-10


513
Amazon DynamoDB Developer Guide
ndices secundarios locales

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

API Version 2012-08-10


514
Amazon DynamoDB Developer Guide
ndices secundarios locales

Todas estas operaciones admiten el parmetro ReturnItemCollectionMetrics. Si establece este


parmetro en SIZE, podr ver informacin sobre el tamao de cada coleccin de elementos en el ndice.

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]
}
}

El objeto SizeEstimateRangeGB muestra que el tamao de esta coleccin de elementos est


comprendido entre 0 y 1gigabyte. DynamoDB actualiza peridicamente este clculo del tamao, de modo
que las cifras podran ser distintas la prxima vez que se modifique el elemento.

Lmite de tamao de una coleccin de elementos


El tamao mximo de una coleccin de elementos es de 10 GB. Este lmite no se aplica a las tablas que
no tienen ndices secundarios locales, sino que afecta nicamente a aquellas que tienen uno varios de
estos ndices.

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

API Version 2012-08-10


515
Amazon DynamoDB Developer Guide
ndices secundarios locales

advertencia precoz sistema que le permitir saber qu coleccin de elementos est prxima a alcanzar el
lmite a tiempo para adoptar las medidas pertinentes.

Colecciones de elementos y particiones


Los datos de tabla e ndice de cada coleccin de elementos se guardan en una misma particin. Por
ejemplo, si tomamos el ejemplo de la tabla Thread, todos los elementos de la tabla base y del ndice
cuyos valores del atributo ForumName sean iguales se guardaran en la misma particin. La coleccin de
elementos "S3" se almacenara en una particin, "EC2", en otra, y "RDS", en una tercera.

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).

Uso de ndices secundarios locales: Java


Temas
Creacin de una tabla con un ndice secundario local (p. 516)
Descripcin de una tabla con un ndice secundario local (p. 518)
Consulta de un ndice secundario local (p. 518)
Ejemplo: Uso de ndices secundarios locales mediante el API de documentos de Java (p. 519)

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.

1. Cree una instancia de la clase DynamoDB.


2. Cree los objetos de solicitud correspondientes para proporcionar los parmetros obligatorios y
opcionales de la operacin.
3. Llame al mtodo apropiado proporcionado por el cliente que ha creado en el paso anterior.

Creacin de una tabla con un ndice secundario local


Los ndices secundarios locales se deben crear a la vez que se crea la tabla. Para ello, utilice el mtodo
createTable e indique las especificaciones para uno o varios ndices secundarios locales. En el
fragmento de cdigo Java siguiente, se crea una tabla para contener informacin sobre las canciones
de una coleccin de msica. La clave de particin es Artist y la de ordenacin, SongTitle. Un ndice
secundario, AlbumTitleIndex, facilita las consultas por ttulo de lbum.

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.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase CreateTableRequest para proporcionar la informacin de solicitud.

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.

API Version 2012-08-10


516
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

String tableName = "Music";

CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName);

//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);

ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>();


indexKeySchema.add(new
KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH)); //Partition
key
indexKeySchema.add(new
KeySchemaElement().withAttributeName("AlbumTitle").withKeyType(KeyType.RANGE)); //Sort
key

Projection projection = new Projection().withProjectionType(ProjectionType.INCLUDE);


ArrayList<String> nonKeyAttributes = new ArrayList<String>();
nonKeyAttributes.add("Genre");
nonKeyAttributes.add("Year");
projection.setNonKeyAttributes(nonKeyAttributes);

LocalSecondaryIndex localSecondaryIndex = new LocalSecondaryIndex()

.withIndexName("AlbumTitleIndex").withKeySchema(indexKeySchema).withProjection(projection);

ArrayList<LocalSecondaryIndex> localSecondaryIndexes = new


ArrayList<LocalSecondaryIndex>();
localSecondaryIndexes.add(localSecondaryIndex);
createTableRequest.setLocalSecondaryIndexes(localSecondaryIndexes);

Table table = dynamoDB.createTable(createTableRequest);


System.out.println(table.getDescription());

API Version 2012-08-10


517
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

Descripcin de una tabla con un ndice secundario local


Para obtener informacin acerca de los ndices secundarios locales de una tabla, use el mtodo
describeTable. Para cada ndice, puede obtener acceso a su nombre, esquema de claves y atributos
proyectados.

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.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table. Debe proporcionar el nombre de la tabla.
3. Llame al mtodo describeTable del objeto Table.

En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

String tableName = "Music";

Table table = dynamoDB.getTable(tableName);

TableDescription tableDescription = table.describe();

List<LocalSecondaryIndexDescription> localSecondaryIndexes
= tableDescription.getLocalSecondaryIndexes();

// This code snippet will work for multiple indexes, even though
// there is only one index in this example.

Iterator<LocalSecondaryIndexDescription> lsiIter = localSecondaryIndexes.iterator();


while (lsiIter.hasNext()) {

LocalSecondaryIndexDescription lsiDescription = lsiIter.next();


System.out.println("Info for index " + lsiDescription.getIndexName() + ":");
Iterator<KeySchemaElement> kseIter = lsiDescription.getKeySchema().iterator();
while (kseIter.hasNext()) {
KeySchemaElement kse = kseIter.next();
System.out.printf("\t%s: %s\n", kse.getAttributeName(), kse.getKeyType());
}
Projection projection = lsiDescription.getProjection();
System.out.println("\tThe projection type is: " + projection.getProjectionType());
if (projection.getProjectionType().toString().equals("INCLUDE")) {
System.out.println("\t\tThe non-key projected attributes are: " +
projection.getNonKeyAttributes());
}
}

Consulta de un ndice secundario local


Puede utilizar la operacin Query en un local secondary index de un modo bastante parecido a como
Query se usa en una tabla. Debe especificar el nombre del ndice, los criterios de consulta de la clave de
ordenacin del ndice y los atributos que desea devolver. En este ejemplo, el ndice es AlbumTitleIndex y la
clave de ordenacin del ndice es AlbumTitle.

API Version 2012-08-10


518
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

1. Cree una instancia de la clase DynamoDB.


2. Cree una instancia de la clase Table. Debe proporcionar el nombre de la tabla.
3. Cree una instancia de la clase Index. Debe proporcionar el nombre del ndice.
4. Llame al mtodo query de la clase Index.

En el siguiente fragmento de cdigo Java se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


DynamoDB dynamoDB = new DynamoDB(client);

String tableName = "Music";

Table table = dynamoDB.getTable(tableName);


Index index = table.getIndex("AlbumTitleIndex");

QuerySpec spec = new QuerySpec()


.withKeyConditionExpression("Artist = :v_artist and AlbumTitle = :v_title")
.withValueMap(new ValueMap()
.withString(":v_artist", "Acme Band")
.withString(":v_title", "Songs About Life"));

ItemCollection<QueryOutcome> items = index.query(spec);

Iterator<Item> itemsIter = items.iterator();

while (itemsIter.hasNext()) {
Item item = itemsIter.next();
System.out.println(item.toJSONPretty());
}

Ejemplo: Uso de ndices secundarios locales mediante el API de documentos de


Java
En el siguiente ejemplo de cdigo Java se muestra cmo usar ndices secundarios locales. En el ejemplo
se crea una tabla denominada CustomerOrders cuya clave de particin es CustomerId y cuya clave de
ordenacin es OrderId. Existen dos ndices secundarios locales en esta tabla:

OrderCreationDateIndex: la clave de ordenacin es OrderCreationDate y los atributos siguientes se


proyectan en el ndice.
ProductCategory
ProductName
OrderStatus
ShipmentTrackingId
IsOpenIndex: la clave de ordenacin es IsOpen y todos los atributos de la tabla se proyectan en el
ndice.

API Version 2012-08-10


519
Amazon DynamoDB Developer Guide
ndices secundarios locales

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

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples.document;

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;

public class DocumentAPILocalSecondaryIndexExample {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

public static String tableName = "CustomerOrders";

public static void main(String[] args) throws Exception {

createTable();
loadData();

query(null);
query("IsOpenIndex");
query("OrderCreationDateIndex");

deleteTable(tableName);

public static void createTable() {

CreateTableRequest createTableRequest = new


CreateTableRequest().withTableName(tableName)
.withProvisionedThroughput(
new ProvisionedThroughput().withReadCapacityUnits((long)
1).withWriteCapacityUnits((long) 1));

API Version 2012-08-10


520
Amazon DynamoDB Developer Guide
ndices secundarios locales

// Attribute definitions for table partition and sort keys


ArrayList<AttributeDefinition> attributeDefinitions = new
ArrayList<AttributeDefinition>();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("CustomerId").withAttributeType("S"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("OrderId").withAttributeType("N"));

// Attribute definition for index primary key attributes


attributeDefinitions
.add(new
AttributeDefinition().withAttributeName("OrderCreationDate").withAttributeType("N"));
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("IsOpen").withAttributeType("N"));

createTableRequest.setAttributeDefinitions(attributeDefinitions);

// Key schema for table


ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>();
tableKeySchema.add(new
KeySchemaElement().withAttributeName("CustomerId").withKeyType(KeyType.HASH)); //
Partition

// key
tableKeySchema.add(new
KeySchemaElement().withAttributeName("OrderId").withKeyType(KeyType.RANGE)); // Sort

// key

createTableRequest.setKeySchema(tableKeySchema);

ArrayList<LocalSecondaryIndex> localSecondaryIndexes = new


ArrayList<LocalSecondaryIndex>();

// OrderCreationDateIndex
LocalSecondaryIndex orderCreationDateIndex = new
LocalSecondaryIndex().withIndexName("OrderCreationDateIndex");

// Key schema for OrderCreationDateIndex


ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>();
indexKeySchema.add(new
KeySchemaElement().withAttributeName("CustomerId").withKeyType(KeyType.HASH)); //
Partition

// key
indexKeySchema.add(new
KeySchemaElement().withAttributeName("OrderCreationDate").withKeyType(KeyType.RANGE)); //
Sort

// key

orderCreationDateIndex.setKeySchema(indexKeySchema);

// Projection (with list of projected attributes) for


// OrderCreationDateIndex
Projection projection = new
Projection().withProjectionType(ProjectionType.INCLUDE);
ArrayList<String> nonKeyAttributes = new ArrayList<String>();
nonKeyAttributes.add("ProductCategory");
nonKeyAttributes.add("ProductName");
projection.setNonKeyAttributes(nonKeyAttributes);

orderCreationDateIndex.setProjection(projection);

localSecondaryIndexes.add(orderCreationDateIndex);

API Version 2012-08-10


521
Amazon DynamoDB Developer Guide
ndices secundarios locales

// IsOpenIndex
LocalSecondaryIndex isOpenIndex = new
LocalSecondaryIndex().withIndexName("IsOpenIndex");

// Key schema for IsOpenIndex


indexKeySchema = new ArrayList<KeySchemaElement>();
indexKeySchema.add(new
KeySchemaElement().withAttributeName("CustomerId").withKeyType(KeyType.HASH)); //
Partition

// key
indexKeySchema.add(new
KeySchemaElement().withAttributeName("IsOpen").withKeyType(KeyType.RANGE)); // Sort

// key

// Projection (all attributes) for IsOpenIndex


projection = new Projection().withProjectionType(ProjectionType.ALL);

isOpenIndex.setKeySchema(indexKeySchema);
isOpenIndex.setProjection(projection);

localSecondaryIndexes.add(isOpenIndex);

// Add index definitions to CreateTable request


createTableRequest.setLocalSecondaryIndexes(localSecondaryIndexes);

System.out.println("Creating table " + tableName + "...");


System.out.println(dynamoDB.createTable(createTableRequest));

// Wait for table to become active


System.out.println("Waiting for " + tableName + " to become ACTIVE...");
try {
Table table = dynamoDB.getTable(tableName);
table.waitForActive();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void query(String indexName) {

Table table = dynamoDB.getTable(tableName);

System.out.println("\n***********************************************************
\n");
System.out.println("Querying table " + tableName + "...");

QuerySpec querySpec = new


QuerySpec().withConsistentRead(true).withScanIndexForward(true)
.withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL);

if (indexName == "IsOpenIndex") {

System.out.println("\nUsing index: '" + indexName + "': Bob's orders that are


open.");
System.out.println("Only a user-specified list of attributes are returned\n");
Index index = table.getIndex(indexName);

querySpec.withKeyConditionExpression("CustomerId = :v_custid and IsOpen


= :v_isopen")
.withValueMap(new ValueMap().withString(":v_custid",
"bob@example.com").withNumber(":v_isopen", 1));

API Version 2012-08-10


522
Amazon DynamoDB Developer Guide
ndices secundarios locales

querySpec.withProjectionExpression("OrderCreationDate, ProductCategory,
ProductName, OrderStatus");

ItemCollection<QueryOutcome> items = index.query(querySpec);


Iterator<Item> iterator = items.iterator();

System.out.println("Query: printing results...");

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.withKeyConditionExpression("CustomerId = :v_custid and


OrderCreationDate >= :v_orddate")
.withValueMap(
new ValueMap().withString(":v_custid",
"bob@example.com").withNumber(":v_orddate", 20150131));

querySpec.withSelect(Select.ALL_PROJECTED_ATTRIBUTES);

ItemCollection<QueryOutcome> items = index.query(querySpec);


Iterator<Item> iterator = items.iterator();

System.out.println("Query: printing results...");

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"));

ItemCollection<QueryOutcome> items = table.query(querySpec);


Iterator<Item> iterator = items.iterator();

System.out.println("Query: printing results...");

while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}

public static void deleteTable(String tableName) {

Table table = dynamoDB.getTable(tableName);


System.out.println("Deleting table " + tableName + "...");
table.delete();

// Wait for table to be deleted


System.out.println("Waiting for " + tableName + " to be deleted...");
try {
table.waitForDelete();

API Version 2012-08-10


523
Amazon DynamoDB Developer Guide
ndices secundarios locales

}
catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void loadData() {

Table table = dynamoDB.getTable(tableName);

System.out.println("Loading data into table " + tableName + "...");

Item item = new Item().withPrimaryKey("CustomerId",


"alice@example.com").withNumber("OrderId", 1)
.withNumber("IsOpen", 1).withNumber("OrderCreationDate",
20150101).withString("ProductCategory", "Book")
.withString("ProductName", "The Great Outdoors").withString("OrderStatus",
"PACKING ITEMS");
// no ShipmentTrackingId attribute

PutItemOutcome putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"alice@example.com").withNumber("OrderId", 2)
.withNumber("IsOpen", 1).withNumber("OrderCreationDate",
20150221).withString("ProductCategory", "Bike")
.withString("ProductName", "Super Mountain").withString("OrderStatus", "ORDER
RECEIVED");
// no ShipmentTrackingId attribute

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"alice@example.com").withNumber("OrderId", 3)
// no IsOpen attribute
.withNumber("OrderCreationDate", 20150304).withString("ProductCategory",
"Music")
.withString("ProductName", "A Quiet Interlude").withString("OrderStatus", "IN
TRANSIT")
.withString("ShipmentTrackingId", "176493");

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 1)
// no IsOpen attribute
.withNumber("OrderCreationDate", 20150111).withString("ProductCategory",
"Movie")
.withString("ProductName", "Calm Before The Storm").withString("OrderStatus",
"SHIPPING DELAY")
.withString("ShipmentTrackingId", "859323");

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 2)
// no IsOpen attribute
.withNumber("OrderCreationDate", 20150124).withString("ProductCategory",
"Music")
.withString("ProductName", "E-Z Listening").withString("OrderStatus",
"DELIVERED")
.withString("ShipmentTrackingId", "756943");

putItemOutcome = table.putItem(item);

API Version 2012-08-10


524
Amazon DynamoDB Developer Guide
ndices secundarios locales

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 3)
// no IsOpen attribute
.withNumber("OrderCreationDate", 20150221).withString("ProductCategory",
"Music")
.withString("ProductName", "Symphony 9").withString("OrderStatus", "DELIVERED")
.withString("ShipmentTrackingId", "645193");

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 4)
.withNumber("IsOpen", 1).withNumber("OrderCreationDate",
20150222).withString("ProductCategory", "Hardware")
.withString("ProductName", "Extra Heavy Hammer").withString("OrderStatus",
"PACKING ITEMS");
// no ShipmentTrackingId attribute

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 5)
/* no IsOpen attribute */
.withNumber("OrderCreationDate", 20150309).withString("ProductCategory",
"Book")
.withString("ProductName", "How To Cook").withString("OrderStatus", "IN
TRANSIT")
.withString("ShipmentTrackingId", "440185");

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 6)
// no IsOpen attribute
.withNumber("OrderCreationDate", 20150318).withString("ProductCategory",
"Luggage")
.withString("ProductName", "Really Big Suitcase").withString("OrderStatus",
"DELIVERED")
.withString("ShipmentTrackingId", "893927");

putItemOutcome = table.putItem(item);

item = new Item().withPrimaryKey("CustomerId",


"bob@example.com").withNumber("OrderId", 7)
/* no IsOpen attribute */
.withNumber("OrderCreationDate", 20150324).withString("ProductCategory",
"Golf")
.withString("ProductName", "PGA Pro II").withString("OrderStatus", "OUT FOR
DELIVERY")
.withString("ShipmentTrackingId", "383283");

putItemOutcome = table.putItem(item);
assert putItemOutcome != null;
}

Uso de ndices secundarios locales: .NET


Temas
Creacin de una tabla con un ndice secundario local (p. 526)
Descripcin de una tabla con un ndice secundario local (p. 528)
Consulta de un ndice secundario local (p. 528)

API Version 2012-08-10


525
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree los objetos de solicitud correspondientes para proporcionar los parmetros obligatorios y
opcionales de la operacin.

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.

Creacin de una tabla con un ndice secundario local


Los ndices secundarios locales se deben crear a la vez que se crea la tabla. Para ello, utilice
CreateTable e indique las especificaciones para uno o varios ndices secundarios locales. En el
fragmento de cdigo C# siguiente, se crea una tabla para contener informacin sobre las canciones de una
coleccin de msica. La clave de particin es Artist y la de ordenacin, SongTitle. Un ndice secundario,
AlbumTitleIndex, facilita las consultas por ttulo de lbum.

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase CreateTableRequest para proporcionar la informacin de solicitud.

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.

En el siguiente fragmento de cdigo C# 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.

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "Music";

CreateTableRequest createTableRequest = new CreateTableRequest()


{
TableName = tableName
};

//ProvisionedThroughput
createTableRequest.ProvisionedThroughput = new ProvisionedThroughput()
{
ReadCapacityUnits = (long)5,
WriteCapacityUnits = (long)5

API Version 2012-08-10


526
Amazon DynamoDB Developer Guide
ndices secundarios locales

};

//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>();

tableKeySchema.Add(new KeySchemaElement() { AttributeName = "Artist", KeyType = "HASH" });


//Partition key
tableKeySchema.Add(new KeySchemaElement() { AttributeName = "SongTitle", KeyType =
"RANGE" }); //Sort key

createTableRequest.KeySchema = tableKeySchema;

List<KeySchemaElement> indexKeySchema = new List<KeySchemaElement>();


indexKeySchema.Add(new KeySchemaElement() { AttributeName = "Artist", KeyType = "HASH" });
//Partition key
indexKeySchema.Add(new KeySchemaElement() { AttributeName = "AlbumTitle", KeyType =
"RANGE" }); //Sort key

Projection projection = new Projection() { ProjectionType = "INCLUDE" };

List<string> nonKeyAttributes = new List<string>();


nonKeyAttributes.Add("Genre");
nonKeyAttributes.Add("Year");
projection.NonKeyAttributes = nonKeyAttributes;

LocalSecondaryIndex localSecondaryIndex = new LocalSecondaryIndex()


{
IndexName = "AlbumTitleIndex",
KeySchema = indexKeySchema,
Projection = projection
};

List<LocalSecondaryIndex> localSecondaryIndexes = new List<LocalSecondaryIndex>();


localSecondaryIndexes.Add(localSecondaryIndex);
createTableRequest.LocalSecondaryIndexes = localSecondaryIndexes;

CreateTableResponse result = client.CreateTable(createTableRequest);


Console.WriteLine(result.CreateTableResult.TableDescription.TableName);
Console.WriteLine(result.CreateTableResult.TableDescription.TableStatus);

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.

API Version 2012-08-10


527
Amazon DynamoDB Developer Guide
ndices secundarios locales

Descripcin de una tabla con un ndice secundario local


Para obtener informacin acerca de los ndices secundarios locales de una tabla, use el API
DescribeTable. Para cada ndice, puede obtener acceso a su nombre, esquema de claves y atributos
proyectados.

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase DescribeTableRequest para proporcionar la informacin de solicitud.
Debe proporcionar el nombre de la tabla.
3. Ejecute el mtodo describeTable proporcionando el objeto de solicitud como parmetro.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores.

Example

AmazonDynamoDBClient client = new AmazonDynamoDBClient();


string tableName = "Music";

DescribeTableResponse response = client.DescribeTable(new DescribeTableRequest()


{ TableName = tableName });
List<LocalSecondaryIndexDescription> localSecondaryIndexes =
response.DescribeTableResult.Table.LocalSecondaryIndexes;

// 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 + ":");

foreach (KeySchemaElement kse in lsiDescription.KeySchema)


{
Console.WriteLine("\t" + kse.AttributeName + ": key type is " + kse.KeyType);
}

Projection projection = lsiDescription.Projection;

Console.WriteLine("\tThe projection type is: " + projection.ProjectionType);

if (projection.ProjectionType.ToString().Equals("INCLUDE"))
{
Console.WriteLine("\t\tThe non-key projected attributes are:");

foreach (String s in projection.NonKeyAttributes)


{
Console.WriteLine("\t\t" + s);
}

}
}

Consulta de un ndice secundario local


Query se puede utilizar en un local secondary index de un modo bastante parecido a como Query se usa
en una tabla. Debe especificar el nombre del ndice, los criterios de consulta de la clave de ordenacin
del ndice y los atributos que desea devolver. En este ejemplo, el ndice es AlbumTitleIndex y la clave de
ordenacin del ndice es AlbumTitle.

API Version 2012-08-10


528
Amazon DynamoDB Developer Guide
ndices secundarios locales

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.

1. Cree una instancia de la clase AmazonDynamoDBClient.


2. Cree una instancia de la clase QueryRequest para proporcionar la informacin de solicitud.
3. Ejecute el mtodo query proporcionando el objeto de solicitud como parmetro.

En el siguiente fragmento de cdigo C# se ponen en prctica los pasos anteriores.

Example

QueryRequest queryRequest = new QueryRequest


{
TableName = "Music",
IndexName = "AlbumTitleIndex",
Select = "ALL_ATTRIBUTES",
ScanIndexForward = true,
KeyConditionExpression = "Artist = :v_artist and AlbumTitle = :v_title",
ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
{
{":v_artist",new AttributeValue {S = "Acme Band"}},
{":v_title",new AttributeValue {S = "Songs About Life"}}
},
};

QueryResponse response = client.Query(queryRequest);

foreach (var attribs in response.Items)


{
foreach (var attrib in attribs)
{
Console.WriteLine(attrib.Key + " ---> " + attrib.Value.S);
}
Console.WriteLine();
}

Ejemplo: Creacin de ndices secundarios locales mediante el API de bajo nivel


del AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se muestra cmo usar ndices secundarios locales. En el ejemplo
se crea una tabla denominada CustomerOrders cuya clave de particin es CustomerId y cuya clave de
ordenacin es OrderId. Existen dos ndices secundarios locales en esta tabla:

OrderCreationDateIndex: la clave de ordenacin es OrderCreationDate y los atributos siguientes se


proyectan en el ndice.
ProductCategory
ProductName
OrderStatus
ShipmentTrackingId
IsOpenIndex: la clave de ordenacin es IsOpen y todos los atributos de la tabla se proyectan en el
ndice.

API Version 2012-08-10


529
Amazon DynamoDB Developer Guide
ndices secundarios locales

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";

static void Main(string[] args)


{
try
{
CreateTable();
LoadData();

Query(null);
Query("IsOpenIndex");
Query("OrderCreationDateIndex");

DeleteTable(tableName);

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); }
}

private static void CreateTable()


{
var createTableRequest =
new CreateTableRequest()
{
TableName = tableName,
ProvisionedThroughput =
new ProvisionedThroughput()
{
ReadCapacityUnits = (long)1,
WriteCapacityUnits = (long)1
}
};

var attributeDefinitions = new List<AttributeDefinition>()


{
// Attribute definitions for table primary key

API Version 2012-08-10


530
Amazon DynamoDB Developer Guide
ndices secundarios locales

{ 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;

// Key schema for table


var tableKeySchema = new List<KeySchemaElement>()
{
{ new KeySchemaElement() {
AttributeName = "CustomerId", KeyType = "HASH"
} }, //Partition key
{ new KeySchemaElement() {
AttributeName = "OrderId", KeyType = "RANGE"
} } //Sort key
};

createTableRequest.KeySchema = tableKeySchema;

var localSecondaryIndexes = new List<LocalSecondaryIndex>();

// OrderCreationDateIndex
LocalSecondaryIndex orderCreationDateIndex = new LocalSecondaryIndex()
{
IndexName = "OrderCreationDateIndex"
};

// Key schema for OrderCreationDateIndex


var indexKeySchema = new List<KeySchemaElement>()
{
{ new KeySchemaElement() {
AttributeName = "CustomerId", KeyType = "HASH"
} }, //Partition key
{ new KeySchemaElement() {
AttributeName = "OrderCreationDate", KeyType = "RANGE"
} } //Sort key
};

orderCreationDateIndex.KeySchema = indexKeySchema;

// Projection (with list of projected attributes) for


// OrderCreationDateIndex
var projection = new Projection()
{
ProjectionType = "INCLUDE"
};

var nonKeyAttributes = new List<string>()


{
"ProductCategory",
"ProductName"
};
projection.NonKeyAttributes = nonKeyAttributes;

orderCreationDateIndex.Projection = projection;

API Version 2012-08-10


531
Amazon DynamoDB Developer Guide
ndices secundarios locales

localSecondaryIndexes.Add(orderCreationDateIndex);

// IsOpenIndex
LocalSecondaryIndex isOpenIndex
= new LocalSecondaryIndex()
{
IndexName = "IsOpenIndex"
};

// Key schema for IsOpenIndex


indexKeySchema = new List<KeySchemaElement>()
{
{ new KeySchemaElement() {
AttributeName = "CustomerId", KeyType = "HASH"
}}, //Partition key
{ new KeySchemaElement() {
AttributeName = "IsOpen", KeyType = "RANGE"
}} //Sort key
};

// Projection (all attributes) for IsOpenIndex


projection = new Projection()
{
ProjectionType = "ALL"
};

isOpenIndex.KeySchema = indexKeySchema;
isOpenIndex.Projection = projection;

localSecondaryIndexes.Add(isOpenIndex);

// Add index definitions to CreateTable request


createTableRequest.LocalSecondaryIndexes = localSecondaryIndexes;

Console.WriteLine("Creating table " + tableName + "...");


client.CreateTable(createTableRequest);
WaitUntilTableReady(tableName);
}

public static void Query(string indexName)


{

Console.WriteLine("\n***********************************************************\n");
Console.WriteLine("Querying table " + tableName + "...");

QueryRequest queryRequest = new QueryRequest()


{
TableName = tableName,
ConsistentRead = true,
ScanIndexForward = true,
ReturnConsumedCapacity = "TOTAL"
};

String keyConditionExpression = "CustomerId = :v_customerId";


Dictionary<string, AttributeValue> expressionAttributeValues = new
Dictionary<string, AttributeValue> {
{":v_customerId", new AttributeValue {
S = "bob@example.com"
}}
};

if (indexName == "IsOpenIndex")
{

API Version 2012-08-10


532
Amazon DynamoDB Developer Guide
ndices secundarios locales

Console.WriteLine("\nUsing index: '" + indexName


+ "': Bob's orders that are open.");
Console.WriteLine("Only a user-specified list of attributes are returned
\n");
queryRequest.IndexName = indexName;

keyConditionExpression += " and IsOpen = :v_isOpen";


expressionAttributeValues.Add(":v_isOpen", new AttributeValue
{
N = "1"
});

// 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;

keyConditionExpression += " and OrderCreationDate > :v_Date";


expressionAttributeValues.Add(":v_Date", new AttributeValue
{
N = "20130131"
});

// 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;

var result = client.Query(queryRequest);


var items = result.Items;
foreach (var currentItem in items)
{
foreach (string attr in currentItem.Keys)
{
if (attr == "OrderId" || attr == "IsOpen"
|| attr == "OrderCreationDate")
{
Console.WriteLine(attr + "---> " + currentItem[attr].N);
}
else
{
Console.WriteLine(attr + "---> " + currentItem[attr].S);
}
}
Console.WriteLine();
}
Console.WriteLine("\nConsumed capacity: " +
result.ConsumedCapacity.CapacityUnits + "\n");
}

private static void DeleteTable(string tableName)


{
Console.WriteLine("Deleting table " + tableName + "...");
client.DeleteTable(new DeleteTableRequest()
{

API Version 2012-08-10


533
Amazon DynamoDB Developer Guide
ndices secundarios locales

TableName = tableName
});
WaitForTableToBeDeleted(tableName);
}

public static void LoadData()


{
Console.WriteLine("Loading data into table " + tableName + "...");

Dictionary<string, AttributeValue> item = new Dictionary<string,


AttributeValue>();

item["CustomerId"] = new AttributeValue


{
S = "alice@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "1"
};
item["IsOpen"] = new AttributeValue
{
N = "1"
};
item["OrderCreationDate"] = new AttributeValue
{
N = "20130101"
};
item["ProductCategory"] = new AttributeValue
{
S = "Book"
};
item["ProductName"] = new AttributeValue
{
S = "The Great Outdoors"
};
item["OrderStatus"] = new AttributeValue
{
S = "PACKING ITEMS"
};
/* no ShipmentTrackingId attribute */
PutItemRequest putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "alice@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "2"
};
item["IsOpen"] = new AttributeValue
{
N = "1"
};
item["OrderCreationDate"] = new AttributeValue
{
N = "20130221"
};

API Version 2012-08-10


534
Amazon DynamoDB Developer Guide
ndices secundarios locales

item["ProductCategory"] = new AttributeValue


{
S = "Bike"
};
item["ProductName"] = new AttributeValue
{
S = "Super Mountain"
};
item["OrderStatus"] = new AttributeValue
{
S = "ORDER RECEIVED"
};
/* no ShipmentTrackingId attribute */
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "alice@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "3"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130304"
};
item["ProductCategory"] = new AttributeValue
{
S = "Music"
};
item["ProductName"] = new AttributeValue
{
S = "A Quiet Interlude"
};
item["OrderStatus"] = new AttributeValue
{
S = "IN TRANSIT"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "176493"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{

API Version 2012-08-10


535
Amazon DynamoDB Developer Guide
ndices secundarios locales

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);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "2"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130124"
};
item["ProductCategory"] = new AttributeValue
{
S = "Music"
};
item["ProductName"] = new AttributeValue
{
S = "E-Z Listening"
};
item["OrderStatus"] = new AttributeValue
{
S = "DELIVERED"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "756943"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"

API Version 2012-08-10


536
Amazon DynamoDB Developer Guide
ndices secundarios locales

};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "3"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130221"
};
item["ProductCategory"] = new AttributeValue
{
S = "Music"
};
item["ProductName"] = new AttributeValue
{
S = "Symphony 9"
};
item["OrderStatus"] = new AttributeValue
{
S = "DELIVERED"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "645193"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "4"
};
item["IsOpen"] = new AttributeValue
{
N = "1"
};
item["OrderCreationDate"] = new AttributeValue
{
N = "20130222"
};
item["ProductCategory"] = new AttributeValue
{
S = "Hardware"
};
item["ProductName"] = new AttributeValue
{
S = "Extra Heavy Hammer"
};

API Version 2012-08-10


537
Amazon DynamoDB Developer Guide
ndices secundarios locales

item["OrderStatus"] = new AttributeValue


{
S = "PACKING ITEMS"
};
/* no ShipmentTrackingId attribute */
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "5"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130309"
};
item["ProductCategory"] = new AttributeValue
{
S = "Book"
};
item["ProductName"] = new AttributeValue
{
S = "How To Cook"
};
item["OrderStatus"] = new AttributeValue
{
S = "IN TRANSIT"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "440185"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "6"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130318"
};
item["ProductCategory"] = new AttributeValue

API Version 2012-08-10


538
Amazon DynamoDB Developer Guide
ndices secundarios locales

{
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);

item = new Dictionary<string, AttributeValue>();


item["CustomerId"] = new AttributeValue
{
S = "bob@example.com"
};
item["OrderId"] = new AttributeValue
{
N = "7"
};
/* no IsOpen attribute */
item["OrderCreationDate"] = new AttributeValue
{
N = "20130324"
};
item["ProductCategory"] = new AttributeValue
{
S = "Golf"
};
item["ProductName"] = new AttributeValue
{
S = "PGA Pro II"
};
item["OrderStatus"] = new AttributeValue
{
S = "OUT FOR DELIVERY"
};
item["ShipmentTrackingId"] = new AttributeValue
{
S = "383283"
};
putItemRequest = new PutItemRequest
{
TableName = tableName,
Item = item,
ReturnItemCollectionMetrics = "SIZE"
};
client.PutItem(putItemRequest);
}

private static void WaitUntilTableReady(string tableName)


{
string status = null;
// Let us wait until table is created. Call DescribeTable.

API Version 2012-08-10


539
Amazon DynamoDB Developer Guide
Uso de secuencias

do
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
catch (ResourceNotFoundException)
{
// DescribeTable is eventually consistent. So you might
// get resource not found. So we handle the potential exception.
}
} while (status != "ACTIVE");
}

private static void WaitForTableToBeDeleted(string tableName)


{
bool tablePresent = true;

while (tablePresent)
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest
{
TableName = tableName
});

Console.WriteLine("Table name: {0}, status: {1}",


res.Table.TableName,
res.Table.TableStatus);
}
catch (ResourceNotFoundException)
{
tablePresent = false;
}
}
}
}
}

Captura de la actividad de las tablas con Flujos de


DynamoDB
Muchas aplicaciones pueden beneficiarse de la posibilidad de capturar los cambios en los elementos
almacenados en una tabla de DynamoDB en el momento en que se producen. A continuacin se muestran
algunos ejemplos de casos de uso:

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.

API Version 2012-08-10


540
Amazon DynamoDB Developer Guide
Uso de secuencias

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 garantiza lo siguiente:

Cada registro de secuencia aparece una nica vez en la secuencia.


Para cada elemento que se modifica de una tabla de DynamoDB, los registros de secuencia aparecen
en el mismo orden en que se han realizado las modificaciones del elemento.

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.

API Version 2012-08-10


541
Amazon DynamoDB Developer Guide
Puntos de enlace de Flujos de DynamoDB

Puntos de enlace de Flujos de DynamoDB

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.

La convencin de nomenclatura de los puntos de enlace de Flujos de DynamoDB es


streams.dynamodb.<region>.amazonaws.com. Por ejemplo, si usa el punto de enlace
dynamodb.us-west-2.amazonaws.com para obtener acceso a DynamoDB, usara el punto de enlace
streams.dynamodb.us-west-2.amazonaws.com para obtener acceso a Flujos de DynamoDB.
Note

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.

Habilitacin de una secuencia


Puede habilitar una secuencia en una nueva tabla al crearla. Tambin puede habilitar o deshabilitar
una secuencia en una tabla existente, as como cambiar la configuracin de una secuencia. Flujos de

API Version 2012-08-10


542
Amazon DynamoDB Developer Guide
Habilitacin de una secuencia

DynamoDB opera de forma asincrnica, por lo que el desempeo de una tabla no se vea afectado al
habilitar una secuencia.

La forma ms sencilla de administrar Flujos de DynamoDB es usar la Consola de administracin de AWS.

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de la consola de DynamoDB, elija Tables.
3. En la pestaa Overview, elija Manage Stream.
4. En la ventana Manage Stream, elija 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.

Cuando la configuracin sea la que desea, elija Enable.


5. (Opcional) Para deshabilitar una secuencia existente, elija Manage Stream y, a continuacin,
seleccione Disable.

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.

API Version 2012-08-10


543
Amazon DynamoDB Developer Guide
Lectura y procesamiento de secuencias

Lectura y procesamiento de secuencias


Para leer y procesar una secuencia, la aplicacin tiene que conectarse a un punto de enlace de Flujos de
DynamoDB y emitir solicitudes de API.

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.

Si se deshabilita una secuencia, todos fragmentos que estn abiertos se cerrarn.

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.

API Version 2012-08-10


544
Amazon DynamoDB Developer Guide
Flujos de DynamoDB y Tiempo de vida

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:

ListStreams: devuelve una lista de descriptores de secuencia de la cuenta y el punto de enlace


actuales. Si lo desea, puede solicitar nicamente los descriptores de secuencia de un nombre de tabla
concreto.
DescribeStream: devuelve informacin detallada sobre una secuencia determinada. El resultado
incluye una lista de fragmentos asociados a la secuencia, con sus identificadores.
GetShardIterator: devuelve un iterador de fragmentos que describe una ubicacin en el fragmento.
Puede solicitar que el iterador proporcione acceso al punto ms antiguo, al punto ms reciente o a un
punto concreto de la secuencia.
GetRecords: devuelve los registros de secuencia de un fragmento determinado. Debe proporcionar el
iterador de fragmentos devuelto por una solicitud GetShardIterator.

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.

Lmite de retencin de datos en Flujos de DynamoDB


Todos los datos de Flujos de DynamoDB estn sujetos a una vida til de 24horas. Puede recuperar y
analizar las ltimas 24horas de actividad de cada tabla; sin embargo, los datos de ms de 24horas se
pueden recortar (eliminar) en cualquier momento.

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.

Flujos de DynamoDB y Tiempo de vida


Puede realizar backups o procesar de otro modo los elementos eliminados por Tiempo de vida si habilita
Amazon DynamoDB Streams en la tabla y procesa los registros Streams de los elementos vencidos.

API Version 2012-08-10


545
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

El registro Streams contiene el campo de identidad del usuario Records[<index>].userIdentity.

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"

En el cdigo JSON siguiente se muestra la parte pertinente de un registro Streams nico.

"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.

Uso de Flujos de DynamoDB Kinesis Adapter para


procesar registros de secuencia
Usar Kinesis Adapter es la forma recomendada de consumir secuencias de DynamoDB.

El API de Flujos de DynamoDB es intencionadamente similar a la de Kinesis Streams, un servicio para


procesar datos de streaming a escala masiva en tiempo real. En ambos servicios, las secuencias de datos
se componen de fragmentos, que son los contenedores de los registros de secuencia. Los API de ambos
servicios contienen acciones ListStreams, DescribeStream, GetShards y GetShardIterator.
Aunque estas acciones de Flujos de DynamoDB son parecidas a sus homlogas de Kinesis Streams, no
son idnticas al 100%.

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.

En el siguiente diagrama se muestra cmo interaccionan estas bibliotecas entre s.

API Version 2012-08-10


546
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

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.

API Version 2012-08-10


547
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

Genera puntos de comprobacin para los registros procesados.


Balancea las asociaciones entre fragmentos y procesos de trabajo cuando cambia el recuento de
instancias de procesos de trabajo.
Balancea las asociaciones entre fragmentos y procesos de trabajo cuando los fragmentos se dividen.

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.

Tutorial: Flujos de DynamoDB Kinesis Adapter


En esta seccin se recorre paso a paso una aplicacin Java en la que se utiliza Kinesis Client Library y
Flujos de DynamoDB Kinesis Adapter. En la aplicacin se muestra un ejemplo de la replicacin de datos,
donde la actividad de escritura de una tabla se aplica a una segunda tabla, de tal forma que el contenido
de ambas se mantiene sincronizado. Para obtener el cdigo fuente, consulte Programa completo: Flujos de
DynamoDB Kinesis Adapter (p. 551).

El programa realiza lo siguiente:

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)

Paso1: Crear tablas de DynamoDB


El primer paso consiste en crear dos tablas de DynamoDB, una de origen y una de destino. El tipo
StreamViewType de la secuencia de la tabla de origen es NEW_IMAGE, lo que significa que cada vez que
se modifica un elemento en esta tabla, su imagen de "despus" se escribe en la secuencia. De esta forma,
se realiza un seguimiento en la secuencia de todas las actividades de escritura en la tabla.

En el siguiente fragmento de cdigo se muestra el cdigo utilizado para crear las dos tablas.

java.util.List<AttributeDefinition> attributeDefinitions = new


ArrayList<AttributeDefinition>();

API Version 2012-08-10


548
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));

java.util.List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH)); //
Partition
//
key

ProvisionedThroughput provisionedThroughput = new


ProvisionedThroughput().withReadCapacityUnits(2L)
.withWriteCapacityUnits(2L);

StreamSpecification streamSpecification = new StreamSpecification();


streamSpecification.setStreamEnabled(true);
streamSpecification.setStreamViewType(StreamViewType.NEW_IMAGE);
CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName)
.withAttributeDefinitions(attributeDefinitions).withKeySchema(keySchema)

.withProvisionedThroughput(provisionedThroughput).withStreamSpecification(streamSpecification);

Paso2: Generar actividad de actualizacin en la tabla de origen


El siguiente paso consiste en generar actividad de escritura en la tabla de origen. Mientras tiene lugar esta
actividad, la secuencia de la tabla de origen tambin se actualiza casi en tiempo real.

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.

StreamsAdapterDemoHelper.putItem(dynamoDBClient, tableName, "101", "test1");


StreamsAdapterDemoHelper.updateItem(dynamoDBClient, tableName, "101", "test2");
StreamsAdapterDemoHelper.deleteItem(dynamoDBClient, tableName, "101");
StreamsAdapterDemoHelper.putItem(dynamoDBClient, tableName, "102", "demo3");
StreamsAdapterDemoHelper.updateItem(dynamoDBClient, tableName, "102", "demo4");
StreamsAdapterDemoHelper.deleteItem(dynamoDBClient, tableName, "102");

Paso3: Procesar la secuencia


Ahora, el programa comienza a procesar la secuencia. Flujos de DynamoDB Kinesis Adapter acta como
una capa transparente entre la KCL y el punto de enlace de Flujos de DynamoDB, para que el cdigo
pueda aprovechar plenamente la KCL, en lugar de tener que realizar llamadas a Flujos de DynamoDB de
bajo nivel. En el programa se realizan las siguientes tareas:

Se define una clase de procesador de registros, StreamsRecordProcessor, con mtodos que


cumplen con la definicin de interfaz de KCL: initialize, processRecords y shutdown. El mtodo
processRecords contiene la lgica necesaria para leer la secuencia de la tabla de origen y escribir en
la tabla de destino.
Define un generador de clases para la clase de procesador de registros
(StreamsRecordProcessorFactory). Esto es necesario para los programas Java que utilizan la
KCL.
Crea una nueva instancia del proceso de trabajo Worker de la KCL, asociado con el generador de
clases.
Cierra el proceso de trabajo Worker cuando ha finalizado de procesar registros.

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.

API Version 2012-08-10


549
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

En el siguiente fragmento de cdigo se muestra el bucle principal de StreamsRecordProcessor. La


instruccin case determina qu accin se debe llevar a cabo, segn el valor de OperationType que
aparece en el registro de secuencia.

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();
}
}
}

Paso4: Comprobar que el contenido de ambas tablas es idntico


En este punto, el contenido de las tablas de origen y destino est sincronizado. La aplicacin emite
solicitudes Scan en las dos tablas para comprobar que su contenido sea realmente idntico.

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.

API Version 2012-08-10


550
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

dynamoDBClient.deleteTable(new DeleteTableRequest().withTableName(srcTable));
dynamoDBClient.deleteTable(new DeleteTableRequest().withTableName(destTable));

Programa completo: Flujos de DynamoDB Kinesis Adapter


A continuacin encontrar el programa de Java completo que lleva a cabo las tareas descritas en este
tutorial. Cuando lo ejecute, debera ver un resultado similar a este:

Creating table KCL-Demo-src


Creating table KCL-Demo-dest
Table is active.
Creating worker for stream: arn:aws:dynamodb:us-west-2:111122223333:table/KCL-Demo-src/
stream/2015-05-19T22:48:56.601
Starting worker...
Scan result is equal.
Done.

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).

El cdigo fuente consta de cuatro archivos .java:

StreamsAdapterDemo.java
StreamsRecordProcessor.java
StreamsRecordProcessorFactory.java
StreamsAdapterDemoHelper.java

StreamsAdapterDemo.java

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples;

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;

public class StreamsAdapterDemo {

private static Worker worker;


private static KinesisClientLibConfiguration workerConfig;
private static IRecordProcessorFactory recordProcessorFactory;

private static AmazonDynamoDBStreamsAdapterClient adapterClient;


private static AWSCredentialsProvider streamsCredentials;

API Version 2012-08-10


551
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

private static AmazonDynamoDB dynamoDBClient;


private static AWSCredentialsProvider dynamoDBCredentials;

private static AmazonCloudWatch cloudWatchClient;

private static String serviceName = "dynamodb";


private static String dynamodbEndpoint = "DYNAMODB_ENDPOINT_GOES_HERE";
private static String tablePrefix = "KCL-Demo";
private static String streamArn;

/**
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("Starting demo...");

String srcTable = tablePrefix + "-src";


String destTable = tablePrefix + "-dest";
streamsCredentials = new ProfileCredentialsProvider();
dynamoDBCredentials = new ProfileCredentialsProvider();
recordProcessorFactory = new StreamsRecordProcessorFactory(dynamoDBCredentials,
dynamodbEndpoint, serviceName,
destTable);

adapterClient = new AmazonDynamoDBStreamsAdapterClient(streamsCredentials, new


ClientConfiguration());

dynamoDBClient = AmazonDynamoDBClientBuilder.standard().build();

cloudWatchClient = AmazonCloudWatchClientBuilder.standard().build();

setUpTables();

workerConfig = new KinesisClientLibConfiguration("streams-adapter-demo", streamArn,


streamsCredentials,
"streams-demo-
worker").withMaxRecords(1000).withIdleTimeBetweenReadsInMillis(500)
.withInitialPositionInStream(InitialPositionInStream.TRIM_HORIZON);

System.out.println("Creating worker for stream: " + streamArn);


worker = new Worker(recordProcessorFactory, workerConfig, adapterClient,
dynamoDBClient, cloudWatchClient);
System.out.println("Starting worker...");
Thread t = new Thread(worker);
t.start();

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);
}

private static void setUpTables() {


String srcTable = tablePrefix + "-src";

API Version 2012-08-10


552
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

String destTable = tablePrefix + "-dest";


streamArn = StreamsAdapterDemoHelper.createTable(dynamoDBClient, srcTable);
StreamsAdapterDemoHelper.createTable(dynamoDBClient, destTable);

awaitTableCreation(srcTable);

performOps(srcTable);
}

private static void awaitTableCreation(String tableName) {


Integer retries = 0;
Boolean created = false;
while (!created && retries < 100) {
DescribeTableResult result =
StreamsAdapterDemoHelper.describeTable(dynamoDBClient, tableName);
created = result.getTable().getTableStatus().equals("ACTIVE");
if (created) {
System.out.println("Table is active.");
return;
}
else {
retries++;
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
// do nothing
}
}
}
System.out.println("Timeout after table creation. Exiting...");
cleanupAndExit(1);
}

private static void performOps(String tableName) {


StreamsAdapterDemoHelper.putItem(dynamoDBClient, tableName, "101", "test1");
StreamsAdapterDemoHelper.updateItem(dynamoDBClient, tableName, "101", "test2");
StreamsAdapterDemoHelper.deleteItem(dynamoDBClient, tableName, "101");
StreamsAdapterDemoHelper.putItem(dynamoDBClient, tableName, "102", "demo3");
StreamsAdapterDemoHelper.updateItem(dynamoDBClient, tableName, "102", "demo4");
StreamsAdapterDemoHelper.deleteItem(dynamoDBClient, tableName, "102");
}

private static void cleanupAndExit(Integer returnValue) {


String srcTable = tablePrefix + "-src";
String destTable = tablePrefix + "-dest";
dynamoDBClient.deleteTable(new DeleteTableRequest().withTableName(srcTable));
dynamoDBClient.deleteTable(new DeleteTableRequest().withTableName(destTable));
System.exit(returnValue);
}

StreamsRecordProcessor.java

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples;

import java.nio.charset.Charset;
import java.util.List;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.streamsadapter.model.RecordAdapter;

API Version 2012-08-10


553
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

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;

public class StreamsRecordProcessor implements IRecordProcessor {

private Integer checkpointCounter;

private final AmazonDynamoDB dynamoDBClient;


private final String tableName;

public StreamsRecordProcessor(AmazonDynamoDB dynamoDBClient2, String tableName) {


this.dynamoDBClient = dynamoDBClient2;
this.tableName = tableName;
}

@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) {

API Version 2012-08-10


554
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

e.printStackTrace();
}
}
}

StreamsRecordProcessorFactory.java

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples;

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;

public class StreamsRecordProcessorFactory implements IRecordProcessorFactory {

private final String tableName;

public StreamsRecordProcessorFactory(AWSCredentialsProvider dynamoDBCredentials, String


dynamoDBEndpoint,
String serviceName, String tableName) {
this.tableName = tableName;
}

@Override
public IRecordProcessor createProcessor() {
AmazonDynamoDB dynamoDBClient = AmazonDynamoDBClientBuilder.standard().build();
return new StreamsRecordProcessor(dynamoDBClient, tableName);
}

StreamsAdapterDemoHelper.java

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples;

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;

API Version 2012-08-10


555
Amazon DynamoDB Developer Guide
Uso de Flujos de DynamoDB Kinesis Adapter
para procesar registros de secuencia

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;

public class StreamsAdapterDemoHelper {

/**
* @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"));

java.util.List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new
KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH)); // Partition

// key

ProvisionedThroughput provisionedThroughput = new


ProvisionedThroughput().withReadCapacityUnits(2L)
.withWriteCapacityUnits(2L);

StreamSpecification streamSpecification = new StreamSpecification();


streamSpecification.setStreamEnabled(true);
streamSpecification.setStreamViewType(StreamViewType.NEW_IMAGE);
CreateTableRequest createTableRequest = new
CreateTableRequest().withTableName(tableName)
.withAttributeDefinitions(attributeDefinitions).withKeySchema(keySchema)

.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();
}
}

public static DescribeTableResult describeTable(AmazonDynamoDB client, String


tableName) {
return client.describeTable(new DescribeTableRequest().withTableName(tableName));
}

public static ScanResult scanTable(AmazonDynamoDB dynamoDBClient, String tableName) {


return dynamoDBClient.scan(new ScanRequest().withTableName(tableName));
}

public static void putItem(AmazonDynamoDB dynamoDBClient, String tableName, String id,


String val) {
java.util.Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("Id", new AttributeValue().withN(id));
item.put("attribute-1", new AttributeValue().withS(val));

PutItemRequest putItemRequest = new


PutItemRequest().withTableName(tableName).withItem(item);
dynamoDBClient.putItem(putItemRequest);
}

API Version 2012-08-10


556
Amazon DynamoDB Developer Guide
Tutorial: API de bajo nivel de Flujos de DynamoDB

public static void putItem(AmazonDynamoDB dynamoDBClient, String tableName,


java.util.Map<String, AttributeValue> items) {
PutItemRequest putItemRequest = new
PutItemRequest().withTableName(tableName).withItem(items);
dynamoDBClient.putItem(putItemRequest);
}

public static void updateItem(AmazonDynamoDB dynamoDBClient, String tableName, String


id, String val) {
java.util.Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("Id", new AttributeValue().withN(id));

Map<String, AttributeValueUpdate> attributeUpdates = new HashMap<String,


AttributeValueUpdate>();
AttributeValueUpdate update = new
AttributeValueUpdate().withAction(AttributeAction.PUT)
.withValue(new AttributeValue().withS(val));
attributeUpdates.put("attribute-2", update);

UpdateItemRequest updateItemRequest = new


UpdateItemRequest().withTableName(tableName).withKey(key)
.withAttributeUpdates(attributeUpdates);
dynamoDBClient.updateItem(updateItemRequest);
}

public static void deleteItem(AmazonDynamoDB dynamoDBClient, String tableName, String


id) {
java.util.Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("Id", new AttributeValue().withN(id));

DeleteItemRequest deleteItemRequest = new


DeleteItemRequest().withTableName(tableName).withKey(key);
dynamoDBClient.deleteItem(deleteItemRequest);
}

Tutorial: API de bajo nivel de Flujos de DynamoDB


Esta seccin es un tutorial de un programa de Java que muestra el funcionamiento de Flujos de
DynamoDB. Para obtener el cdigo fuente, consulte Programa completo: API de bajo nivel de Flujos de
DynamoDB (p. 560).

El programa realiza lo siguiente:

1. Crea una tabla de DynamoDB con una secuencia habilitada.


2. Describe los ajustes de secuencia de esta tabla.
3. Modifica los datos de la tabla.
4. Describe los fragmentos de la secuencia.
5. Lee los registros de secuencia de los fragmentos.
6. Eliminar recursos.

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).

API Version 2012-08-10


557
Amazon DynamoDB Developer Guide
Tutorial: API de bajo nivel de Flujos de DynamoDB

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)

Paso1: Crear una tabla con una secuencia habilitada


El primer paso consiste en crear una tabla de DynamoDB, como en el siguiente fragmento de cdigo. La
tabla tiene una secuencia habilitada, que capturar el valor de NEW_AND_OLD_IMAGES de cada uno de los
elementos que se modifique.

ArrayList<AttributeDefinition> attributeDefinitions =
new ArrayList<AttributeDefinition>();

attributeDefinitions.add(new AttributeDefinition()
.withAttributeName("Id")
.withAttributeType("N"));

ArrayList<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new KeySchemaElement()
.withAttributeName("Id")
.withKeyType(KeyType.HASH)); //Partition key

StreamSpecification streamSpecification = new StreamSpecification();


streamSpecification.setStreamEnabled(true);
streamSpecification.setStreamViewType(StreamViewType.NEW_AND_OLD_IMAGES);

CreateTableRequest createTableRequest = new CreateTableRequest()


.withTableName(tableName)
.withKeySchema(keySchema)
.withAttributeDefinitions(attributeDefinitions)
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits(1L)
.withWriteCapacityUnits(1L))
.withStreamSpecification(streamSpecification);

Paso2: Describir los ajustes de secuencia de la tabla


El API DescribeTable permite ver los ajustes de secuencia actuales de una tabla. El siguiente fragmento
de cdigo permite confirmar que se ha habilitado la secuencia y que va a capturar los datos correctos.

DescribeTableResult describeTableResult = dynamoDBClient.describeTable(tableName);

String myStreamArn = describeTableResult.getTable().getLatestStreamArn();


StreamSpecification myStreamSpec =
describeTableResult.getTable().getStreamSpecification();

System.out.println("Current stream ARN for " + tableName + ": "+ myStreamArn);


System.out.println("Stream enabled: "+ myStreamSpec.getStreamEnabled());
System.out.println("Update view type: "+ myStreamSpec.getStreamViewType());

API Version 2012-08-10


558
Amazon DynamoDB Developer Guide
Tutorial: API de bajo nivel de Flujos de DynamoDB

Paso3: Modificar los datos de la tabla


El siguiente paso consiste en realizar algunos cambios en los datos de la tabla. En el siguiente fragmento
de cdigo se agrega un nuevo elemento a la tabla, se actualiza un atributo de ese elemento y, despus, se
elimina el elemento.

// Add a new item

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++;

// Update the item

Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();


key.put("Id", new AttributeValue().withN("101"));
Map<String, AttributeValueUpdate> attributeUpdates =
new HashMap<String, AttributeValueUpdate>();
attributeUpdates.put("Message", new AttributeValueUpdate()
.withAction(AttributeAction.PUT)
.withValue(new AttributeValue().withS("This item has changed")));
dynamoDBClient.updateItem(tableName, key, attributeUpdates);
numChanges++;

// Delete the item

dynamoDBClient.deleteItem(tableName, key);
numChanges++;

Paso4: Describir los fragmentos de la secuencia


Las modificaciones de datos de la tabla darn lugar a que se escriban registros de secuencia en la
secuencia de la tabla.

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();

Paso5: Leer los registros de secuencia


Para cada fragmento de la lista, obtenemos un iterador de fragmento y, a continuacin, lo utilizamos para
obtener los registros de secuencia e imprimirlos.

API Version 2012-08-10


559
Amazon DynamoDB Developer Guide
Tutorial: API de bajo nivel de Flujos de DynamoDB

En el siguiente fragmento de cdigo se utiliza un bucle para procesar la lista de fragmentos, aunque solo
haya uno.

for (Shard shard : shards) {


String shardId = shard.getShardId();
System.out.println(
"Processing " + shardId + " from stream "+ streamArn);

// Get an iterator for the current shard

GetShardIteratorRequest getShardIteratorRequest = new GetShardIteratorRequest()


.withStreamArn(myStreamArn)
.withShardId(shardId)
.withShardIteratorType(ShardIteratorType.TRIM_HORIZON);
GetShardIteratorResult getShardIteratorResult =
streamsClient.getShardIterator(getShardIteratorRequest);
String nextItr = getShardIteratorResult.getShardIterator();

while (nextItr != null && numChanges > 0) {

// 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);

Programa completo: API de bajo nivel de Flujos de DynamoDB


A continuacin encontrar un completo programa de Java que lleva a cabo las tareas descritas en este
tutorial. Cuando lo ejecute, aparecer cada registro de secuencia en su totalidad:

Issuing CreateTable request for TestTableForStreams


Waiting for TestTableForStreams to be created...
Current stream ARN for TestTableForStreams: arn:aws:dynamodb:us-west-2:111122223333:table/
TestTableForStreams/stream/2017-05-01T16:04:24.300
Stream enabled: true
Update view type: NEW_AND_OLD_IMAGES
Making some changes to table data
Processing shardId-00000001493654674152-5245c47a from stream arn:aws:dynamodb:us-
west-2:111122223333:table/TestTableForStreams/stream/2017-05-01T16:04:24.300
Getting records...
{EventID: bb6acf1d94d80f579df1a8c05b8a7c8d,EventName: INSERT,EventVersion: 1.1,EventSource:
aws:dynamodb,AwsRegion: us-west-2,Dynamodb: {ApproximateCreationDateTime: Mon

API Version 2012-08-10


560
Amazon DynamoDB Developer Guide
Tutorial: API de bajo nivel de Flujos de DynamoDB

May 01 09:04:00 PDT 2017,Keys: {Id={N: 101,}},NewImage: {Message={S: New item!,},


Id={N: 101,}},SequenceNumber: 100000000001134015798,SizeBytes: 26,StreamViewType:
NEW_AND_OLD_IMAGES},}
{EventID: ea9cebe39d92adbf23089a179215fa5f,EventName: MODIFY,EventVersion: 1.1,EventSource:
aws:dynamodb,AwsRegion: us-west-2,Dynamodb: {ApproximateCreationDateTime: Mon May 01
09:04:00 PDT 2017,Keys: {Id={N: 101,}},NewImage: {Message={S: This item has changed,},
Id={N: 101,}},OldImage: {Message={S: New item!,}, Id={N: 101,}},SequenceNumber:
200000000001134015828,SizeBytes: 59,StreamViewType: NEW_AND_OLD_IMAGES},}
{EventID: fc3fe36dc8d50dc0c4b513922d8c1bfd,EventName: REMOVE,EventVersion: 1.1,EventSource:
aws:dynamodb,AwsRegion: us-west-2,Dynamodb: {ApproximateCreationDateTime: Mon May 01
09:04:00 PDT 2017,Keys: {Id={N: 101,}},OldImage: {Message={S: This item has changed,},
Id={N: 101,}},SequenceNumber: 300000000001134015829,SizeBytes: 38,StreamViewType:
NEW_AND_OLD_IMAGES},}
Deleting the table...
Demo complete

Example

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazon.codesamples;

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;

public class StreamsLowLevelDemo {

public static void main(String args[]) throws InterruptedException {

AmazonDynamoDB dynamoDBClient = AmazonDynamoDBClientBuilder.standard().build();

AmazonDynamoDBStreams streamsClient =
AmazonDynamoDBStreamsClientBuilder.standard().build();

// Create the table

API Version 2012-08-10


561
Amazon DynamoDB Developer Guide
Tutorial: API de bajo nivel de Flujos de DynamoDB

String tableName = "TestTableForStreams";


ArrayList<AttributeDefinition> attributeDefinitions = new
ArrayList<AttributeDefinition>();

attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));

ArrayList<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new
KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH)); // Partition key

StreamSpecification streamSpecification = new StreamSpecification();


streamSpecification.setStreamEnabled(true);
streamSpecification.setStreamViewType(StreamViewType.NEW_AND_OLD_IMAGES);

CreateTableRequest createTableRequest = new


CreateTableRequest().withTableName(tableName)
.withKeySchema(keySchema).withAttributeDefinitions(attributeDefinitions)
.withProvisionedThroughput(new
ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L))
.withStreamSpecification(streamSpecification);

System.out.println("Issuing CreateTable request for " + tableName);


dynamoDBClient.createTable(createTableRequest);
System.out.println("Waiting for " + tableName + " to be created...");

try {
TableUtils.waitUntilActive(dynamoDBClient, tableName);
} catch (AmazonClientException e) {
e.printStackTrace();
}

// Determine the Streams settings for the table

DescribeTableResult describeTableResult = dynamoDBClient.describeTable(tableName);

String myStreamArn = describeTableResult.getTable().getLatestStreamArn();


StreamSpecification myStreamSpec =
describeTableResult.getTable().getStreamSpecification();

System.out.println("Current stream ARN for " + tableName + ": " + myStreamArn);


System.out.println("Stream enabled: " + myStreamSpec.getStreamEnabled());
System.out.println("Update view type: " + myStreamSpec.getStreamViewType());

// Add a new item

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++;

// Update the item

Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();


key.put("Id", new AttributeValue().withN("101"));
Map<String, AttributeValueUpdate> attributeUpdates = new HashMap<String,
AttributeValueUpdate>();
attributeUpdates.put("Message", new
AttributeValueUpdate().withAction(AttributeAction.PUT)
.withValue(new AttributeValue().withS("This item has changed")));
dynamoDBClient.updateItem(tableName, key, attributeUpdates);
numChanges++;

API Version 2012-08-10


562
Amazon DynamoDB Developer Guide
Replicacin entre regiones

// Delete the item

dynamoDBClient.deleteItem(tableName, key);
numChanges++;

// Get the shards in the stream

DescribeStreamResult describeStreamResult = streamsClient


.describeStream(new DescribeStreamRequest().withStreamArn(myStreamArn));
String streamArn = describeStreamResult.getStreamDescription().getStreamArn();
List<Shard> shards = describeStreamResult.getStreamDescription().getShards();

// Process each shard

for (Shard shard : shards) {


String shardId = shard.getShardId();
System.out.println("Processing " + shardId + " from stream " + streamArn);

// Get an iterator for the current shard

GetShardIteratorRequest getShardIteratorRequest = new


GetShardIteratorRequest().withStreamArn(myStreamArn)

.withShardId(shardId).withShardIteratorType(ShardIteratorType.TRIM_HORIZON);
GetShardIteratorResult getShardIteratorResult =
streamsClient.getShardIterator(getShardIteratorRequest);
String nextItr = getShardIteratorResult.getShardIterator();

while (nextItr != null && numChanges > 0) {

// 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();
}

// Delete the table

System.out.println("Deleting the table...");


dynamoDBClient.deleteTable(tableName);

System.out.println("Demo complete");
}
}
}

Replicacin entre regiones


Important
AWS proporcion anteriormente una solucin de replicacin entre regiones basada en AWS
CloudFormation. Esta solucin se ha quedado obsoleta y sustituido por una herramienta de lnea
de comandos de cdigo abierto. Para obtener informacin, consulte las instrucciones detalladas
en GitHub:

https://github.com/awslabs/dynamodb-cross-region-library/blob/master/README.md

API Version 2012-08-10


563
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

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

Disparadores de Flujos de DynamoDB y AWS Lambda


Temas
Tutorial: Procesamiento de elementos nuevos en una tabla de DynamoDB (p. 564)
prcticas recomendadas (p. 571)

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.

Tutorial: Procesamiento de elementos nuevos en una tabla de


DynamoDB
Temas
Paso 1: Crear una tabla de DynamoDB con una secuencia habilitada (p. 565)
Paso 2: Crear un rol de ejecucin para Lambda (p. 566)
Paso 3: Creacin de un tema de Amazon SNS (p. 567)
Paso 4: Crear y probar una funcin Lambda (p. 568)
Paso 5: Crear y probar un disparador (p. 570)

En este tutorial, vamos a crear un disparador AWS Lambda para procesar la secuencia de una tabla
DynamoDB.

API Version 2012-08-10


564
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

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.

Paso 1: Crear una tabla de DynamoDB con una secuencia habilitada


En este paso, vamos a crear una tabla de DynamoDB (BarkTable) para almacenar todos los ladridos de
los usuarios de Woofer. La clave principal consta de Username (clave de particin) y Timestamp (clave de
ordenacin). Ambos atributos son de tipo String.

BarkTable tendr una secuencia habilitada. Ms adelante en este tutorial, asociaremos una funcin AWS
Lambda a la secuencia para crear un disparador.

1. Escriba el comando siguiente para crear la tabla:

aws dynamodb create-table \


--table-name BarkTable \
--attribute-definitions AttributeName=Username,AttributeType=S
AttributeName=Timestamp,AttributeType=S \

API Version 2012-08-10


565
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

--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

2. Busque LatestStreamArn en los resultados:

...
"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.

Paso 2: Crear un rol de ejecucin para Lambda


En este paso, vamos a crear un rol de IAM (WooferLambdaRole) y a asignarle permisos. El rol lo utilizar
la funcin Lambda que vamos a crear en Paso 4: Crear y probar una funcin Lambda (p. 568).

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.

1. Cree un archivo denominado trust-relationship.json con el siguiente contenido:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

2. Escriba el comando siguiente para crear WooferLambdaRole:

aws iam create-role --role-name WooferLambdaRole \


--path "/service-role/" \
--assume-role-policy-document file://trust-relationship.json

3. Cree un archivo denominado role-policy.json con el siguiente contenido. Sustituya region y


accountID por su regin de AWS y su identificador de cuenta.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:region:accountID:function:publishNewBark*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",

API Version 2012-08-10


566
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

"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:

aws iam put-role-policy --role-name WooferLambdaRole \


--policy-name WooferLambdaRolePolicy \
--policy-document file://role-policy.json

Paso 3: Creacin de un tema de Amazon SNS


En este paso, vamos a crear un tema de Amazon SNS (wooferTopic) y a suscribir una direccin de correo
electrnico a ese tema. La funcin Lambda utilizar este tema para publicar los ladridos nuevos de los
usuarios de Woofer.

1. Escriba el comando siguiente para crear un nuevo tema de Amazon SNS:

aws sns create-topic --name wooferTopic

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.

aws sns subscribe \


API Version 2012-08-10
567
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

--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.

Paso 4: Crear y probar una funcin Lambda


En este paso, vamos a crear una funcin AWS Lambda (publishNewBark) para procesar los registros de
secuencia de BarkTable.

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.

1. Cree un archivo denominado publishNewBark.js con el siguiente contenido:. Sustituya region y


accountID por su regin de AWS y su identificador de cuenta.

'use strict';
var AWS = require("aws-sdk");
var sns = new AWS.SNS();

exports.handler = (event, context, callback) => {

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:

zip publishNewBark.zip publishNewBark.js

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:

aws iam get-role --role-name WooferLambdaRole

API Version 2012-08-10


568
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

En el resultado, busque el ARN de WooferLambdaRole:

...
"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.

aws lambda create-function \


--region us-east-1 \
--function-name publishNewBark \
--zip-file fileb://publishNewBark.zip \
--role roleARN \
--handler publishNewBark.handler \
--timeout 5 \
--runtime nodejs4.3

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.

Cree un archivo denominado payload.json con el siguiente contenido.

{
"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"
}

API Version 2012-08-10


569
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

]
}

Escriba el comando siguiente para probar la funcin publishNewBark:

aws lambda invoke --function-name publishNewBark --payload file://payload.json


output.txt

Si la prueba se realiza correctamente, aparecer el siguiente resultado:

{
"StatusCode": 200
}

Adems, el archivo output.txt contendr este texto:

"Successfully processed 1 records."

Tambin recibir un nuevo mensaje de correo electrnico dentro de unos minutos.


Note

AWS Lambda escribe la informacin de diagnstico en Amazon CloudWatch Logs. Si


se produce cualquier error en la funcin Lambda, puede utilizar esos diagnsticos para
solucionar el problema:

1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.


2. En el panel de navegacin, elija Logs.
3. Elija el grupo de log siguiente: /aws/lambda/publishNewBark
4. Elija la ltima secuencia de log para ver el resultado (y los errores) de la funcin.

Paso 5: Crear y probar un disparador


En Paso 4: Crear y probar una funcin Lambda (p. 568), hemos probado la funcin Lambda para
asegurarnos de que se ejecutaba correctamente. En este paso, vamos a crear un disparador. Para ello,
asociaremos la funcin Lambda (publishNewBark) a un origen de eventos (la secuencia de BarkTable).

1. Al crear el disparador, deber especificar el ARN de la secuencia de BarkTable. Escriba el comando


siguiente para recuperar este ARN:

aws dynamodb describe-table --table-name BarkTable

Busque LatestStreamArn en los resultados:

...
"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.

aws lambda create-event-source-mapping \


--region us-east-1 \
--function-name publishNewBark \

API Version 2012-08-10


570
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

--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:

aws dynamodb put-item \


--table-name BarkTable \
--item Username={S="Jane
Doe"},Timestamp={S="2016-11-18:14:32:17"},Message={S="Testing...1...2...3"}

Debera recibir un nuevo mensaje de correo electrnico dentro de unos minutos.


4. Vaya a la consola de DynamoDB y agregue algunos elementos ms a BarkTable. Debe especificar
valores para los atributos Username y Timestamp. Tambin debe especificar un valor para Message,
aunque no es obligatorio. Debera recibir un nuevo mensaje de correo electrnico por cada elemento
que agregue 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

AWS Lambda escribe la informacin de diagnstico en Amazon CloudWatch Logs. Si se produce


cualquier error en la funcin Lambda, puede utilizar esos diagnsticos para solucionar el
problema.

1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.


2. En el panel de navegacin, elija Logs.
3. Elija el grupo de log siguiente: /aws/lambda/publishNewBark
4. Elija la ltima secuencia de log para ver el resultado (y los errores) de la funcin.

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:

API Version 2012-08-10


571
Amazon DynamoDB Developer Guide
Disparadores de Flujos de DynamoDB y AWS Lambda

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.

API Version 2012-08-10


572
Amazon DynamoDB Developer Guide

Acceleration en memoria con DAX

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.

API Version 2012-08-10


573
Amazon DynamoDB Developer Guide
Casos de uso de DAX

Esto resulta especialmente beneficioso para las aplicaciones que requieren lecturas reiteradas de claves
individuales.

Casos de uso de DAX


DAX proporciona acceso a datos de consistencia final de tablas de DynamoDB con una latencia de
microsegundos. Un clster de DAX que abarque varias zonas de disponibilidad puede atender millones de
solicitudes por segundo.

DAX es idneo para:

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.

DAX no es adecuado para:

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)

API Version 2012-08-10


574
Amazon DynamoDB Developer Guide
Conceptos

Asia Pacfico (Mumbai)


Amrica del Sur (So Paulo)
DAX admite aplicaciones escritas en Java o Node.js, utilizando los clientes de DAX para dichos
lenguajes de programacin.
DAX no admite Transport Layer Security (TLS).
DAX solo est disponible para la plataforma EC2-VPC. No se admite la plataforma EC2-Classic.

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.

En el siguiente diagrama se muestra informacin general sobre DAX:

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

API Version 2012-08-10


575
Amazon DynamoDB Developer Guide
Procesamiento de solicitudes en DAX

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.

Procesamiento de solicitudes en DAX


Un clster de DAX consta de uno o varios nodos. Cada nodo ejecuta su propia instancia del software de
almacenamiento en cach de DAX. Uno de los nodos sirve como nodo principal del clster. Los nodos
adicionales (en caso de incluirse) actan como rplicas de lectura. Para obtener ms informacin, consulte
Nodos (p. 578).

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).

Si la solicitud especifica lecturas de consistencia altaDAX transmite la solicitud a DynamoDB. Los


resultados de DynamoDB no se almacenan en cach en DAX, sino que, sencillamente, se devuelven a la
aplicacin.

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.

API Version 2012-08-10


576
Amazon DynamoDB Developer Guide
Cach de elementos

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

API Version 2012-08-10


577
Amazon DynamoDB Developer Guide
Componentes de los clsteres de DAX

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.

Componentes de los clsteres de DAX


Un clster de DAX consta de componentes de la infraestructura de AWS. En esta seccin se describen
estos componentes y cmo funcionan entre s.

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.

Puede escalar el clster de DAX de una de las dos formas siguientes:

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.)

Los tipos de nodos vlidos son los siguientes:

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.

API Version 2012-08-10


578
Amazon DynamoDB Developer Guide
Regiones y zonas de disponibilidad

El nodo principal es responsable de lo siguiente:

Responder a las solicitudes de datos en cach que formulan las aplicaciones.


Transmitir las operaciones de escritura a DynamoDB.
Expulsar los datos de la cach, de acuerdo con la poltica de expulsin del clster.

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.

Las rplicas de lectura son responsables de lo siguiente:

Responder a las solicitudes de datos en cach que formulan las aplicaciones.


Expulsar los datos de la cach, de acuerdo con la poltica de expulsin del clster.

Sin embargo, al contrario que el nodo principal, las rplicas de lectura no escriben en DynamoDB.

Las rplicas de lectura cumplen dos funciones adicionales:

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.

Regiones y zonas de disponibilidad


Un clster de DAX de una regin de AWS solo puede interaccionar con las tablas de DynamoDB que se
encuentran en esa misma regin. Por este motivo, debe asegurarse de lanzar el clster de DAX en la
regin correcta. Si tiene tablas de DynamoDB en otras regiones, deber lanzar clsteres de DAX en ellas
tambin.

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.

API Version 2012-08-10


579
Amazon DynamoDB Developer Guide
Grupos de parmetros

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 del clster


A cada clster de DAX se le asigna un nombre de recurso de Amazon (ARN). El formato del ARN es el
siguiente:

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).

Punto de enlace de clster


Cada clster de DAX proporciona un punto de enlace de clster para que la aplicacin lo utilice. Al obtener
acceso al clster a travs de este punto de enlace, la aplicacin no tiene que conocer los nombres de
los hosts ni los nmeros de los puertos de los nodos individuales del clster. Su aplicacin "conoce"
automticamente todos los nodos del clster, aunque se agreguen o eliminen rplicas de lectura.

A continuacin se muestra un ejemplo de punto de enlace de clster:

myDAXcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111

Puntos de enlace de nodos


Cada uno de los nodos individuales de un clster de DAX tiene su propio nombre de host y nmero de
punto de enlace. A continuacin se muestra un ejemplo de punto de enlace de nodo:

API Version 2012-08-10


580
Amazon DynamoDB Developer Guide
Grupos de subredes

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 de 60minutos se selecciona al azar dentro de un bloque de 8horas por


regin. En la siguiente tabla, se muestran los bloques de tiempo de cada regin desde los que se asignan
los periodos predeterminados de mantenimiento.

Cdigo de regin Nombre de la regin Maintenance Window

ap-northeast-1 Regin Asia Pacfico (Tokio) 13:0021:00 UTC

eu-west-1 Regin UE (Irlanda) 22:0006:00 UTC

us-east-1 Regin EE.UU. Este (Norte de 03:0011:00 UTC


Virginia)

us-west-1 EE.UU. Oeste (Norte de 06:0014:00 UTC


California)

us-west-2 Regin EE.UU. Oeste (Oregn) 06:0014:00 UTC

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.

API Version 2012-08-10


581
Amazon DynamoDB Developer Guide
Creacin de un clster de DAX

Creacin de un clster de DAX


En esta seccin se lleva a cabo paso a paso el proceso de configuracin y uso de DAX por primera vez
en el entorno de Amazon VPC predeterminado. Puede crear su primer clster de DAX mediante la AWS
Command Line Interface (AWS CLI) o la Consola de administracin de AWS.

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)

Creacin de un rol de servicio de DAX


Para que el clster de DAX obtenga acceso a las tablas de DynamoDB en su nombre, tendr que crear
un rol de servicio. Un rol de servicio es un rol de IAM que autoriza a un servicio de AWS para actuar en
su nombre. El rol de servicio permitir a DAX obtener acceso a las tablas de DynamoDB como si usted
estuviese abrindolas directamente. Debe crear el rol de servicio para poder crear el clster de DAX.

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).

Permisos necesarios para crear roles de servicio


La poltica AdministratorAccess administrada por AWS proporciona todos los permisos que se
necesitan para crear un clster de DAX y un rol de servicio. Si el usuario de IAM tiene adjunta la poltica
AdministratorAccess, entonces no tiene que hacer nada ms.

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

Debe adjuntar estos permisos al usuario que intenta realizar la accin.


Note

Los permisos iam:CreateRole, iam:CreatePolicy, iam:AttachPolicy e iam:PassRole


no se incluyen en las polticas administradas por AWS para DynamoDB. Esto es as por diseo,
ya que estos permisos permitiran escalar los privilegios. Es decir, un usuario podra utilizarlos

API Version 2012-08-10


582
Amazon DynamoDB Developer Guide
AWS CLI

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.

Si aparece este mensaje de error... Haga lo siguiente:

User: Agregue iam:CreateRole a la poltica de


arn:aws:iam::accountID:user/userName usuario.
is not authorized to perform:
iam:CreateRole on resource:
arn:aws:iam::accountID:role/service-
role/roleName

User: Agregue iam:CreatePolicy a la poltica de


arn:aws:iam::accountID:user/userName usuario.
is not authorized to perform:
iam:CreatePolicy on resource: policy
policyName

User: Agregue iam:AttachRolePolicy a la poltica de


arn:aws:iam::accountID:user/userName usuario.
is not authorized to perform:
iam:AttachRolePolicy on resource: role
daxServiceRole

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:

Instalacin de la AWS CLI


Configuracin de la AWS CLI

Important

Para administrar clsteres de DAX con la AWS CLI, instale o actualice a la versin 1.11.110 o
superior.

API Version 2012-08-10


583
Amazon DynamoDB Developer Guide
AWS CLI

Note

En todos los ejemplos relativos a la AWS CLI se utilizan la regin us-west-2 e identificadores de
cuenta ficticios.

Paso 1: Crear un rol de servicio para DAX


Para poder crear un clster de DAX, es preciso crear un rol de servicio para l. Un rol de servicio es un rol
de IAM que autoriza a un servicio de AWS para actuar en su nombre. El rol de servicio permitir a DAX
obtener acceso a las tablas de DynamoDB como si usted estuviese abrindolas directamente.

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.

1. Cree un archivo denominado service-trust-relationship.json con el siguiente contenido:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "dax.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

2. Cree el rol de servicio:

aws iam create-role \


--role-name DAXServiceRole \
--assume-role-policy-document file://service-trust-relationship.json

3. Cree un archivo denominado service-role-policy.json con el siguiente contenido:

{
"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.

API Version 2012-08-10


584
Amazon DynamoDB Developer Guide
AWS CLI

4. Cree una poltica de IAM para el rol de servicio:

aws iam create-policy \


--policy-name DAXServicePolicy \
--policy-document file://service-role-policy.json

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:

aws iam attach-role-policy \


--role-name DAXServiceRole \
--policy-arn arn

Sustituya arn por el ARN real del rol del paso anterior.

Paso 2: Crear un grupo de subredes


Note

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.

1. Para determinar el identificador de la VPC predeterminada, escriba el siguiente comando:

aws ec2 describe-vpcs

En el resultado, tome nota del identificador de la VPC predeterminada. Por ejemplo:

vpc-12345678
2. Determine los identificadores de las subredes asociadas a la VPC predeterminada:

aws ec2 describe-subnets \


--filters "Name=vpc-id,Values=vpcID" \
--query "Subnets[*].SubnetId"

Sustituya vpcID por el ID de la VPC real. Por ejemplo: vpc-12345678

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:

aws dax create-subnet-group \

API Version 2012-08-10


585
Amazon DynamoDB Developer Guide
AWS CLI

--subnet-group-name my-subnet-group \
--subnet-ids subnet-11111111 subnet-22222222 subnet-33333333 subnet-44444444

Paso 3: Crear un clster de DAX


Siga este procedimiento para crear un clster de DAX en la Amazon VPC predeterminada:

1. Obtenga el nombre de recurso de Amazon (ARN) del rol de servicio:

aws iam get-role \


--role-name DAXServiceRole \
--query "Role.Arn" --output text

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:

aws dax create-cluster \


--cluster-name mydaxcluster \
--node-type dax.r3.large \
--replication-factor 3 \
--iam-role-arn roleARN \
--subnet-group my-subnet-group \
--region us-west-2

Sustituya roleARN por el ARN del paso anterior.

Todos los nodos del clster sern de tipo dax.r3.large (--node-type). Habr tres nodos (--
replication-factor), un nodo principal y dos rplicas.

Para ver el estado del clster, escriba el siguiente comando:

aws dax describe-clusters

El estado se muestra en el resultado. Por ejemplo: "Status": "creating"


Note

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.

Paso 4: Configure las reglas de entrada del grupo de seguridad


Los nodos del clster de DAX utilizan el grupo de seguridad predeterminado de la Amazon VPC. Para el
grupo de seguridad predeterminado, tendr que autorizar el trfico entrante en el puerto TCP 8111. Esto
permitir que las instancias Amazon EC2 de la Amazon VPC obtengan acceso al clster de DAX.
API Version 2012-08-10
586
Amazon DynamoDB Developer Guide
Consola de administracin de AWS

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:

aws ec2 describe-security-groups \


--filters Name=vpc-id,Values=vpcID,Name=group-name,Values=default \
--query "SecurityGroups[*].{GroupName:GroupName,GroupId:GroupId}"

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:

aws ec2 authorize-security-group-ingress \


--group-id sgID --protocol tcp --port 8111

Sustituya sgID por el identificador del grupo de seguridad real.

Consola de administracin de AWS


En esta seccin se describe cmo crear un clster de DAX desde la Consola de administracin de AWS.

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)

Paso 1: Crear un grupo de subredes


Note

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.

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de navegacin, elija DAX.
3. Elija Create subnet group.
4. En la ventana Create subnet group, haga lo siguiente:

a. Name: escriba el nombre corto del grupo de subredes.

API Version 2012-08-10


587
Amazon DynamoDB Developer Guide
Consola de administracin de AWS

b. Description: escriba una descripcin del grupo de subredes.


c. VPC ID: elija el identificador del entorno de Amazon VPC.
d. Subnets: elija una o varias subredes de la lista.
Note

Las subredes se distribuyen entre varias zonas de disponibilidad. Si tiene previsto


crear un clster de DAX de varios nodos (un nodo principal y una o ms rplicas de
lectura), recomendamos elegir varios identificadores de subredes, para que DAX
pueda implementar los nodos del clster en varias zonas de disponibilidad. Si una
zona de disponibilidad deja de estar disponible, DAX realizar automticamente la
conmutacin por error a una zona de disponibilidad superviviente y el clster de DAX
seguir funcionando sin interrupcin.

Cuando est conforme con los ajustes, haga clic en Create subnet group.

Paso 2: Crear un clster de DAX


Siga este procedimiento para crear un clster de DAX en la Amazon VPC predeterminada:

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de navegacin, bajo el encabezado DAX, elija Clusters.
3. Elija Create cluster.
4. En la ventana Create cluster, haga lo siguiente:

a. Cluster name: escriba el nombre corto del clster de DAX.


b. Cluster description: escriba una descripcin del clster.
c. Node type: elija el tipo de nodo de todos los nodos del clster.
d. Cluster size: elija el nmero de nodos del clster. Un clster consta de un nodo principal y hasta
nueve rplicas de lectura.
Note

Si desea crear un clster de un solo nodo, elija 1. Su clster constar de un nodo


principal.
Si desea crear un clster de varios nodos, elija un nmero entre 2 (una instancia principal
y una rplica de lectura) y 10 (una instancia principal y nueve rplicas de lectura).
e. IAM role: elija Create new y especifique la siguiente informacin:

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.

En la pantalla Clusters, aparecer elAPI


clster de DAX
Version con el estado Creating.
2012-08-10
588
Amazon DynamoDB Developer Guide
Modelos de consistencia de DAX y DynamoDB

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.

Paso 3: Configure las reglas de entrada del grupo de seguridad


El clster de DAX utiliza el puerto TCP 8111 para las comunicaciones, as que debe autorizar el trfico
entrante en ese puerto. Esto permitir que las instancias Amazon EC2 de la Amazon VPC obtengan
acceso al clster de DAX.
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. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.


2. En el panel de navegacin, elija Security Groups.
3. Elija el grupo de seguridad default. En el men Actions, elija Edit inbound rules.
4. Elija Add Rule y especifique la siguiente informacin:

Port Range: escriba 8111

Source: escriba default y, a continuacin, elija el identificador del grupo de seguridad


predeterminado.

Cuando la configuracin sea la que desea, elija Save.

Modelos de consistencia de DAX y DynamoDB


DAX es un servicio de almacenamiento en cach de escritura indirecta (write-through), diseado para
simplificar el proceso de agregar una cach a las tablas de Amazon DynamoDB. Como DAX funciona por
separado de DynamoDB, es importante comprender los modelos de consistencia de DAX y de DynamoDB
para conseguir que sus aplicaciones se comporten como se espera de ellas.

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)

Consistencia entre los nodos de los clsteres de DAX


Para dotar de alta disponibilidad a la aplicacin, recomendamos provisionar el clster de DAX con al
menos dos nodos (aunque lo idneo son tres o ms) y colocarlos en varias zonas de disponibilidad de una
regin.

API Version 2012-08-10


589
Amazon DynamoDB Developer Guide
Comportamiento de la cach de elementos de DAX

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.

Comportamiento de la cach de elementos de DAX


Cada clster de DAX presenta dos memorias cach diferentes, una cach de elementos y una cach de
consultas. (Para obtener ms informacin, consulte Conceptos (p. 575).) En esta seccin se abordan las
implicaciones para la consistencia de las lecturas y escrituras en la cach de elementos de DAX.

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:

API Version 2012-08-10


590
Amazon DynamoDB Developer Guide
Comportamiento de la cach de elementos de DAX

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

Adems de GetItem, el cliente de DAX tambin admite las solicitudes BatchGetItem. En


esencia, BatchGetItem es un encapsulador que contiene una o varias solicitudes GetItem, de
modo que DAX trata cada una de ellas como una operacin GetItem individual.

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).

Procesamiento de escrituras en DAX


DAX est pensado para aplicaciones que requieren las lecturas de alto desempeo. Al tratarse de una
cach de escritura indirecta, DAX permite emitir directamente las escrituras, de tal forma que estas se
reflejen de inmediato en la cach de elementos. de tal forma que estas se reflejen de inmediato en la
cach de elementos. No es necesario administrar la lgica de invalidacin de cach, porque DAX lo hace
automticamente.

DAX admite las siguientes operaciones de escritura: PutItem, UpdateItem, DeleteItem y


BatchWriteItem. Cuando se enva una de estas solicitudes a DAX, sucede lo siguiente:

API Version 2012-08-10


591
Amazon DynamoDB Developer Guide
Comportamiento de la cach de consultas de DAX

DAX enva la solicitud a DynamoDB.


DynamoDB responde a DAX para confirmar que la escritura se ha llevado a cabo correctamente.
DAX escribe el elemento en su cach de elementos.
DAX indica al solicitante que la escritura se ha realizado correctamente.

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.

Comportamiento de la cach de consultas de DAX


DAX almacena en su cach de consultas los resultados de las solicitudes Query y Scan; sin embargo,
estos resultados no afectan en absoluto a la cach de elementos. Cuando la aplicacin emite una solicitud
Query o Scan con DAX, el conjunto de resultados se guarda en la cach de consultas, no en la de
elementos. No se puede "calentar" la cach de elementos antes de llevar a cabo una operacin Scan, ya
que la cach de elementos y la cach de consultas son entidades independientes.

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).

En este caso, el conjunto de resultados almacenado en cach correspondiente a la operacin Query


emitida en el paso3 ser idntico al que se almacen en cach en el paso1. El motivo es que DAX no
invalida los conjuntos de resultados de Query o Scan cuando se actualizan elementos individuales. La
operacin PutItem del paso2 solo se reflejar en la cach de consultas de DAX cuando venza el TTL de
la solicitud Query.

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.

Lecturas de consistencia alta


Para realizar una solicitud de lectura de consistencia alta, debe establecer el
parmetroConsistentReadentrue. DAX pasa las solicitudes de consistencia alta a DynamoDB. Cuando
recibe una respuesta de DynamoDB, DAX devuelve los resultados al cliente, pero no almacena en cach
los resultados. DAX no puede atender por s solo a las lecturas de consistencia alta, porque no est

API Version 2012-08-10


592
Amazon DynamoDB Developer Guide
Almacenamiento en cach negativo

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.

Almacenamiento en cach negativo


DAX admite las entradas de cach negativas, tanto en la cach de elementos como en la cach de
consultas. Una entrada de cach negativa se produce cuando DAX no encuentra los elementos solicitados
en una tabla de DynamoDB subyacente. En lugar de generar un error, DAX almacena en cach un
resultado vaco y se lo devuelve al usuario.

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

API Version 2012-08-10


593
Amazon DynamoDB Developer Guide
Estrategias de escritura

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.

1. Alice actualiza un elemento de la tabla ProductCatalog. DAX reenva la solicitud a DynamoDB y la


actualizacin se lleva a cabo correctamente. Despus, DAX escribe el elemento en su cach de
elementos y devuelve una respuesta correcta a Alice. A partir de ese momento, hasta que el elemento
se expulse definitivamente de la cach, cualquier usuario que lo lea en DAX ver el elemento con la
actualizacin de Alice.
2. Poco despus, Bob actualiza el mismo elemento ProductCatalog en el que Alice ha escrito, pero lo hace
directamente en DynamoDB. DAX no actualiza automticamente su cach de elementos en respuesta a
las actualizaciones a travs de DynamoDB; por tanto, los usuarios de DAX no vern la actualizacin de
Bob.
3. Alice vuelve a leer el elemento en DAX. Este elemento se encuentra en la cach del elementos, por lo
que DAX se lo devuelve a Alice sin obtener acceso a la tabla de 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.

API Version 2012-08-10


594
Amazon DynamoDB Developer Guide
Uso del cliente de DAX en una aplicacin

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.

Uso del cliente de DAX en una aplicacin


Para sacar partido de DAX desde una aplicacin, use el cliente de DAX para su lenguaje de programacin.
El cliente de DAX se ha diseado de tal forma que se minimicen las interrupciones para las aplicaciones de
DynamoDB existentes; solo tiene que realizar algunas modificaciones sencillas en el cdigo.

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.

API Version 2012-08-10


595
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

En esta seccin tambin se ofrece informacin sobre cmo modificar la aplicacin existente para que
pueda sacar partido del clster de DAX.
Note

Los clientes de DAX estn disponibles en la siguiente URL:

http://dax-sdk.s3-website-us-west-2.amazonaws.com

En este momento, los clientes de DAX estn disponibles para Java y Node.js.

Tutorial: Ejecucin de un ejemplo de aplicacin


Temas
Paso 1: Lanzar una instancia Amazon EC2 (p. 596)
Paso2: Crear un usuario y una poltica de IAM (p. 597)
Paso3: Configurar la instancia Amazon EC2 (p. 598)
Paso4a: (Java) Ejecutar el ejemplo de aplicacin (p. 599)
Paso4b: (Node.js) Ejecutar el ejemplo de aplicacin (p. 607)

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.

Paso 1: Lanzar una instancia Amazon EC2


Cuando el clster de DAX est disponible, puede lanzar una instancia Amazon EC2 en la Amazon VPC
predeterminada. A partir de ese momento, podr instalar y ejecutar el software cliente de DAX en dicha
instancia.

1. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.


2. Elija Launch Instance y proceda del modo siguiente:

Paso1: Elegir una imagen de mquina de Amazon (AMI)

En la parte superior de la lista de AMI, vaya a Amazon Linux AMI y elija Select.

Paso2: Elegir un tipo de instancia

En la parte superior de la lista de tipos de instancias, elija t2.micro.


Elija Next: Configure Instance Details.

Paso3: Configurar los detalles de la instancia

Vaya a Network y elija la VPC predeterminada.


Elija Next: Add Storage.

Paso4: Agregar almacenamiento

Elija Next: Tag Instance para omitir este paso.

API Version 2012-08-10


596
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

Paso5: Etiquetar la instancia

Elija Next: Configure Security Group para omitir este paso.

Paso6: Configurar un grupo de seguridad

Elija Select an existing security group.


En la lista de grupos de seguridad, elija default. Se trata del grupo de seguridad predeterminado
para la VPC.
Elija Next: Review and Launch.

Paso7: Revisar el lanzamiento de la instancia

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.

Paso2: Crear un usuario y una poltica de IAM


En este paso, vamos a crear un usuario de IAM con una poltica que concede acceso al clster de DAX y
a DynamoDB. A partir de ese momento, podr ejecutar aplicaciones que interaccionen con el clster de
DAX.

1. Abra la consola de IAM, en https://console.aws.amazon.com/iam/.


2. En el panel de navegacin, seleccione Users.
3. Elija Add user.
4. En la pgina Details, escriba la siguiente informacin:

User name: escriba un nombre nico. Por ejemplo: MyDAXUser


Access type: elija Programmatic access.

Elija Next: Permissions.

API Version 2012-08-10


597
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

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:

Policy Name: escriba un nombre nico. Por ejemplo: MyDAXUserPolicy.


Description: escriba una breve descripcin de la poltica.
Policy Document: copie y pegue el siguiente documento:

{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dax:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}

Elija Create Policy.


8. Vuelva a la pgina Permissions. En la lista de polticas, elija Refresh. Para restringir la lista de
polticas, elija Filter | Customer managed. Seleccione la poltica de IAM que cre en el paso anterior
(por ejemplo, MyDAXUserPolicy) y, a continuacin, elija Next: Review.
9. En la pgina Review, elija Create user.
10. En la pgina Complete, vaya a Secret access key y elija Show. Cuando termine, copie los valores
de Access key ID y Secret access key. Necesitar ambos identificadores para Paso3: Configurar la
instancia Amazon EC2 (p. 598).

Paso3: Configurar la instancia Amazon EC2


Una vez que la instancia Amazon EC2 est disponible, puede iniciar sesin en ella y prepararla para
utilizarla.
Note
En los pasos siguientes se presupone que se va a conectar a la instancia Amazon EC2 desde un
equipo que ejecuta Linux. Para conocer otras formas de conexin, consulte Connect to Your Linux
Instance en la Gua del usuario de Amazon EC2 para instancias de Linux.

1. Si todava no lo ha hecho, abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.


2. Use el comando ssh para iniciar sesin en la instancia Amazon EC2. Por ejemplo:

ssh -i my-keypair.pem ec2-user@public-dns-name

API Version 2012-08-10


598
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

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)).

El identificador de inicio de sesin es ec2-user. No se requiere contrasea.


3. Despus de haber iniciado sesin en la instancia EC2, tendr que configurar sus credenciales de
AWS, tal y como se muestra a continuacin. Especifique el ID de clave de acceso y la clave secreta
de AWS (de Paso2: Crear un usuario y una poltica de IAM (p. 597)); a continuacin, establezca el
nombre de regin predeterminada en su regin actual. En el siguiente ejemplo, el nombre de regin
predeterminada es us-west-2.

aws configure

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE


AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]:

Paso4a: (Java) Ejecutar el ejemplo de aplicacin


Note

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:

TryDax.java: punto de entrada al programa.


TryDaxHelper.java: mtodos de utilidad para los clientes de DAX y DynamoDB, as como para crear
una tabla y datos de prueba.
TryDaxTests.java: actividades GetItem, Query y Scan para la tabla de prueba.

1. Instale el kit de desarrollo de Java (JDK):

sudo yum install -y java-devel

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

3. Descargue en la ltima versin del cliente Java de DAX (archivo .jar):

wget http://dax-sdk.s3-website-us-west-2.amazonaws.com/java/DaxJavaClient-latest.jar

4. Establezca la variable CLASSPATH:

export SDKVERSION=sdkVersion

API Version 2012-08-10


599
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

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

Cuando haya terminado la descarga, extraiga los archivos de cdigo fuente:

unzip TryDax.zip

6. Compile el cdigo de la siguiente manera:

javac TryDax*.java

7. Ejecute el programa:

java TryDax

Debera ver un resultado similar a este:

Creating a DynamoDB client

Attempting to create table; please wait...


Successfully created table. Table status: ACTIVE
Writing data to the table...
Writing 10 items for partition key: 1
Writing 10 items for partition key: 2
Writing 10 items for partition key: 3
Writing 10 items for partition key: 4
Writing 10 items for partition key: 5
Writing 10 items for partition key: 6
Writing 10 items for partition key: 7
Writing 10 items for partition key: 8
Writing 10 items for partition key: 9
Writing 10 items for partition key: 10

Running GetItem, Scan, and Query tests...


First iteration of each test will result in cache misses
Next iterations are cache hits

GetItem test - partition key 1 and sort keys 1-10


Total time: 136.681 ms - Avg time: 13.668 ms
Total time: 122.632 ms - Avg time: 12.263 ms
Total time: 167.762 ms - Avg time: 16.776 ms
Total time: 108.130 ms - Avg time: 10.813 ms
Total time: 137.890 ms - Avg time: 13.789 ms
Query test - partition key 5 and sort keys between 2 and 9
Total time: 13.560 ms - Avg time: 2.712 ms
Total time: 11.339 ms - Avg time: 2.268 ms
Total time: 7.809 ms - Avg time: 1.562 ms
Total time: 10.736 ms - Avg time: 2.147 ms

API Version 2012-08-10


600
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

Total time: 12.122 ms - Avg time: 2.424 ms


Scan test - all items in the table
Total time: 58.952 ms - Avg time: 11.790 ms
Total time: 25.507 ms - Avg time: 5.101 ms
Total time: 37.660 ms - Avg time: 7.532 ms
Total time: 26.781 ms - Avg time: 5.356 ms
Total time: 46.076 ms - Avg time: 9.215 ms

Attempting to delete table; please wait...


Successfully deleted table.

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

Using the AWS CLI: escriba el siguiente comando:

aws dax describe-clusters --query "Clusters[*].ClusterDiscoveryEndpoint"

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:

java TryDax mycluster.frfx8h.clustercfg.dax.amazonaws.com:8111

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 (p. 602)


TryDaxHelper.java (p. 603)
TryDaxTests.java (p. 605)

API Version 2012-08-10


601
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

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.

Puede modificar el programa de varias maneras. Por ejemplo:

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;

public class TryDax {

public static void main(String[] args) throws Exception {

TryDaxHelper helper = new TryDaxHelper();


TryDaxTests tests = new TryDaxTests();

DynamoDB ddbClient = helper.getDynamoDBClient();


DynamoDB daxClient = null;
if (args.length >= 1) {
daxClient = helper.getDaxClient(args[0]);
}

String tableName = "TryDaxTable";

System.out.println("Creating table...");
helper.createTable(tableName, ddbClient);
System.out.println("Populating table...");
helper.writeData(tableName, ddbClient, 10, 10);

DynamoDB testClient = null;


if (daxClient != null) {
testClient = daxClient;
} else {
testClient = ddbClient;
}

System.out.println("Running GetItem, Scan, and Query tests...");


System.out.println("First iteration of each test will result in cache misses");
System.out.println("Next iterations are cache hits\n");

API Version 2012-08-10


602
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

// 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.

Los mtodos getDynamoDBClient y getDaxClient proporcionan clientes de DynamoDB y DAX. Para


las operaciones del plano de control (CreateTable, DeleteTable) y las operaciones de escritura,
el programa utiliza el cliente de DynamoDB. Si especifica el punto de enlace de un clster de DAX, el
programa principal crea un cliente de DAX para llevar a cabo las operaciones de lectura (GetItem, Query
y Scan).

Los dems mtodos de TryDaxHelper (createTable, writeData y deleteTable) se utilizan para


configurar y eliminar la tabla DynamoDB y sus datos.

Puede modificar el programa de varias maneras. Por ejemplo:

Utilizar unos ajustes de desempeo provisionado diferentes para la tabla.


Modificar el tamao de cada elemento escrito (consulte la variable stringSize del mtodo
writeData).
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 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;

API Version 2012-08-10


603
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

public class TryDaxHelper {

private static final String region = EC2MetadataUtils.getEC2InstanceRegion();

DynamoDB getDynamoDBClient() {
System.out.println("Creating a DynamoDB client");
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(region)
.build();
return new DynamoDB(client);
}

DynamoDB getDaxClient(String daxEndpoint) {


System.out.println("Creating a DAX client with cluster endpoint " + daxEndpoint);
AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard();
daxClientBuilder.withRegion(region).withEndpointConfiguration(daxEndpoint);
AmazonDynamoDB client = daxClientBuilder.build();
return new DynamoDB(client);
}

void createTable(String tableName, DynamoDB client) {


Table table = client.getTable(tableName);
try {
System.out.println("Attempting to create table; please wait...");

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();
}
}

void writeData(String tableName, DynamoDB client, int pkmax, int skmax) {


Table table = client.getTable(tableName);
System.out.println("Writing data to the table...");

int stringSize = 1000;


StringBuilder sb = new StringBuilder(stringSize);
for (int i = 0; i < stringSize; i++) {
sb.append('X');
}
String someData = sb.toString();

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:");

API Version 2012-08-10


604
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

e.printStackTrace();
}
}

void deleteTable(String tableName, DynamoDB client) {


Table table = client.getTable(tableName);
try {
System.out.println("\nAttempting to delete table; please wait...");
table.delete();
table.waitForDelete();
System.out.println("Successfully deleted table.");

} 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.

Puede modificar el programa de varias maneras. Por ejemplo:

Modificar el mtodo queryTest de modo que use otra expresin KeyConditionExpression.


Agregar un filtro ScanFilter al mtodo scanTest para que solamente se devuelvan algunos de los
elementos.

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;

public class TryDaxTests {

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);

for (int i = 0; i < iterations; i++) {


startTime = System.nanoTime();

API Version 2012-08-10


605
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

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);

HashMap<String, Object> valueMap = new HashMap<String, Object>();


valueMap.put(":pkval", pk);
valueMap.put(":skval1", sk1);
valueMap.put(":skval2", sk2);

QuerySpec spec = new QuerySpec()


.withKeyConditionExpression("pk = :pkval and sk between :skval1
and :skval2")
.withValueMap(valueMap);

for (int i = 0; i < iterations; i++) {


startTime = System.nanoTime();
ItemCollection<QueryOutcome> items = table.query(spec);

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);
}
}

void scanTest(String tableName, DynamoDB client, int iterations) {


long startTime, endTime;
System.out.println("Scan test - all items in the table");
Table table = client.getTable(tableName);

for (int i = 0; i < iterations; i++) {


startTime = System.nanoTime();
ItemCollection<ScanOutcome> items = table.scan();
try {

Iterator<Item> iter = items.iterator();


while (iter.hasNext()) {
iter.next();
}
} catch (Exception e) {
System.err.println("Unable to scan table:");

API Version 2012-08-10


606
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

e.printStackTrace();
}
endTime = System.nanoTime();
printTime(startTime, endTime, iterations);
}
}

public void printTime(long startTime, long endTime, int iterations) {


System.out.format("\tTotal time: %.3f ms - ", (endTime - startTime) / (1000000.0));
System.out.format("Avg time: %.3f ms\n", (endTime - startTime) / (iterations *
1000000.0));
}
}

Paso4b: (Node.js) Ejecutar el ejemplo de aplicacin


Note

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.

1. Configure Node.js en su instancia Amazon EC2:

a. Instale el administrador de la versin de nodo (nvm):

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh | bash

b. Active nvm:

. ~/.nvm/nvm.sh

c. Use nvm para instalar Node.js:

nvm install 4.8.4

d. Compruebe que Node.js est instalado y se ejecuta correctamente:

node -e "console.log('Running Node.js ' + process.version)"

Esto debera mostrar el mensaje siguiente:

Running Node.js v4.8.4


2. Instale el cliente Node.js de DAX utilizando el administrador de paquetes de nodos (npm):

npm install amazon-dax-client

3. Descargue el cdigo fuente del programa de ejemplo (archivo .zip):

wget http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/TryDax.zip

Cuando haya terminado la descarga, extraiga los archivos de cdigo fuente:

API Version 2012-08-10


607
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

unzip TryDax.zip

4. Ejecute los siguientes programas de Node.js:

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

Using the AWS CLI: escriba el siguiente comando:

aws dax describe-clusters --query "Clusters[*].ClusterDiscoveryEndpoint"

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:

node 03-getitem-test.js mycluster.frfx8h.clustercfg.dax.amazonaws.com:8111


node 04-query-test.js mycluster.frfx8h.clustercfg.dax.amazonaws.com:8111
node 05-scan-test.js mycluster.frfx8h.clustercfg.dax.amazonaws.com:8111

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

7. Ejecute el siguiente programa de Node.js para eliminar TryDaxTable:

node 06-delete-table

Para obtener ms informacin sobre estos programas, consulte las siguientes secciones:

01-create-table.js (p. 609)


02-write-data.js (p. 610)
03-getitem-test.js (p. 610)
04-query-test.js (p. 611)
05-scan-test.js (p. 612)
06-delete-table.js (p. 613)

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.

const AmazonDaxClient = require('amazon-dax-client');


var AWS = require("aws-sdk");

var region = "us-west-2";

AWS.config.update({
region: region
});

var dynamodb = new AWS.DynamoDB() //low-level client

var tableName = "TryDaxTable";

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
}
};

dynamodb.createTable(params, function(err, data) {


if (err) {
console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Created table. Table description JSON:", JSON.stringify(data, null,
2));
}
});

API Version 2012-08-10


609
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

02-write-data.js
El programa 02-write-data.js escribe datos de prueba en TryDaxTable.

const AmazonDaxClient = require('amazon-dax-client');


var AWS = require("aws-sdk");

var region = "us-west-2";

AWS.config.update({
region: region
});

var ddbClient = new AWS.DynamoDB.DocumentClient()

var tableName = "TryDaxTable";

var someData = "X".repeat(1000);


var pkmax = 10;
var skmax = 10;

for (var ipk = 1; ipk <= 10; ipk++) {

for (var isk = 1; isk <= skmax; isk++) {


var params = {
TableName: tableName,
Item: {
"pk": ipk,
"sk": isk,
"someData": someData
}
};

//
//put item

ddbClient.put(params, function(err, data) {


if (err) {
console.error("Unable to write data: ", JSON.stringify(err, null, 2));
} else {
console.log("PutItem succeeded");
}
});

}
}

03-getitem-test.js
El programa 03-getitem-test.js escribe realiza operaciones GetItem en TryDaxTable.

const AmazonDaxClient = require('amazon-dax-client');


var AWS = require("aws-sdk");

var region = "us-west-2";

AWS.config.update({
region: region
});

var ddbClient = new AWS.DynamoDB.DocumentClient()


var daxClient = null;

API Version 2012-08-10


610
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

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 = 1;
var sk = 10;
var iterations = 5;

for (var i = 0; i < iterations; i++) {

var startTime = new Date().getTime();

for (var ipk = 1; ipk <= pk; ipk++) {


for (var isk = 1; isk <= sk; isk++) {

var params = {
TableName: tableName,
Key:{
"pk": ipk,
"sk": isk
}
};

ddbClient.get(params, function(err, data) {


if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
// GetItem succeeded
}
});
}
}

var endTime = new Date().getTime();


console.log("\tTotal time: ", (endTime - startTime) , "ms - Avg time: ", (endTime -
startTime) / iterations, "ms");

04-query-test.js
El programa 04-query-test.js escribe realiza operaciones Query en TryDaxTable.

const AmazonDaxClient = require('amazon-dax-client');


var AWS = require("aws-sdk");

var region = "us-west-2";

AWS.config.update({
region: region
});

var dynamodb = new AWS.DynamoDB(); //low-level client


var ddbClient = new AWS.DynamoDB.DocumentClient()
var daxClient = null;

if (process.argv.length > 2) {
var dax = new AmazonDaxClient({endpoints: [process.argv[2]], region: region})
daxClient = new AWS.DynamoDB.DocumentClient({service: dax });

API Version 2012-08-10


611
Amazon DynamoDB Developer Guide
Tutorial: Ejecucin de un ejemplo de aplicacin

}
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
}
};

for (var i = 0; i < iterations; i++) {


var startTime = new Date().getTime();

ddbClient.query(params, function(err, data) {


if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null,
2));
} else {
// Query succeeded
}
});

var endTime = new Date().getTime();


console.log("\tTotal time: ", (endTime - startTime) , "ms - Avg time: ", (endTime -
startTime) / iterations, "ms");

05-scan-test.js
El programa 05-scan-test.js escribe realiza operaciones Scan en TryDaxTable.

const AmazonDaxClient = require('amazon-dax-client');


var AWS = require("aws-sdk");

var region = "us-west-2";

AWS.config.update({
region: region
});

var client = new AWS.DynamoDB.DocumentClient()

if (process.argv.length > 2) {
var dax = new AmazonDaxClient({endpoints: [process.argv[2]], region: region})
client = new AWS.DynamoDB.DocumentClient({service: dax });
}

var tableName = "TryDaxTable";

var iterations = 5;

var params = {
TableName: tableName
};

API Version 2012-08-10


612
Amazon DynamoDB Developer Guide
Modificacin de una aplicacin existente para que use DAX

for (var i = 0; i < iterations; i++) {


var startTime = new Date().getTime();

client.scan(params, function(err, data) {


if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null,
2));
} else {
// Scan succeeded
}
});

var endTime = new Date().getTime();


console.log("\tTotal time: ", (endTime - startTime) , "ms - Avg time: ", (endTime -
startTime) / iterations, "ms");

06-delete-table.js
El programa 06-delete-table.js elimina TryDaxTable. Ejecute este programa despus de que haya
terminado las pruebas.

const AmazonDaxClient = require('amazon-dax-client');


var AWS = require("aws-sdk");

var region = "us-west-2";

AWS.config.update({
region: region
});

var dynamodb = new AWS.DynamoDB(); //low-level client

var tableName = "TryDaxTable";

var params = {
TableName : tableName
};

dynamodb.deleteTable(params, function(err, data) {


if (err) {
console.error("Unable to delete table. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Deleted table. Table description JSON:", JSON.stringify(data, null,
2));
}
});

Modificacin de una aplicacin existente para que use


DAX
Si ya dispone de una aplicacin Java que utiliza DynamoDB, deber modificarla para que pueda obtener
acceso al clster de DAX. El cliente Java de DAX es muy similar al cliente de bajo nivel de DynamoDB que
se incluye en el AWS SDK para Java, por lo que no es preciso volver a escribir toda la aplicacin.

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:

API Version 2012-08-10


613
Amazon DynamoDB Developer Guide
Modificacin de una aplicacin existente para que use DAX

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;

public class GetMusicItem {

public static void main(String[] args) throws Exception {

// Create a DynamoDB client


AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>();


key.put("Artist", new AttributeValue().withS("No One You Know"));
key.put("SongTitle", new AttributeValue().withS("Scared of My Shadow"));

GetItemRequest request = new GetItemRequest()


.withTableName("Music").withKey(key);

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());
}
}
}

Para modificar el programa, se sustituye el cliente de DynamoDB por un cliente de DAX:

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;

public class GetMusicItem {

public static void main(String[] args) throws Exception {

// Create a DAX client


ClientConfig daxConfig = new ClientConfig()

.withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDaxClient client = new ClusterDaxClient(daxConfig);

/*
** ...
** Remaining code omitted (it is identical)
** ...
*/

}
}

API Version 2012-08-10


614
Amazon DynamoDB Developer Guide
Modificacin de una aplicacin existente para que use DAX

Uso del API de documentos de DynamoDB


El AWS SDK para Java proporciona una interfaz de documentos para DynamoDB. El API de documentos
acta como encapsulador del cliente de bajo nivel de DynamoDB. Para obtener ms informacin, consulte
Interfaces de documentos.

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;

public class GetMusicItemWithDocumentApi {

public static void main(String[] args) throws Exception {

ClientConfig daxConfig = new ClientConfig()

.withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDaxClient client = new ClusterDaxClient(daxConfig);

// Document client wrapper


DynamoDB docClient = new DynamoDB(client);

Table table = docClient.getTable("Music");

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());
}

}
}

Cliente asincrnico de DAX


El AmazonDaxClient es sincrnico. Para las operaciones del API de DAX cuya ejecucin dura mucho,
tales como una operacin Scan en una tabla muy grande, esto puede bloquear la ejecucin del programa
hasta que se haya completado la operacin. Si el programa necesita realizar otros trabajos mientras que la
operacin del API de DAX est en curso, puede utilizar ClusterDaxAsyncClient en su lugar.

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;

API Version 2012-08-10


615
Amazon DynamoDB Developer Guide
Modificacin de una aplicacin existente para que use DAX

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;

public class DaxAsyncClientDemo {


public static void main(String[] args) throws Exception {

ClientConfig daxConfig = new ClientConfig().withCredentialsProvider(new


ProfileCredentialsProvider())
.withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");

AmazonDynamoDBAsync client = new ClusterDaxAsyncClient(daxConfig);

HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>();


key.put("Artist", new AttributeValue().withS("No One You Know"));
key.put("SongTitle", new AttributeValue().withS("Scared of My Shadow"));

GetItemRequest request = new GetItemRequest()


.withTableName("Music").withKey(key);

// 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();

} catch (ExecutionException ee) {


// Futures always wrap errors as an ExecutionException.
// The *real* exception is stored as the cause of the
// ExecutionException
Throwable exception = ee.getCause();
System.out.println("Error getting item: " + exception.getMessage());
}

// 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();

API Version 2012-08-10


616
Amazon DynamoDB Developer Guide
Administracin de clsteres de DAX

}
}

Administracin de clsteres de DAX


En esta seccin se abordan algunas de las tareas de administracin comunes de los clsteres de DAX.

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)

Permisos de IAM para administrar clsteres de DAX


Al administrar clsteres de DAX en la Consola de administracin de AWS o la AWS CLI, recomendamos
encarecidamente reducir el alcance de las acciones que los usuarios pueden llevar a cabo. De esta forma,
contribuir a mitigar los riesgos y a respetar el principio de seguridad de otorgar privilegios mnimos.

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.

IAM y creacin de clsteres de DAX: Creacin de un clster de DAX (p. 582).


IAM y operaciones del plano de datos de DAX:Control de acceso a DAX (p. 623).

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.

A modo de ejemplo, tomemos el documento de poltica de IAM siguiente:

{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dax:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
]

API Version 2012-08-10


617
Amazon DynamoDB Developer Guide
Permisos de IAM para administrar clsteres de DAX

}
]
}

Supongamos que el objetivo de esta poltica es permitir las llamadas al API de administracin de DAX para
el clster DAXCluster01 exclusivamente.

Ahora, supongamos que un usuario emite el siguiente comando de la AWS CLI:

aws dax describe-clusters

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.

En el ejemplo de poltica siguiente se muestra este enfoque. Observe que el alcance de la


instruccin DAXDataAPIs se limita al recurso DAXCluster01, pero que el recurso correspondiente a
DAXManagementAPIs ha de ser "*". Las acciones que se muestran en cada instruccin son meramente
ilustrativas y puede personalizarlas como considere oportuno para su aplicacin.

{
"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",

API Version 2012-08-10


618
Amazon DynamoDB Developer Guide
Personalizacin de los ajustes de un clster de DAX

"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": [
"*"
]
}
]
}

Personalizacin de los ajustes de un clster de DAX


Al crear un clster de DAX, se utilizan los siguientes ajustes predeterminados:

Expulsin automtica de la cach habilitada, con un TTL de 5minutos


Sin preferencias respecto a las zonas de disponibilidad
Sin preferencias respecto a los tiempos de mantenimiento
Notificaciones deshabilitadas

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.

API Version 2012-08-10


619
Amazon DynamoDB Developer Guide
Configuracin de los ajustes de TTL

Escalado de un clster de DAX


Existen dos opciones disponibles para escalar un clster de DAX. La primera opcin es el escalado de
lectura, que consiste en agregar rplicas de lectura al clster. La segunda opcin consiste en seleccionar
tipos de nodos diferentes.

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.

aws dax increase-replication-factor \


--cluster-name MyNewCluster \
--new-replication-factor 5

aws dax decrease-replication-factor \


--cluster-name MyNewCluster \
--new-replication-factor 3

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.

Configuracin de los ajustes de TTL


DAX mantiene dos cachs para datos que lee de DynamoDB:

Cach de elementos: para los elementos recuperados mediante GetItem o BatchGetItem.


Cach de consultas: para los conjuntos de resultados recuperados mediante Query o Scan.

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.

API Version 2012-08-10


620
Amazon DynamoDB Developer Guide
Compatibilidad con el etiquetado en DAX

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.

1. Cree un nuevo grupo de parmetros.

aws dax create-parameter-group \


--parameter-group-name custom-ttl

2. Establezca el TTL de la cach de elementos en 10minutos (600000milisegundos).

aws dax modify-parameter-group \


--parameter-group-name custom-ttl \
--parameter-name-values "ParameterName=record-ttl-millis,ParameterValue=600000"

3. Establezca el TTL de la cach de consultas en 3minutos (180000milisegundos).

aws dax modify-parameter-group \


--parameter-group-name custom-ttl \
--parameter-name-values "ParameterName=query-ttl-millis,ParameterValue=180000"

4. Compruebe que los parmetros se han configurado correctamente.

aws dax describe-parameters --parameter-group-name custom-ttl \


--query "Parameters[*].[ParameterName,Description,ParameterValue]"

A partir de ahora, puede lanzar un nuevo clster de DAX con este grupo de parmetros:

aws dax create-cluster \


--cluster-name MyNewCluster \
--node-type dax.r3.large \
--replication-factor 3 \
--iam-role-arn arn:aws:iam::123456789012:role/DAXServiceRole \
--parameter-group custom-ttl

Note

No se puede modificar un grupo de parmetros que se encuentre en uso en una instancia de DAX
en ejecucin.

Compatibilidad con el etiquetado en DAX


Muchos servicios de AWS, incluido DynamoDB, admiten el etiquetado: la capacidad de etiquetar recursos
con nombres definidos por el usuario. Puede asignar etiquetas a clsteres de DAX, lo que le permite
identificar rpidamente todos los recursos de AWS que tienen la misma etiqueta o categorizar las facturas
de AWS segn las etiquetas que ha asignado.
Note

Para obtener ms informacin, consulte Etiquetado para DynamoDB (p. 327).

API Version 2012-08-10


621
Amazon DynamoDB Developer Guide
Integracin con AWS CloudTrail

Uso de la Consola de administracin de AWS


Para administrar las etiquetas de los clsteres de DAX

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. En el panel de navegacin, bajo el encabezado DAX, elija Clusters.
3. Elija el clster con el que desee trabajar.
4. Elija la pestaa Tags. Aqu puede agregar, enumerar, editar o eliminar las etiquetas.

Cuando la configuracin sea la que desea, elija Apply Changes.

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:

aws dax describe-clusters \


--cluster-name MyDAXCluster \
--query "Clusters[*].ClusterArn"

En el resultado, el ARN tendr un aspecto similar a este: arn:aws:dax:us-


west-2:123456789012:cache/MyDAXCluster

En el siguiente ejemplo se muestra cmo etiquetar el clster:

aws dax tag-resource \


--resource-name arn:aws:dax:us-west-2:123456789012:cache/MyDAXCluster \
--tags="Key=ClusterUsage,Value=prod"

Para enumerar todas las etiquetas de un clster:

aws dax list-tags \


--resource-name arn:aws:dax:us-west-2:123456789012:cache/MyDAXCluster

Para eliminar una etiqueta, hay que especificar su clave:

aws dax untag-resource \


--resource-name arn:aws:dax:us-west-2:123456789012:cache/MyDAXCluster \
--tag-keys ClusterUsage

Integracin con AWS CloudTrail


DAX se integra con AWS CloudTrail, lo que permite auditar las actividades de los clsteres de DAX. Puede
utilizar logs de CloudTrail para ver todos los cambios realizados en los clsteres y en sus componentes,
como los nodos, los grupos de subredes o los grupos de parmetros. Para obtener ms informacin,
consulte Registro de operaciones de DynamoDB mediante AWS CloudTrail (p. 688).

Eliminacin de un clster de DAX


Si ya no usa un clster de DAX, debe eliminarlo para que no se le cobre por los recursos no utilizados.

Puede eliminar un clster de DAX mediante la Consola de administracin de AWS o la AWS CLI. A
continuacin se muestra un ejemplo:

API Version 2012-08-10


622
Amazon DynamoDB Developer Guide
Control de acceso a DAX

aws dax delete-cluster --cluster-name mydaxcluster

Control de acceso a DAX


DAX est diseado para funcionar conjuntamente con DynamoDB, con el fin de agregar de forma
transparente una capa de almacenamiento en cach a las aplicaciones. Sin embargo, DAX y DynamoDB
son servicios de AWS independientes. Aunque ambos servicios utilizan AWS Identity and Access
Management (IAM) para implementar sus respectivas polticas de seguridad, los modelos de seguridad de
DAX y DynamoDB son distintos.

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.

Rol de servicio de IAM para DAX


Al crear un clster de DAX, es preciso asociarlo con un rol de IAM. Esto es lo que se denominarol de
serviciodel clster.

Supongamos que desea crear un nuevo clster de DAX denominadoDAXCluster01. Podra


crear un rol de servicio denominado DAXServiceRole y asociarlo conDAXCluster01. La poltica
paraDAXServiceRoledefinira las acciones de DynamoDB queDAXCluster01podra llevar a cabo para los
usuarios que interaccionen conDAXCluster01.

Cuando se crea un rol de servicio, es preciso especificar una relacin de confianza


entreDAXServiceRoley el servicio DAX propiamente dicho. Una relacin de confianza determina
qu entidades pueden asumir un rol y utilizar sus permisos. A continuacin se muestra un ejemplo de
documento de relacin de confianza paraDAXServiceRole:

API Version 2012-08-10


623
Amazon DynamoDB Developer Guide
Poltica de IAM que permite el acceso a un clster de DAX

{
"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.

Poltica de IAM que permite el acceso a un clster de


DAX
Una vez que se ha creado un clster de DAX, es preciso conceder permisos a un usuario de IAM, para que
este pueda obtener acceso al clster de DAX.

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.

El siguiente documento de poltica concede acceso pleno al destinatario en DAXCluster01:

{
"Version": "2012-10-17",
"Statement": [
{

API Version 2012-08-10


624
Amazon DynamoDB Developer Guide
Caso prctico: Acceso a DAX y a DynamoDB

"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.

Caso prctico: Acceso a DAX y a DynamoDB


Para ayudarle a ampliar sus conocimientos sobre las polticas de IAM para usarlas con DAX, le
presentamos un escenario comn. Durante el resto de esta seccin haremos referencia a este escenario.
En el siguiente diagrama se muestra informacin general sobre el escenario:

En este escenario, existen las siguientes entidades:

API Version 2012-08-10


625
Amazon DynamoDB Developer Guide
Acceso a DynamoDB, pero no con DAX

Un usuario de IAM (Bob).


Un rol de IAM (BobUserRole). Bob asume este rol en tiempo de ejecucin.
Una poltica de IAM (BobAccessPolicy). Esta poltica se adjunta a BobUserRole. BobAccessPolicy define
los recursos de DynamoDB y DAX a los que BobUserRole est autorizado a obtener acceso.
Un clster de DAX (DAXCluster01).
Un rol de servicio de IAM (DAXServiceRole). Este rol permite queDAXCluster01obtenga acceso a
DynamoDB.
Una poltica de IAM (DAXAccessPolicy). Esta poltica se adjunta a DAXServiceRole. DAXAccessPolicy
define los API y recursos de DynamoDB a los que DAXCluster01 est autorizado a obtener acceso.
Una tabla de DynamoDB (Books).

La combinacin de instrucciones de las polticas BobAccessPolicy y DAXAccessPolicy determina lo que


Bob puede hacer con la tabla Books. Por ejemplo, Bob podra obtener acceso a Books directamente (a
travs del punto de enlace de DynamoDB), indirectamente (mediante el clster de DAX) o de las dos
maneras. Adems, Bob podra ser capaz de leer datos de Books, de escribir datos en Books o de ambas
cosas.

Acceso a DynamoDB, pero no con 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).

Acceso de solo lectura a DynamoDB (solo)


Bob puede obtener acceso a DynamoDB con BobUserRole. La poltica de IAM adjunta a este rol
(BobAccessPolicy) determina las tablas de DynamoDB a las que BobUserRole puede obtener acceso y los
API que BobUserRole puede invocar.

API Version 2012-08-10


626
Amazon DynamoDB Developer Guide
Acceso a DynamoDB, pero no con DAX

Supongamos que vamos a usar el documento de poltica siguiente para BobAccessPolicy:

{
"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.

Acceso de lectura y escritura a DynamoDB (solo)


Si BobUserRole requiere acceso de lectura y escritura a DynamoDB, la siguiente poltica lo permitira:

{
"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.

API Version 2012-08-10


627
Amazon DynamoDB Developer Guide
Acceso a DynamoDB y a DAX

Acceso a DynamoDB y a DAX

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

API Version 2012-08-10


628
Amazon DynamoDB Developer Guide
Acceso a DynamoDB y a DAX

aplicacin no tiene que ocuparse de estas acciones, puesto que nicamente se usan en las polticas de
IAM.

Acceso de solo lectura a DynamoDB y acceso de solo lectura a


DAX
Supongamos que Bob requiere acceso de solo lectura a la tabla Books tanto desde DynamoDB como
desde DAX. La siguiente poltica (adjunta a BobUserRole) concedera este acceso:

{
"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"

API Version 2012-08-10


629
Amazon DynamoDB Developer Guide
Acceso a DynamoDB y a DAX

],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}

Acceso de lectura y escritura a DynamoDB y acceso de solo


lectura con DAX
Para un rol de usuario determinado, puede proporcionar acceso de lectura y escritura a una tabla de
DynamoDB y tambin permitir el acceso de solo lectura a travs de DAX.

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.

El siguiente ejemplo de documento de poltica paraBobUserRoleconcedera este acceso:

{
"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:

API Version 2012-08-10


630
Amazon DynamoDB Developer Guide
Acceso a DynamoDB y a DAX

"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"
}
]
}

Acceso de lectura y escritura a DynamoDB y acceso de lectura y


escritura a DAX
Ahora, supongamos que Bob requiere acceso de lectura y escritura a la tabla Books, ya sea directamente
desde DynamoDB o indirectamente desde DAXCluster01. El siguiente documento de poltica, adjunto a
BobAccessPolicy, concedera este acceso:

{
"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"
}

API Version 2012-08-10


631
Amazon DynamoDB Developer Guide
Acceso a DynamoDB a travs de DAX,
pero sin acceso directo a DynamoDB

]
}

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"
}
]
}

Acceso a DynamoDB a travs de DAX, pero sin


acceso directo a DynamoDB
En este caso, Bob puede obtener acceso a la tabla Books a travs de DAX, pero no tiene acceso directo
a la tabla Books en DynamoDB. Por lo tanto, cuando Bob recibe acceso a DAX, tambin recibe acceso a
una tabla de DynamoDB a la que, de otro modo, no podra obtener acceso. Al configurar una poltica de
IAM para el rol de servicio de DAX, recuerde que cualquier usuario a quien se conceda acceso al clster
de DAX mediante la poltica de acceso de usuario recibir tambin acceso a las tablas especificadas en
esa poltica. En este caso, BobAccessPolicy recibe acceso a las tablas especificadas en DAXAccessPolicy.

API Version 2012-08-10


632
Amazon DynamoDB Developer Guide
Acceso a DynamoDB a travs de DAX,
pero sin acceso directo a DynamoDB

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.

El siguiente documento de poltica (BobAccessPolicy), adjunto aBobUserRole, concedera este acceso:

{
"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"
}
]
}

API Version 2012-08-10


633
Amazon DynamoDB Developer Guide
Referencia de la API de DAX

Tenga en cuenta que, en esta poltica de acceso, no hay permisos para obtener acceso a DynamoDB
directamente.

Combinada con BobAccessPolicy,la siguiente poltica DAXAccessPolicy proporcionara a BobUserRole


acceso a la tabla de DynamoDB Books aunque BobUserRole no pudiese obtener acceso directamente a 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"
}
]
}

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.

Referencia de la API de DAX


Para obtener ms informacin, consulte Amazon DynamoDB Accelerator en la Amazon DynamoDB API
Reference.

API Version 2012-08-10


634
Amazon DynamoDB Developer Guide
Autenticacin

Autenticacin y control de acceso de


Amazon DynamoDB

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 (p. 635)


Control de acceso (p. 636)

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.

API Version 2012-08-10


635
Amazon DynamoDB Developer Guide
Control de acceso

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.

API Version 2012-08-10


636
Amazon DynamoDB Developer Guide
Informacin general sobre la administracin de acceso

En las secciones siguientes se describe cmo administrar los permisos para Amazon DynamoDB. Le
recomendamos que lea primero la informacin general.

Informacin general sobre la administracin de acceso (p. 637)


Uso de polticas basadas en identidad (polticas de IAM) (p. 640)
Referencia de permisos del API de DynamoDB (p. 648)
Uso de condiciones (p. 652)

Informacin general de la administracin de


permisos de acceso a sus recursos de Amazon
DynamoDB
Cada recurso de AWS es propiedad de una cuenta de AWS, y los permisos para crear o tener acceso a
un recurso se rigen por las polticas de permisos. Un administrador de la cuenta puede asociar polticas
de permisos a identidades de IAM (es decir, usuarios, grupos y roles) y algunos servicios (como AWS
Lambda) permiten tambin asociar polticas de permisos a recursos.
Note

Un administrador de la cuenta (o usuario administrador) es un usuario con privilegios de


administrador. Para obtener ms informacin, consulte la seccin IAM Best Practices de la gua
Gua del usuario de IAM.

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)

Recursos y operaciones de Amazon DynamoDB


En DynamoDB, el recurso principal son las tablas. DynamoDB tambin admite otros tipos de recursos, los
ndices y las secuencias. Sin embargo, puede crear ndices y secuencias solamente en el contexto de una
tabla de DynamoDB existente. Estos elementos se denominan subrecursos.

Estos recursos principales y secundarios tienen asociado un Nombre de recursos de Amazon (ARN) nico,
tal y como se muestra en la siguiente tabla:

Tipo de recurso Formato de ARN

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

API Version 2012-08-10


637
Amazon DynamoDB Developer Guide
Titularidad de los recursos

DynamoDB proporciona un conjunto de operaciones para trabajar con recursos de DynamoDB. Para
obtener una lista de las operaciones disponibles, consulte Amazon DynamoDB Actions.

Titularidad de los recursos


La cuenta de AWS es la propietaria de los recursos que se crean en ella, independientemente de quin los
haya creado. En concreto, el propietario de los recursos es la cuenta de AWS; de la entidad principal (es
decir, la cuenta raz, un usuario de IAM o un rol IAM) que autentica la solicitud de creacin de recursos.
Los siguientes ejemplos ilustran cmo funciona:

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.

Administracin del acceso a los recursos


Una poltica de permisos describe quin tiene acceso a qu. En la siguiente seccin se explican las
opciones disponibles para crear polticas de permisos.
Note

En esta seccin se explica cmo se utiliza IAM en el contexto de DynamoDB. No se proporciona


informacin detallada sobre el servicio de IAM. Para ver la documentacin completa de IAM,
consulte What Is IAM? en la Gua del usuario de IAM. Para obtener informacin sobre la sintaxis
y descripciones de las polticas de IAM, consulte AWS IAM Policy Reference en la gua Gua del
usuario de IAM.

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)

Polticas basadas en identidad (polticas de IAM)


Puede asociar polticas a identidades de IAM. Por ejemplo, puede hacer lo siguiente:

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.

API Version 2012-08-10


638
Amazon DynamoDB Developer Guide
Especificar elementos de poltica:
acciones, efectos y entidades principales

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.

Polticas basadas en recursos


Otros servicios, como Amazon S3, admiten tambin polticas de permisos basadas en recursos. Por
ejemplo, puede asociar una poltica a un bucket de S3 para administrar los permisos de acceso a dicho
bucket. DynamoDB no admite polticas basadas en recursos.

Especificar elementos de poltica: acciones, efectos y


entidades principales
Para cada recurso de DynamoDB, el servicio define un conjunto de operaciones de API. Para conceder
permisos para estas operaciones de API, DynamoDB define un conjunto de acciones que usted puede
especificar en una poltica. Algunas operaciones de API pueden requerir permisos para ms de una
accin para poder realizar la operacin de API. Para obtener ms informacin sobre los recursos y las
operaciones de API; consulte Recursos y operaciones de Amazon DynamoDB (p. 637) y DynamoDB
Actions.

A continuacin se indican los elementos ms bsicos de la poltica:

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).

API Version 2012-08-10


639
Amazon DynamoDB Developer Guide
Especificacin de condiciones en una poltica

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).

Especificacin de condiciones en una poltica


Al conceder permisos, puede utilizar el lenguaje de la poltica de acceso para especificar las condiciones
en las que se debe aplicar una poltica. Por ejemplo, es posible que desee que solo se aplique una poltica
despus de una fecha especfica. Para obtener ms informacin sobre cmo especificar condiciones en un
lenguaje de poltica, consulte Condition en la Gua del usuario de IAM.

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).

Uso de polticas basadas en identidad (polticas de


IAM) en Amazon DynamoDB
En este tema se ofrecen ejemplos de polticas basadas en identidad que muestran cmo un administrador
de la cuenta puede asociar polticas de permisos a identidades de IAM (es decir, usuarios, grupos y roles)
y, de ese modo, conceder permisos para realizar operaciones en recursos de Amazon DynamoDB.
Important

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).

En las secciones de este tema se explica lo siguiente:

Permisos necesarios para usar la consola de Amazon DynamoDB (p. 641)


Polticas administradas (predefinidas) de AWS para Amazon DynamoDB (p. 641)
Ejemplos de polticas administradas por el cliente (p. 642)

API Version 2012-08-10


640
Amazon DynamoDB Developer Guide
Permisos de la consola

A continuacin se muestra un ejemplo de una poltica de permisos.

{
"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.

Permisos necesarios para usar la consola de Amazon


DynamoDB
Para que un usuario pueda trabajar con la consola de DynamoDB, debe tener un conjunto mnimo de
permisos que le permitan trabajar con los recursos de DynamoDB de su cuenta de AWS. Adems de estos
permisos de DynamoDB, la consola requiere permisos de los servicios siguientes:

Permisos de Amazon CloudWatch para mostrar las mtricas y los grficos.


Permisos de AWS Data Pipeline para exportar e importar datos de DynamoDB.
Permisos de AWS Identity and Access Management para obtener acceso a los roles necesarios para
importar y exportar.
Permisos de Amazon Simple Notification Service para recibir notificaciones cada vez que se active una
alarma de CloudWatch.
Permisos de AWS Lambda para procesar registros de Flujos de DynamoDB.

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.

Polticas administradas (predefinidas) de AWS para


Amazon DynamoDB
AWS aborda muchos casos de uso comunes proporcionando polticas de IAM independientes creadas y
administradas por AWS. Estas polticas administradas por AWS conceden los permisos necesarios para
casos de uso comunes, lo que le evita tener que investigar los permisos que se necesitan. Para obtener
ms informacin, consulte AWS Managed Policies en la Gua del usuario de IAM.

API Version 2012-08-10


641
Amazon DynamoDB Developer Guide
Ejemplos de polticas administradas por el cliente

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:

AmazonDynamoDBReadOnlyAccess: concede acceso de solo lectura a los recursos de DynamoDB


mediante el uso de la Consola de administracin de AWS.
AmazonDynamoDBFullAccess: concede acceso pleno a los recursos de DynamoDB mediante el uso de
la Consola de administracin de AWS.
AmazonDynamoDBFullAccesswithDataPipeline: concede acceso pleno a los recursos de DynamoDB,
incluidos los permisos de exportacin e importacin por medio de AWS Data Pipeline, mediante el uso
de Consola de administracin de AWS.

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.

Ejemplos de polticas administradas por el cliente


En esta seccin, encontrar ejemplos de polticas de usuario que conceden permisos para varias acciones
de DynamoDB. Estas polticas funcionan cuando se utiliza el SDK o la AWS CLI. de AWS. Cuando se
utiliza la consola, debe conceder permisos adicionales especficos a la consola, tal y como se explica en
Permisos necesarios para usar la consola de Amazon DynamoDB (p. 641).
Note

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)

Ejemplo 1: Permiso para que un usuario realice cualquier accin


de DynamoDB en una tabla
La siguiente poltica concede permisos para realizar todas las acciones de DynamoDB en una tabla. El
valor de ARN especificado en el campo Resource identifica una tabla de una regin determinada.

API Version 2012-08-10


642
Amazon DynamoDB Developer Guide
Ejemplos de polticas administradas por el cliente

"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.

Ejemplo 2: Permiso para obtener acceso de solo lectura a los


elementos de una tabla
La siguiente poltica concede permisos para las acciones GetItem y BatchGetItem de DynamoDB
exclusivamente, por lo que establece el acceso de solo lectura a la tabla.

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyAPIActionsOnBooks",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem"
],
"Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
}
]
}

Ejemplo 3: Permiso para realizar las operaciones Put, Update y


Delete en una tabla determinada
La siguiente poltica concede permisos para realizar las acciones PutItem, UpdateItem y DeleteItem
en una tabla concreta de DynamoDB.

{
"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"
}
]

API Version 2012-08-10


643
Amazon DynamoDB Developer Guide
Ejemplos de polticas administradas por el cliente

Ejemplo 4: Permiso para obtener acceso a una tabla concreta y a


todos sus ndices
La siguiente poltica concede permisos para realizar todas las acciones de DynamoDB en una tabla (Book)
y en todos los ndices de esta ltima. Para obtener ms informacin sobre cmo funcionan los ndices,
consulte Uso de ndices secundarios para mejorar el acceso a los datos (p. 463).

{
"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/*"
]
}
]
}

Ejemplo 5: Configuracin de polticas de permisos para entornos


de pruebas y produccin independientes
Supongamos que tiene entornos de pruebas y produccin independientes, de tal forma que cada uno
de ellos mantiene su propia versin de una tabla denominada ProductCatalog. Si crea estas tablas
ProductCatalog desde la misma cuenta de AWS, las pruebas podran afectar al entorno de produccin,
debido al modo en que se configuran los permisos (por ejemplo, los lmites relativos a las acciones de
creacin y eliminacin concurrentes se establecen para toda la cuenta de AWS). Por este motivo, cada
accin que se realiza en el entorno de pruebas reduce el nmero de acciones que quedan disponibles en
el entorno de produccin. Adems, existe el riesgo de que el cdigo del entorno de pruebas obtenga por
error acceso del entorno de produccin. Para evitar estos problemas, puede ser conveniente crear cuentas
de AWS independientes para los entornos de pruebas y de produccin.

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": [
{

API Version 2012-08-10


644
Amazon DynamoDB Developer Guide
Ejemplos de polticas administradas por el cliente

"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

Cuando se utilizan variables de polticas de IAM, es preciso especificar de forma explcita en la


poltica la versin 2012-10-17 del lenguaje de la poltica de acceso. La versin predeterminada
del lenguaje de la poltica de acceso (2008-10-17) no admite variables de polticas.

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}_*"

API Version 2012-08-10


645
Amazon DynamoDB Developer Guide
Ejemplos de polticas administradas por el cliente

Ejemplo 6: Cmo evitar que un usuario adquiera ofertas de


capacidad reservada
Los clientes de DynamoDB pueden adquirir capacidad reservada, como se describe en Precios de Amazon
DynamoDB. Con capacidad reservada, se abona una tarifa inicial nica y se adquiere el compromiso de
abonar un nivel de uso mnimo, con un ahorro significativo, durante un periodo concreto. Puede utilizar la
Consola de administracin de AWS para consultar y adquirir capacidad reservada. Sin embargo, puede
que no sea conveniente que todos los usuarios de la organizacin tengan los mismos niveles de acceso.

DynamoDB ofrece las siguientes operaciones de API para controlar el acceso a la administracin de la
capacidad reservada:

dynamodb:DescribeReservedCapacity: devuelve las adquisiciones de capacidad reservada que se


encuentran en vigor.
dynamodb:DescribeReservedCapacityOfferings: devuelve detalles sobre los planes de
capacidad reservada que AWS ofrece en ese momento.
dynamodb:PurchaseReservedCapacityOfferings: lleva a cabo la adquisicin propiamente dicha
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:*"
}
]
}

Ejemplo 7: Permiso de acceso de lectura para una secuencia de


DynamoDB solamente (no para la tabla)
Cuando se habilita un Flujos de DynamoDB en una tabla, obtiene informacin sobre cada modificacin de
los elementos de datos de esa tabla. Para obtener ms informacin, consulte Captura de la actividad de
las tablas con Flujos de DynamoDB (p. 540).

API Version 2012-08-10


646
Amazon DynamoDB Developer Guide
Ejemplos de polticas administradas por el cliente

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.

Ejemplo 8: Permiso para que una funcin AWS Lambda procese


registros de secuencias de DynamoDB
Si desea llevar a acabo determinadas acciones basndose en los nuevos eventos de una secuencia de
DynamoDB, puede escribir una funcin AWS Lambda que sea activada por esos nuevos eventos. Para
obtener ms informacin acerca del uso de Lambda con eventos de secuencia, consulte Disparadores de
Flujos de DynamoDB y AWS Lambda (p. 564). Una funcin Lambda de este tipo requiere permisos para
leer los datos de la secuencia de DynamoDB.

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",

API Version 2012-08-10


647
Amazon DynamoDB Developer Guide
Referencia de permisos del API de DynamoDB

"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.

Permisos del API de DynamoDB: referencia de


acciones, recursos y condiciones
Cuando configure Control de acceso (p. 636) y escriba una poltica de permisos que se pueda asociar
a una identidad de IAM (polticas basadas en identidad), puede utilizar la siguiente lista como referencia.
La lista incluye cada operacin de API de DynamoDB, las acciones correspondientes a las que puede
conceder permisos para realizar la accin y el recurso de AWS al que puede conceder los permisos. Las
acciones se especifican en el campo Action de la poltica y el valor del recurso se especifica en el campo
Resource de la poltica.

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).

Permisos de API de DynamoDB: referencia de acciones, recursos y claves de condicin

BatchGetItem

Acciones: dynamodb:BatchGetItem

Recurso:

arn:aws:dynamodb:region:account-id:table/table-name

o bien

arn:aws:dynamodb:region:account-id:table/*

API Version 2012-08-10


648
Amazon DynamoDB Developer Guide
Referencia de permisos del API de DynamoDB

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

API Version 2012-08-10


649
Amazon DynamoDB Developer Guide
Referencia de permisos del API de DynamoDB

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:

API Version 2012-08-10


650
Amazon DynamoDB Developer Guide
Referencia de permisos del API de DynamoDB

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:

Para consultar una tabla:arn:aws:dynamodb:region:account-id:table/table-name

o bien:

arn:aws:dynamodb:region:account-id:table/table-name

Para consultar un ndice:

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:

Para examinar una tabla:

arn:aws:dynamodb:region:account-id:table/table-name

o bien:

arn:aws:dynamodb:region:account-id:table/table-name

Para examinar un ndice:

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

API Version 2012-08-10


651
Amazon DynamoDB Developer Guide
Temas relacionados

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)

Uso de condiciones de polticas de IAM para control


de acceso preciso
Al conceder permisos en DynamoDB, puede especificar condiciones que determinan cmo se aplica una
poltica de permisos.

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.

Caso de uso de permisos


Adems de controlar el acceso a acciones del API de DynamoDB, puede controlar el acceso a elementos y
atributos de datos individuales. Por ejemplo, puede hacer lo siguiente:

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:

API Version 2012-08-10


652
Amazon DynamoDB Developer Guide
Informacin general

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:

API Version 2012-08-10


653
Amazon DynamoDB Developer Guide
Informacin general

"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"
}
}
}
]
}

Adems de conceder permisos para acciones de DynamoDB concretas (componente Action) en la


tabla GameScores (componente Resource), el componente Condition utiliza las claves de condicin
siguientes especficas de DynamoDB que limitan los permisos como se indica a continuacin:

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

API Version 2012-08-10


654
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

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.

Especificacin de condiciones: uso de claves de


condicin
AWS proporciona un conjunto de claves de condicin predefinidas (las claves de condicin generales de
AWS), para todos los servicios de AWS que admiten IAM para el control de acceso. Por ejemplo, puede
usar la clave de condicin aws:SourceIp para comprobar la direccin IP del solicitante antes de permitir
que se lleve a cabo cualquier accin. Para obtener ms informacin y una lista con las claves generales de
AWS, consulte Available Keys for Conditions en la Gua del usuario de IAM.
Note

Las claves de condicin distinguen entre maysculas y minsculas.

En la siguiente tabla se muestran las claves de condicin especficas del servicio DynamoDB que se
aplican a DynamoDB

Clave de condicin de Descripcin


DynamoDB

dynamodb:LeadingKeysRepresenta el primer atributo de clave de una tabla; es decir, la clave de


particin. Observe que el nombre de la clave, LeadingKeys, es plural,
aunque la clave se utiliza en acciones que afectan a un solo elemento.
Adems, tenga en cuenta que debe usar el modificador ForAllValues
cuando utilice LeadingKeys en una condicin.

dynamodb:Select Representa el parmetro Select de una solicitud Query o Scan. Select


puede ser cualquiera de los siguientes valores:

ALL_ATTRIBUTES
ALL_PROJECTED_ATTRIBUTES
SPECIFIC_ATTRIBUTES
COUNT

dynamodb:Attributes Representa una lista de nombres los atributos de una solicitud o de


los atributos que se devuelven a partir de una solicitud. Los valores de
Attributes reciben el mismo nombre y tienen el mismo significado que los
parmetros de algunas acciones del API de DynamoDB, como se muestra a
continuacin:

AttributesToGet

Se usa en: BatchGetItem, GetItem, Query, Scan


AttributeUpdates

Se usa en: UpdateItem


Expected

Se usa en: DeleteItem, PutItem, UpdateItem


Item

API Version 2012-08-10


655
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

Clave de condicin de Descripcin


DynamoDB
Se usa en: PutItem
ScanFilter

Se usa en: Scan

Representa el parmetro ReturnValues de una solicitud. ReturnValues


dynamodb:ReturnValues
puede ser cualquiera de los siguientes valores:

ALL_OLD
UPDATED_OLD
ALL_NEW
UPDATED_NEW
NONE

Representa el parmetro ReturnConsumedCapacity de una solicitud.


dynamodb:ReturnConsumedCapacity
ReturnConsumedCapacity puede ser uno de los siguientes valores:

TOTAL
NONE

Limitacin del acceso de los usuarios


Muchas polticas de permisos de IAM permiten a los usuarios obtener acceso nicamente los elementos
de una tabla cuyo valor de clave de particin coincide con el identificador de usuario. Por ejemplo, la
aplicacin de juegos que hemos mencionado antes limita el acceso de este modo, de tal forma que cada
usuario solo pueda obtener acceso a los datos de juego que estn asociados a su propio identificador de
usuario. Las variables de sustitucin ${www.amazon.com:user_id}, ${graph.facebook.com:id}
y ${accounts.google.com:sub} de IAM contienen identificadores de usuario de Login with Amazon,
Facebook y Google. Para saber cmo una aplicacin inicia sesin en uno de estos proveedores de
identidad y obtiene estos identificadores, consulte Uso de identidades web federadas (p. 663).
Note

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.

Ejemplos de polticas: uso de condiciones para control de acceso


preciso
En esta seccin se muestran varias polticas que permiten implementar el control de acceso preciso en las
tablas y los ndices de DynamoDB.
Note

Todos los ejemplos utilizan la regin us-west-2 y contienen identificadores de cuenta ficticios.

API Version 2012-08-10


656
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

1: Concesin de permisos que limitan el acceso a los elementos con un valor de


clave de particin especfico
La siguiente poltica concede permisos que permiten realizar un conjunto de acciones de DynamoDB en
la tabla GamesScore. En ella, se utiliza la clave de condicin dynamodb:LeadingKeys para que los
usuarios nicamente puedan realizar acciones en los elementos cuyo valor de clave de particin UserID
coincida con el identificador de usuario exclusivo de Login with Amazon correspondiente a la aplicacin.
Important

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",

API Version 2012-08-10


657
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

"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.

2: Concesin de permisos que limitan el acceso a determinados atributos de una


tabla
La siguiente poltica de permisos nicamente permite obtener acceso a dos atributos concretos de una
tabla; para ello, se agrega la clave de condicin dynamodb:Attributes. Estos atributos se pueden leer,
escribir o evaluar en una escritura condicional o un filtro de examen.

{
"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"
]
}
}

API Version 2012-08-10


658
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

}
]
}

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.

La clusula StringEqualsIfExists de la poltica de permisos se asegura de que se cumpla lo


siguiente:

Si el usuario especifica el parmetro Select, entonces su valor debe ser SPECIFIC_ATTRIBUTES.


Este requisito se impide que la accin del API devuelva cualquier atributo que no est permitido; por
ejemplo, desde una proyeccin de ndice.
Si el usuario especifica el parmetro ReturnValues, entonces su valor debe ser NONE, UPDATED_OLD
o UPDATED_NEW. Esto es obligatorio porque la accin UpdateItem lleva a cabo, adems, operaciones
de lectura implcitas para comprobar si un elemento existe antes de sustituirlo y para que los valores de
atributos anteriores se puedan devolver en caso de que se soliciten. Al restringir ReturnValues de este
modo, nos aseguramos de que los usuarios solamente puedan leer o escribir los atributos permitidos.
La clusula StringEqualsIfExists se asegura de que solamente se pueda utilizar uno de estos
parmetros (Select o ReturnValues) en cada solicitud, en el contexto de las acciones permitidas.

A continuacin se muestran algunas variaciones de esta poltica:

Para permitir exclusivamente acciones de lectura, podemos eliminar UpdateItem de la lista de


acciones permitidas. Dado que ninguna de las acciones restantes aceptan ReturnValues, podemos
eliminar ReturnValues de la condicin. Adems, podemos cambiar StringEqualsIfExists por
StringEquals, porque el parmetro Select siempre tiene un valor (ALL_ATTRIBUTES, a no ser que
se especifique otra cosa).
Para permitir exclusivamente acciones de escritura, podemos eliminar todo excepto UpdateItem de la
lista de acciones permitidas. Dado que UpdateItem no utiliza el parmetro Select, podemos eliminar
Select de la condicin. Adems, debemos cambiar StringEqualsIfExists por StringEquals,
porque el parmetro ReturnValues siempre tiene un valor (NONE, a no ser que se especifique otra
cosa).
Para permitir todos los atributos cuyo nombre coincida con un patrn, utilice StringLike en lugar
de StringEquals y use un carcter comodn (*) que halle coincidencias de patrones con varios
caracteres.

3: Concesin de permisos para evitar actualizaciones en determinados atributos


La siguiente poltica de permisos limita el acceso del usuario de forma que nicamente pueda actualizar
los atributos concretos que se identifican mediante la clave de condicin dynamodb:Attributes. La

API Version 2012-08-10


659
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

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"
]
}
}
}
]
}

Tenga en cuenta lo siguiente:

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.

4: Concesin de permisos para consultar nicamente los atributos proyectados de


un ndice
La siguiente poltica de permisos permite realizar consultas en un ndice secundario
(TopScoreDateTimeIndex) utilizando la clave de condicin dynamodb:Attributes. Adems, limita
las consultas de tal forma que solo se puedan solicitar determinados atributos que se han proyectado en el
ndice.

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",

API Version 2012-08-10


660
Amazon DynamoDB Developer Guide
Especificacin de condiciones: uso de claves de condicin

"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"
}
}
}
]
}

5: Concesin de permisos para limitar el acceso a determinados atributos y


valores de clave de particin
La poltica de permisos siguiente permite realizar acciones de DynamoDB concretas (que se han
especificado en el componente Action) en una tabla y un ndice de tabla (que se han especificado en el
componente Resource). La poltica utiliza la clave de condicin dynamodb:LeadingKeys para restringir
los permisos de tal forma que nicamente incluyan los elementos cuyo valor de clave de particin coincida
con el identificador de Facebook del usuario.

API Version 2012-08-10


661
Amazon DynamoDB Developer Guide
Temas relacionados

{
"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"
]
}
}
}
]
}

Tenga en cuenta lo siguiente:

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)

API Version 2012-08-10


662
Amazon DynamoDB Developer Guide
Uso de identidades web federadas

Uso de identidades web federadas


Cuando escriba una aplicacin dirigida a gran cantidad de usuarios, puede utilizar, si lo desea, identidades
web federadas para llevar a cabo las operaciones de autenticacin y autorizacin. Las identidades web
federadas evitan tener que crear usuarios de IAM individuales; en su lugar, los usuarios pueden iniciar
sesin en un proveedor de identidades y obtener credenciales de seguridad temporales de AWS Security
Token Service (AWS STS). A continuacin, la aplicacin puede utilizar estas credenciales para obtener
acceso a los servicios de AWS.

Las identidades web federadas admiten los siguientes proveedores de identidad:

Inicio de sesin con Amazon


Facebook
Google

Recursos adicionales para identidades web federadas


Los siguientes recursos pueden ayudarle a obtener ms informacin sobre las identidades web federadas:

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.

Ejemplo de poltica para identidades web federadas


Para mostrarle cmo se utilizan las identidades web federadas con DynamoDB, vamos a retomar la
tabla GameScores presentada en Uso de condiciones de polticas de IAM para control de acceso
preciso (p. 652). Esta es la clave principal para GameScores:

Nombre de la tabla Tipo de clave principal Nombre y tipo de clave Nombre y tipo de clave
de particin de ordenacin

GameScores (UserId, Compuesto Nombre de atributo: Nombre de atributo:


GameTitle, ...) UserId Tipo: String GameTitle Tipo: String

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.

API Version 2012-08-10


663
Amazon DynamoDB Developer Guide
Ejemplo de poltica para identidades web federadas

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.

En el diagrama siguiente se muestra cmo se integran estas piezas entre s.

Informacin general sobre las identidades web federadas

1. La aplicacin llama a un proveedor de identidades tercero para autenticar al usuario y la aplicacin. El


proveedor de identidades devuelve un token de identidad web a la aplicacin.
2. La aplicacin llama a AWS STS y pasa el token de identidad web como informacin de entrada. AWS
STS autoriza la aplicacin y le proporciona credenciales temporales de acceso a AWS. Se permite
que la aplicacin asuma un rol de IAM (GameRole) y que obtenga acceso a los recursos de AWS de
conformidad con la poltica de seguridad del rol.

API Version 2012-08-10


664
Amazon DynamoDB Developer Guide
Preparacin para usar las identidades web federadas

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.

Preparacin para usar las identidades web federadas


Si es un desarrollador de aplicaciones y desea utilizar las identidades web federadas para la aplicacin,
siga estos pasos:

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:

API Version 2012-08-10


665
Amazon DynamoDB Developer Guide
Cmo escribir la aplicacin para
usar las identidades web federadas

Login with Amazon Developer Center


Registration en el sitio web de Facebook
Using OAuth 2.0 to Access Google APIs en el sitio de Google
2. Registre su aplicacin en el proveedor de identidades. Cuando lo haga, el proveedor le proporcionar un
identificador exclusivo de la aplicacin. Si desea que la aplicacin funcione con varios proveedores de
identidades, tendr que obtener un identificador de aplicacin de cada proveedor.
3. Cree uno o varios roles de IAM. Se requiere un rol para cada proveedor de identidades de cada
aplicacin. Por ejemplo, puede crear un rol que una aplicacin asuma cuando el usuario inicie sesin
mediante Login with Amazon, un segundo rol que la misma aplicacin use cuando el usuario inicie
sesin mediante Facebook y un tercer rol que dicha aplicacin utilice cuando el usuario inicie sesin
mediante Google.

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:

Cmo autenticar a los usuarios (AWS Mobile SDK for iOS)


Cmo autenticar a los usuarios (SDK de AWS Mobile para Android)

Generacin de una poltica de IAM desde la consola de


DynamoDB
La consola de DynamoDB le puede ayudar a crear una poltica de IAM para utilizarla con las identidades
web federadas. Para ello, se selecciona una tabla de DynamoDB y se especifica el proveedor de
identidades, las acciones y los atributos que deben incluirse en la poltica. A continuacin, la consola de
DynamoDB generar una poltica que puede adjuntar a un rol de IAM.

1. Inicie sesin en la Consola de administracin de AWS y abra la consola de DynamoDB en https://


console.aws.amazon.com/dynamodb/.
2. En el panel de navegacin, elija Tables.
3. En la lista de tablas, elija aquella para la que desea crear la poltica de IAM.
4. Elija la pestaa Access control.
5. Elija el proveedor de identidades, las acciones y los atributos de la poltica.

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.

Cmo escribir la aplicacin para usar las identidades


web federadas
Para utilizar las identidades web federadas, la aplicacin debe asumir el rol de IAM que ha creado; a partir
de ese momento, la aplicacin respetar la poltica de acceso que se haya adjuntado al rol.

API Version 2012-08-10


666
Amazon DynamoDB Developer Guide
Cmo escribir la aplicacin para
usar las identidades web federadas

En tiempo de ejecucin, si la aplicacin utiliza identidades web federadas, deber seguir estos pasos:

1. Autenticarse ante el proveedor de identidades tercero. La aplicacin debe llamar al proveedor de


identidades mediante una interfaz proporcionada por este ltimo. La forma exacta en la que se lleva
a cabo la autenticacin del usuario depende del proveedor y de la plataforma en la que se ejecute la
aplicacin. Por lo general, si el usuario an no ha iniciado sesin, el proveedor de identidades (IdP) se
encarga de mostrar una pgina de inicio de sesin propia.

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).

A continuacin se muestra un ejemplo de una solicitud y la respuesta de una accin


AssumeRoleWithWebIdentity en AWS STS. El token de identidad web se obtuvo del proveedor de
identidades Login with Amazon.

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

Los campos AccessKeyID, SecretAccessKey y SessionToken contienen credenciales de


seguridad que son vlidas para este usuario y esta aplicacin exclusivamente.
El campo Expiration indica el lmite de tiempo transcurrido el cual estas credenciales ya no sern
vlidas.
El campo AssumedRoleId contiene el nombre de un rol de IAM que la aplicacin ha asumido y es
especfico de la sesin. La aplicacin respetar los controles de acceso del documento de poltica de
IAM mientras dure esta sesin.
El campo SubjectFromWebIdentityToken contiene el identificador exclusivo que aparece en una
variable de poltica de IAM para este proveedor de identidades concreto. A continuacin se muestran
las variables de poltica de IAM correspondientes a los proveedores admitidos y algunos ejemplos de
valores que pueden adoptar:

Variable de poltica Ejemplo de valor

${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.

API Version 2012-08-10


668
Amazon DynamoDB Developer Guide

Monitorizacin de DynamoDB

La monitorizacin es una parte importante del mantenimiento de la fiabilidad, la disponibilidad y el


desempeo de Amazon DynamoDB y sus soluciones de AWS. Debe recopilar datos de monitorizacin de
todas las partes de su solucin de AWS para que le resulte ms sencillo depurar cualquier error que se
produzca en distintas partes del cdigo, en caso de que ocurra. Antes de empezar a monitorizar Amazon
DynamoDB, debe crear un plan de monitorizacin que incluya respuestas a las siguientes preguntas:

Cules son los objetivos de la monitorizacin?


Qu recursos va a monitorizar?
Con qu frecuencia va a monitorizar estos recursos?
Qu herramientas de monitorizacin va a utilizar?
Quin se encargar de realizar las tareas de monitorizacin?
Quin debera recibir una notificacin cuando surjan problemas?

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:

El nmero de unidades de capacidad de lectura o escritura usadas durante el periodo de tiempo


especificado, para que pueda saber cunta capacidad de desempeo provisionada se usa.
Las solicitudes que superan la capacidad provisionada de lectura o escritura de una tabla durante el
periodo especificado, para que pueda determinar qu solicitudes superan los lmites de desempeo
provisionado de una tabla.
Los errores del sistema, para poder determinar si alguna solicitud ha dado lugar a un error.

Temas
Herramientas de monitorizacin (p. 670)
Monitorizacin con Amazon CloudWatch (p. 671)
Registro de operaciones de DynamoDB mediante AWS CloudTrail (p. 688)

API Version 2012-08-10


669
Amazon DynamoDB Developer Guide
Herramientas de monitorizacin

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.

Herramientas de monitorizacin automatizadas


Puede utilizar las siguientes herramientas de monitorizacin automatizada para monitorizar Amazon
DynamoDB e informar cuando haya algn problema:

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.

Herramientas de monitorizacin manual


Otra parte importante de la monitorizacin de Amazon DynamoDB implica la monitorizacin manual de los
elementos que no cubren las alarmas de CloudWatch. Amazon DynamoDB, CloudWatch Trusted Advisor y
otros paneles de la consola de AWS proporcionan una vista rpida del entorno de AWS. Le recomendamos
que tambin compruebe los archivos de log de Amazon DynamoDB.

El panel de Amazon DynamoDB muestra:


Alertas recientes
Capacidad total
Estado de los servicios
La pgina de inicio de CloudWatch muestra:
Alarmas y estado actual
Grficos de alarmas y recursos
Estado de los servicios

Adems, puede utilizar CloudWatch para hacer lo siguiente:


Crear paneles personalizados para monitorizar los servicios que le interesan.
Realizar un grfico con los datos de las mtricas para resolver problemas y descubrir tendencias
Buscar y examinar todas sus mtricas de recursos de AWS

API Version 2012-08-10


670
Amazon DynamoDB Developer Guide
Monitorizacin con Amazon CloudWatch

Crear y editar las alarmas de notificacin de problemas

Monitorizacin con Amazon CloudWatch


Puede monitorizar Amazon DynamoDB mediante CloudWatch, que recopila y procesa los datos sin
formato de Amazon DynamoDB en mtricas legibles y casi en tiempo real. Estas estadsticas se registran
durante un periodo de dos semanas, de forma que pueda disponer de informacin histrica y obtener una
mejor perspectiva sobre el desempeo de la aplicacin o servicio web. De forma predeterminada, los datos
de las mtricas de Amazon DynamoDB se envan a CloudWatch automticamente. Para obtener ms
informacin, consulte Qu es Amazon CloudWatch? en la Gua del usuario de Amazon CloudWatch.

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)

Mtricas y dimensiones de Amazon DynamoDB


Cuando se interacciona con DynamoDB, este enva las siguientes mtricas y dimensiones a CloudWatch.
Puede seguir los siguientes procedimientos para ver las mtricas de Amazon DynamoDB.

Para ver las mtricas (consola)

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.

1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.


2. En el panel de navegacin, seleccione Metrics.
3. Seleccione el espacio de nombres DynamoDB.

Para ver las mtricas (CLI)

En el smbolo del sistema, ejecute el siguiente comando:

aws cloudwatch list-metrics --namespace "AWS/DynamoDB"

CloudWatch muestra las siguientes mtricas para Amazon DynamoDB:

Dimensiones y mtricas de Amazon DynamoDB


A continuacin aparece una lista de dimensiones y mtricas que Amazon DynamoDB enva a Amazon
CloudWatch.

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.

API Version 2012-08-10


671
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Note

Amazon CloudWatch agrega las siguientes mtricas de DynamoDB a intervalos de un minuto:

ConditionalCheckFailedRequests
ConsumedReadCapacityUnits
ConsumedWriteCapacityUnits
ReadThrottleEvents
ReturnedBytes
ReturnedItemCount
ReturnedRecordsCount
SuccessfulRequestLatency
SystemErrors
TimeToLiveDeletedItemCount
ThrottledRequests
UserErrors
WriteThrottleEvents

Para todas las dems mtricas de DynamoDB, la granularidad de acumulacin es de cinco


minutos.

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

ConditionalCheckFailedRequests El nmero de intentos de escrituras condicionales que


han fracasado. Las operaciones PutItem, UpdateItem
y DeleteItem le permiten proporcionar una condicin
lgica que debe evaluarse como true para que la operacin
pueda continuar. Si se evala esta condicin como false,
ConditionalCheckFailedRequests se incrementa en
uno.
Note

Una escritura condicional que no haya tenido xito


dar como resultado un error HTTP 400 (Bad
Request). Estos eventos se reflejan en la mtrica
ConditionalCheckFailedRequests, pero no en
la mtrica UserErrors.

unidades: Count

Dimensiones: TableName

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount

API Version 2012-08-10


672
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin
Sum

ConsumedReadCapacityUnits El nmero de unidades de capacidad de lectura usadas


durante el periodo de tiempo especificado, para que pueda
saber cunta capacidad de desempeo provisionada se usa.
Puede recuperar la capacidad de lectura total usada para
una tabla, o para todos los ndices secundarios globales o
para un ndice secundario global determinado. Para obtener
ms informacin, consulte Provisioned Throughput in Amazon
DynamoDB.
Note

Utilice la estadstica Sum para calcular la capacidad


de desempeo utilizada. Por ejemplo, obtenga
el valor de Sum durante el intervalo de un
minuto y divdalo por el nmero de segundos
de un minuto (60) para calcular la media de
ConsumedReadCapacityUnits por segundo (si
bien, este promedio no indicar los picos grandes
sino los picos breves durante la actividad de lectura
que tuvo lugar durante ese minuto). Puede comparar
el valor calculado con el valor de desempeo
aprovisionado que proporcion a DynamoDB.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum: nmero mnimo de unidades de capacidad de


lectura usadas por una solicitud individual realizada a la
tabla o al ndice.
Maximum: nmero mximo de unidades de capacidad de
lectura usadas por una solicitud individual realizada a la
tabla o al ndice.
Average: capacidad de lectura media utilizada por
solicitud.
Sum : total de unidades de capacidad de lectura
utilizadas. Esta es la estadstica ms til para la mtrica
ConsumedReadCapacityUnits.
SampleCount: nmero de solicitudes realizadas a
DynamoDB que usaron capacidad de lectura.

API Version 2012-08-10


673
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

ConsumedWriteCapacityUnits El nmero de unidades de capacidad de escritura usadas


durante el periodo de tiempo especificado, para que pueda
saber cunta capacidad de desempeo provisionada se usa.
Puede recuperar la capacidad de escritura total usada para
una tabla, o para todos los ndices secundarios globales o
para un ndice secundario global determinado. Para obtener
ms informacin, consulte Provisioned Throughput in Amazon
DynamoDB.
Note

Utilice la estadstica Sum para calcular la capacidad


de desempeo utilizada. Por ejemplo, obtenga
el valor de Sum durante el intervalo de un
minuto y divdalo por el nmero de segundos
de un minuto (60) para calcular la media de
ConsumedWriteCapacityUnits por segundo (si
bien, este promedio no indicar los picos grandes
sino los picos breves durante la actividad de escritura
que tuvo lugar durante ese minuto). Puede comparar
el valor calculado con el valor de desempeo
aprovisionado que proporcion a DynamoDB.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum: nmero mnimo de unidades de capacidad de


escritura usadas por una solicitud individual realizada a la
tabla o al ndice.
Maximum: nmero mximo de unidades de capacidad de
escritura usadas por una solicitud individual realizada a la
tabla o al ndice.
Average: capacidad de escritura media utilizada por
solicitud.
Sum : total de unidades de capacidad de escritura
utilizadas. Esta es la estadstica ms til para la mtrica
ConsumedWriteCapacityUnits.
SampleCount: nmero de solicitudes realizadas a
DynamoDB que usaron capacidad de escritura.

API Version 2012-08-10


674
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

OnlineIndexConsumedWriteCapacityEl nmero mximo de unidades de capacidad de escritura


usadas al agregar un nuevo ndice secundario global a una
tabla. Si la capacidad de escritura del ndice es demasiado
baja, es posible que se limite la actividad de escritura entrante
durante la fase de reposicin, lo que puede aumentar el
tiempo que se tarda en crear el ndice. Debe monitorizar esta
estadstica mientras se crea el ndice para determinar si la
capacidad de escritura de ndice est infraaprovisionada.

Puede ajustar la capacidad de escritura del ndice mediante la


operacin UpdateTable, aunque todava se est creando el
ndice.

Tenga en cuenta que la mtrica


ConsumedWriteCapacityUnits para el ndice no incluye
la capacidad de desempeo de escritura utilizada durante la
creacin del ndice.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount
Sum

OnlineIndexPercentageProgress El porcentaje de finalizacin al agregar un nuevo ndice


secundario global a una tabla. DynamoDB debe asignar
primero recursos al nuevo ndice y despus reponer los
atributos de la tabla en el ndice. Para las tablas grandes,
este proceso puede tardar mucho. Debe monitorizar esta
estadstica para consultar el progreso relativo conforme
DynamoDB crea el ndice.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount
Sum

API Version 2012-08-10


675
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

OnlineIndexThrottleEvents El nmero eventos de limitacin de escritura que se


produjeron al agregar un nuevo ndice secundario global a
una tabla. Estos eventos indican que la creacin del ndice
tardar ms tiempo en completarse, porque la actividad de
escritura entrante supera la capacidad de desempeo de
escritura aprovisionada del ndice.

Puede ajustar la capacidad de escritura del ndice mediante la


operacin UpdateTable, aunque todava se est creando el
ndice.

Tenga en cuenta que la mtrica WriteThrotttleEvents


para el ndice no incluye los eventos de limitacin que se
producen durante la creacin del ndice.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount
Sum

API Version 2012-08-10


676
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

ProvisionedReadCapacityUnits El nmero de unidades de capacidad de lectura


aprovisionadas para una tabla o para un ndice secundario
global.
La dimensin TableName devuelve las
ProvisionedReadCapacityUnits de la tabla,
pero no de los ndices secundarios globales. Para ver
ProvisionedReadCapacityUnits para un ndice
secundario global, debe especificar TableName y
GlobalSecondaryIndex.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum: el valor mnimo de la capacidad de lectura


aprovisionada. Si usa UpdateTable para aumentar la
capacidad de lectura, esta mtrica muestra el valor inferior
de las ReadCapacityUnits aprovisionadas durante este
periodo de tiempo.
Maximum: el valor mximo de la capacidad de lectura
aprovisionada. Si usa UpdateTable para reducir la
capacidad de lectura, esta mtrica muestra el valor superior
de las ReadCapacityUnits aprovisionadas durante este
periodo de tiempo.
Average: capacidad de lectura media aprovisionada.
La mtrica ProvisionedReadCapacityUnits se
publica a intervalos de cinco minutos. Por lo tanto, si
ajusta rpidamente las unidades de capacidad de lectura
aprovisionadas, puede que esta estadstica no refleje la
media real.

API Version 2012-08-10


677
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

ProvisionedWriteCapacityUnits El nmero de unidades de capacidad de escritura


aprovisionadas para una tabla o para un ndice secundario
global.

La dimensin TableName devuelve las


ProvisionedWriteCapacityUnits de la tabla,
pero no de los ndices secundarios globales. Para ver
ProvisionedWriteCapacityUnits para un ndice
secundario global, debe especificar TableName y
GlobalSecondaryIndex.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Minimum: el valor mnimo de la capacidad de escritura


aprovisionada. Si usa UpdateTable para aumentar la
capacidad de escritura, esta mtrica muestra el valor
inferior de las WriteCapacityUnits aprovisionadas
durante este periodo de tiempo.
Maximum: el valor mximo de la capacidad de escritura
aprovisionada. Si usa UpdateTable para reducir la
capacidad de escritura, esta mtrica muestra el valor
superior de las WriteCapacityUnits aprovisionadas
durante este periodo de tiempo.
Average: capacidad de escritura media aprovisionada.
La mtrica ProvisionedWriteCapacityUnits se
publica a intervalos de cinco minutos. Por lo tanto, si
ajusta rpidamente las unidades de capacidad de escritura
aprovisionadas, puede que esta estadstica no refleje la
media real.

API Version 2012-08-10


678
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

ReadThrottleEvents Solicita a DynamoDB que supere las unidades de capacidad


de lectura aprovisionadas para una tabla o para un ndice
secundario global.

Una sola solicitud puede dar lugar a varios eventos. Por


ejemplo, una solicitud BatchGetItem que lee 10 elementos
se procesa como 10 eventos GetItem. Para cada evento,
ReadThrottleEvents se incrementa en uno si se limita el
evento. La mtrica ThrottledRequests de toda la solicitud
BatchGetItem no se incrementa a menos que se limiten los
diez eventos GetItem.

La dimensin TableName devuelve las


ReadThrottleEvents de la tabla, pero no de los ndices
secundarios globales. Para ver ReadThrottleEvents para
un ndice secundario global, debe especificar TableName y
GlobalSecondaryIndex.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

SampleCount
Sum

ReturnedBytes El nmero de bytes devueltos por las operaciones


GetRecords (Amazon DynamoDB Streams) durante el
periodo de tiempo especificado.

unidades: Bytes

Dimensiones: Operation, StreamLabel, TableName

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount
Sum

API Version 2012-08-10


679
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

ReturnedItemCount El nmero de elementos devueltos por las operaciones


Query o Scan durante el periodo de tiempo especificado.

Tenga en cuenta que el nmero de elementos devueltos


no tiene por qu ser el mismo que el nmero de elementos
evaluados. Suponga, por ejemplo, que ha solicitado un Scan
en una tabla que tena 100 elementos, pero ha especificado
FilterExpression que restringe los resultados, por lo que
solo se devuelven 15 elementos. En este caso, la respuesta
de Scan contendra un valor de ScanCount de 100 y un valor
de Count de 15 elementos devueltos.

unidades: Count

Dimensiones: TableName, Operation

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount
Sum

ReturnedRecordsCount El nmero de registros del flujo devueltos por las operaciones


GetRecords (Amazon DynamoDB Streams) durante el
periodo de tiempo especificado.

unidades: Count

Dimensiones: Operation, StreamLabel, TableName

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount
Sum

API Version 2012-08-10


680
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

SuccessfulRequestLatency Solicitudes realizadas correctamente a DynamoDB o


Amazon DynamoDB Streams durante el periodo de tiempo
especificado. SuccessfulRequestLatency puede
proporcionar dos tipos diferentes de informacin:

El tiempo transcurrido para las solicitudes realizadas


correctamente (Minimum, Maximum, Sum o Average).
El nmero de solicitudes realizadas correctamente
(SampleCount).

SuccessfulRequestLatency refleja actividad solamente


en DynamoDB o Amazon DynamoDB Streams, y no tiene en
cuenta la latencia de red ni la actividad en el cliente.

unidades: Milliseconds

Dimensiones: TableName, Operation

Estadsticas vlidas:

Minimum
Maximum
Average
SampleCount

SystemErrors Solicitudes realizadas a DynamoDB o Amazon DynamoDB


Streams que generan un cdigo de estado HTTP 500 durante
el periodo de tiempo especificado. Un error HTTP 500 indica
normalmente un error interno del servicio.

unidades: Count

Dimensiones: todas las dimensiones

Estadsticas vlidas:

Sum
SampleCount

TimeToLiveDeletedItemCount El nmero de elementos eliminados por Time To Live (TTL)


durante el periodo de tiempo especificado. Esta mtrica
ayuda a monitorizar el porcentaje de eliminaciones TTL en la
tabla.

unidades: Count

Dimensiones: TableName

Estadsticas vlidas:

Sum

API Version 2012-08-10


681
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

ThrottledRequests Solicita a DynamoDB que supere los lmites de capacidad de


desempeo aprovisionada en un recurso (como una tabla o
un ndice).

ThrottledRequests se incrementa en uno si algn evento


de la solicitud supera el lmite de desempeo aprovisionado.
Por ejemplo, si actualiza un elemento de una tabla con
ndices secundarios globales, hay varios eventos: una
operacin de escritura en la tabla y una operacin de
escritura en cada ndice. Si se limitan uno o varios de estos
eventos, ThrottledRequests se incrementa en uno.
Note

En una solicitud por lotes (BatchGetItem o


BatchWriteItem), ThrottledRequests solo se
incrementa si se limita cada una de las solicitudes
del lote.
Si se limita una de las solicitudes del lote, se
incrementa una de las siguientes mtricas:

ReadThrottleEvents: para un eventoGetItem


en BatchGetItem.
WriteThrottleEvents: para un evento
PutItem o DeleteItem en BatchWriteItem.

Para saber qu evento de la solicitud se limita, compare


ThrottledRequests con ReadThrottleEvents y
WriteThrottleEvents para la tabla y sus ndices.
Note

Una solicitud limitada dar como resultado un cdigo


de estado HTTP 400. Estos eventos se reflejan en la
mtrica ThrottledRequests, pero no en la mtrica
UserErrors.

unidades: Count

Dimensiones: TableName, Operation

Estadsticas vlidas:

Sum
SampleCount

API Version 2012-08-10


682
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

UserErrors Solicitudes realizadas a DynamoDB o Amazon DynamoDB


Streams que generan un cdigo de estado HTTP 400
durante el periodo de tiempo especificado. Un cdigo
HTTP 400 indica normalmente un error en el cliente, como
una combinacin no vlida de parmetros, un intento de
actualizacin en una tabla inexistente o una firma de solicitud
incorrecta.

Estos eventos se reflejan en la mtrica UserErrors, salvo


para lo siguiente:

ProvisionedThroughputExceededException: consulte la
mtrica ThrottledRequests en esta seccin.
ConditionalCheckFailedException: consulte la mtrica
ConditionalCheckFailedRequests en esta seccin.

UserErrors representa el total acumulado de errores HTTP


400 de solicitudes de DynamoDB o Amazon DynamoDB
Streams para la regin actual y la cuenta de AWS actual.

unidades: Count

Estadsticas vlidas:

Sum
SampleCount

API Version 2012-08-10


683
Amazon DynamoDB Developer Guide
Dimensiones y mtricas

Mtrica Descripcin

WriteThrottleEvents Solicita a DynamoDB que supere las unidades de capacidad


de escritura aprovisionadas para una tabla o para un ndice
secundario global.

Una sola solicitud puede dar lugar a varios eventos. Por


ejemplo, una solicitud PutItem en una tabla con tres ndices
secundarios globales dara lugar a cuatro eventos: una
operacin de escritura en la tabla y operaciones de escritura
en cada uno de los tres ndices. Para cada evento, la mtrica
WriteThrottleEvents se incrementa en uno si se limita
el evento. Para las solicitudes PutItem individuales, si se
limita alguno de los eventos, ThrottledRequests tambin
se incrementa en uno. Para BatchWriteItem, la mtrica
ThrottledRequests de toda la solicitud BatchWriteItem
no se incrementa a menos que se limiten todos los eventos
PutItem o DeleteItem.

La dimensin TableName devuelve las


WriteThrottleEvents de la tabla, pero no de los ndices
secundarios globales. Para ver WriteThrottleEvents
para un ndice secundario global, debe especificar
TableName y GlobalSecondaryIndex.

unidades: Count

Dimensiones: TableName, GlobalSecondaryIndexName

Estadsticas vlidas:

Sum
SampleCount

Dimensiones de mtricas de DynamoDB


Las mtricas de DynamoDB se clasifican por los valores de la cuenta, el nombre de tabla, el nombre del
ndice secundario global o la operacin. Puede usar la consola de CloudWatch para recuperar los datos de
DynamoDB junto con cualquier dimensin de la tabla siguiente.

Dimensin Descripcin

GlobalSecondaryIndexName La dimensin limita los datos a un ndice secundario global de una


tabla. Si especifica GlobalSecondaryIndexName, tambin debe
especificar TableName.

Operation Esta dimensin limita los datos a una de las siguientes operaciones
de DynamoDB:

PutItem
DeleteItem
UpdateItem
GetItem
BatchGetItem
Scan

API Version 2012-08-10


684
Amazon DynamoDB Developer Guide
Uso de las mtricas

Dimensin Descripcin
Query
BatchWriteItem

Adems, puede limitar los datos a la siguiente operacin de Amazon


DynamoDB Streams:

GetRecords

StreamLabel Esta dimensin limita los datos a un etiqueta de flujo especfica. Se


usa con mtricas que se originan de las operaciones GetRecords
de Amazon DynamoDB Streams.

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.

Cmo utilizo las mtricas de Amazon DynamoDB?


Las mtricas mostradas por Amazon DynamoDB proporcionan informacin que puede analizar de
diferentes maneras. En la siguiente lista se indican algunos usos frecuentes de las mtricas. Se trata de
sugerencias que puede usar como punto de partida y no de una lista completa.

Cmo...? Mtricas relevantes

How can I monitor the Puede monitorizar TimeToLiveDeletedItemCount durante


rate of TTL deletions on el periodo de tiempo especificado para realizar el seguimiento
my table? de la tasa de eliminaciones de TTL en la tabla. Para obtener
un ejemplo de una aplicacin sin servidor que utiliza la mtrica
TimeToLiveDeletedItemCount, consulte Automatically archive
items to S3 using DynamoDB Time to Live (TTL) with AWS Lambda
and Amazon Kinesis Firehose.

How can I determine how Puede monitorizar ConsumedReadCapacityUnits o


much of my provisioned ConsumedWriteCapacityUnits durante el periodo de tiempo
throughput is being especificado para realizar el seguimiento de la cantidad de
used? desempeo provisionado que se est usando.

How can I determine ThrottledRequests se incrementa en uno si algn evento


which requests exceed de la solicitud supera el lmite de desempeo aprovisionado.
the provisioned A continuacin, para saber a qu evento de la solicitud se
throughput limits of a le est imponiendo la limitacin controlada, compare las
table? mtricas ThrottledRequests con ReadThrottleEvents y
WriteThrottleEvents para la tabla y sus ndices.

How can I determine Puede monitorizar SystemErrors para determinar si alguna


if any system errors solicitud ha dado lugar a un cdigo HTTP500 (error de servidor).
occurred? Normalmente, esta mtrica debe ser igual a cero. si no lo es, es
conveniente investigar por qu.
Note

Pueden producirse errores internos del servidor cuando se


utilizan elementos. Cabe esperar que esto suceda durante

API Version 2012-08-10


685
Amazon DynamoDB Developer Guide
Creacin de alarmas

Cmo...? Mtricas relevantes


la vida til de una tabla. Todas las solicitudes que producen
un error se pueden reintentar inmediatamente.

Creacin de alarmas de CloudWatch para monitorizar


Amazon DynamoDB
Puede crear una alarma de CloudWatch que enve un mensaje de Amazon SNS cuando la alarma cambie
de estado. Una alarma vigila una nica mtrica durante el periodo especificado y realiza una o varias
acciones en funcin del valor de la mtrica relativo a un determinado umbral durante una serie de periodos
de tiempo. La accin es una notificacin que se enva a un tema de Amazon SNS o a una poltica de Auto
Scaling. Las alarmas invocan acciones nicamente para los cambios de estado prolongados. 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.

Cmo puedo recibir una notificacin antes de haber consumido


toda la capacidad de lectura?
1. Cree un tema de Amazon SNS, arn:aws:sns:us-east-1:123456789012:capacity-alarm.

Para obtener ms informacin, consulte Configuracin de Amazon Simple Notification Service.


2. Cree la alarma. En este ejemplo, presuponemos que se han provisionado cinco unidades de
capacidad de lectura.

Prompt>aws cloudwatch put-metric-alarm \


--alarm-name ReadCapacityUnitsLimitAlarm \
--alarm-description "Alarm when read capacity reaches 80% of my provisioned read
capacity" \
--namespace AWS/DynamoDB \
--metric-name ConsumedReadCapacityUnits \
--dimensions Name=TableName,Value=myTable \
--statistic Sum \
--threshold 240 \
--comparison-operator GreaterThanOrEqualToThreshold \
--period 60 \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:capacity-alarm

3. Pruebe la alarma.

Prompt>aws cloudwatch set-alarm-state --alarm-name ReadCapacityUnitsLimitAlarm --state-


reason "initializing" --state-value OK

Prompt>aws cloudwatch set-alarm-state --alarm-name ReadCapacityUnitsLimitAlarm --


state-reason "initializing" --state-value ALARM

Note

La alarma se activa cuando la capacidad de lectura consumida es de al menos 4unidades por


segundo (el 80% de las 5unidades de capacidad de lectura provisionadas) durante 1minuto
(60segundos). As pues, threshold es de 240unidades de capacidad de lectura (4unidades/
segundo * 60segundos). Cada vez que se actualiza la capacidad de lectura, debe actualizar los

API Version 2012-08-10


686
Amazon DynamoDB Developer Guide
Creacin de alarmas

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.

Cmo puedo recibir una notificacin cuando todas las


solicitudes superen los lmites de desempeo provisionado de
una tabla?
1. Cree un tema de Amazon SNS, arn:aws:sns:us-east-1:123456789012:requests-
exceeding-throughput.

Para obtener ms informacin, consulte Configuracin de Amazon Simple Notification Service.


2. Cree la alarma.

Prompt>aws cloudwatch put-metric-alarm \


--alarm-name RequestsExceedingThroughputAlarm\
--alarm-description "Alarm when my requests are exceeding provisioned throughput
limits of a table" \
--namespace AWS/DynamoDB \
--metric-name ThrottledRequests \
--dimensions Name=TableName,Value=myTable \
--statistic Sum \
--threshold 0 \
--comparison-operator GreaterThanThreshold \
--period 300 \
--unit Count \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:requests-exceeding-throughput

3. Pruebe la alarma.

Prompt>aws cloudwatch set-alarm-state --alarm-name RequestsExceedingThroughputAlarm --


state-reason "initializing" --state-value OK

Prompt>aws cloudwatch set-alarm-state --alarm-name RequestsExceedingThroughputAlarm --


state-reason "initializing" --state-value ALARM

Cmo puedo recibir una notificacin si se produce cualquier


error del sistema?
1. Cree un tema de Amazon SNS, arn:aws:sns:us-east-1:123456789012:notify-on-system-
errors.

Para obtener ms informacin, consulte Configuracin de Amazon Simple Notification Service.


2. Cree la alarma.

Prompt>aws cloudwatch put-metric-alarm \


--alarm-name SystemErrorsAlarm \
--alarm-description "Alarm when system errors occur" \
--namespace AWS/DynamoDB \
--metric-name SystemErrors \
--dimensions Name=TableName,Value=myTable \
--statistic Sum \
--threshold 0 \
--comparison-operator GreaterThanThreshold \
--period 60 \

API Version 2012-08-10


687
Amazon DynamoDB Developer Guide
Registro de operaciones de
DynamoDB mediante AWS CloudTrail

--unit Count \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:notify-on-system-errors

3. Pruebe la alarma.

Prompt>aws cloudwatch set-alarm-state --alarm-name SystemErrorsAlarm --state-reason


"initializing" --state-value OK

Prompt>aws cloudwatch set-alarm-state --alarm-name SystemErrorsAlarm --state-reason


"initializing" --state-value ALARM

Registro de operaciones de DynamoDB mediante


AWS CloudTrail
DynamoDB est integrado con CloudTrail, un servicio que captura las solicitudes de API de bajo nivel
realizadas por o en nombre de DynamoDB en su cuenta de AWS y enva los archivos log al bucket de
Amazon S3 que especifique. CloudTrail captura las llamadas realizadas desde la consola de DynamoDB o
desde el API de bajo nivel de DynamoDB. Con la informacin recopilada por CloudTrail, puede identificar la
solicitud que se realiz a DynamoDB, la direccin IP de origen desde la que se realiz la solicitud, quin la
hizo, cundo, etc. Para obtener ms informacin sobre CloudTrail, incluido cmo configurarlo y habilitarlo,
consulte la AWS CloudTrail User Guide.

Informacin de DynamoDB en CloudTrail


Cuando el registro de CloudTrail est habilitado en la cuenta de AWS, las llamadas al API de bajo nivel
realizadas a acciones de DynamoDB se registran en archivos log. Los registros de DynamoDB se crean
junto con los registros de otros servicios de AWS en un archivo log. CloudTrail determina cundo crear y
escribir en un nuevo archivo en funcin del perodo de tiempo y del tamao del archivo.

Se admiten las siguientes acciones de API:

Amazon DynamoDB

CreateTable
DeleteTable
DescribeTable
DescribeTimeToLive
ListTables
UpdateTable
UpdateTimeToLive
DescribeReservedCapacity
DescribeReservedCapacityOfferings
PurchaseReservedCapacityOfferings

Flujos de DynamoDB

DescribeStream
ListStreams

API Version 2012-08-10


688
Amazon DynamoDB Developer Guide
Descripcin de las entradas de archivos log de DynamoDB

DynamoDB Accelerator (DAX)

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.

Descripcin de las entradas de archivos log de


DynamoDB
Los archivos log de CloudTrail contienen una o varias entradas de log, cada una de las cuales est
compuesta por varios eventos con formato JSON. Una entrada de log representa una nica solicitud de
cualquier origen e incluye informacin sobre la accin solicitada, los parmetros, la fecha y la hora de la

API Version 2012-08-10


689
Amazon DynamoDB Developer Guide
Descripcin de las entradas de archivos log de DynamoDB

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.

En el siguiente ejemplo se muestra un log de CloudTrail.

{"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": [
{

API Version 2012-08-10


690
Amazon DynamoDB Developer Guide
Descripcin de las entradas de archivos log de DynamoDB

"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",

API Version 2012-08-10


691
Amazon DynamoDB Developer Guide
Descripcin de las entradas de archivos log de DynamoDB

"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"

API Version 2012-08-10


692
Amazon DynamoDB Developer Guide
Descripcin de las entradas de archivos log de DynamoDB

}
],
"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",

API Version 2012-08-10


693
Amazon DynamoDB Developer Guide
Descripcin de las entradas de archivos log de DynamoDB

"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"
}
]}

API Version 2012-08-10


694
Amazon DynamoDB Developer Guide
Prcticas recomendadas para tablas

Prcticas recomendadas para


DynamoDB

Utilice esta seccin para encontrar con rapidez recomendaciones que le permitan maximizar el desempeo
y minimizar sus costos.

Prcticas recomendadas para tablas


Las tablas de DynamoDB se distribuyen entre varias particiones. Para lograr los mejores resultados,
disee las tablas y aplicaciones, de modo que la actividad de lectura y escritura se distribuya de manera
uniforme entre todos los elementos de las tablas y evite los "puntos calientes" de E/S que pueden disminuir
el desempeo.

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)

Prcticas recomendadas para elementos


El tamao de los elementos de DynamoDB es limitado (consulte Lmites en DynamoDB (p. 765)). Sin
embargo, no existe ningn lmite en cuanto al nmero de elementos de una tabla. En lugar de almacenar

API Version 2012-08-10


695
Amazon DynamoDB Developer Guide
Prcticas recomendadas para consultas y exmenes

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)

Prcticas recomendadas para consultas y


exmenes
La actividad de lectura inesperada y sbita puede consumir rpidamente la capacidad de lectura
provisionada de una tabla o un ndices secundario global. Adems, esta actividad puede ser ineficiente si
no est repartida de manera uniforme entre las particiones de la tabla.

Consideraciones sobre el desempeo de los exmenes (p. 710)


Evite los picos repentinos en la actividad de lectura (p. 710)
Cmo sacar partido de los exmenes en paralelo (p. 712)

Prcticas recomendadas para los ndices


secundarios locales
Un local secondary index permite definir una clave de ordenacin alternativa para los datos. Puede
consultar un local secondary index de la misma forma que se consulta una tabla. Antes de utilizar
ndices secundarios locales, debe conocer las contrapartidas inherentes a ellos en trminos de costos de
desempeo provisionado, costos de almacenamiento y eficiencia de las consultas.

Utilice los ndices con moderacin (p. 713)


Elija con cautela las proyecciones (p. 713)
Optimice las consultas frecuentes para evitar las recuperaciones (p. 714)
Saque partido de los ndices dispersos (p. 714)
Vigile la expansin de las colecciones de elementos (p. 715)

Prcticas recomendadas para los ndices


secundarios globales
Los ndices secundarios globales permiten definir atributos de clave de particin y clave de ordenacin
alternativos para los datos. Estos atributos no tienen que ser necesariamente iguales que las claves de
particin y ordenacin de la tabla. Puede consultar un ndices secundario global de la misma forma que
se consulta una tabla. Al igual que con los ndices secundarios locales, los ndices secundarios globales
presentan contrapartidas que es preciso tener en cuenta al disear las aplicaciones.

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)

API Version 2012-08-10


696
Amazon DynamoDB Developer Guide
Prcticas recomendadas para las tablas

Cree una rplica de lectura consistente final (p. 716)

Prcticas recomendadas para las tablas


Temas
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)

En esta seccin se explican algunas prcticas recomendadas relativas al uso de tablas.

Diseo para distribuir de forma uniforme el acceso a


los datos entre los elementos de las tablas
El uso ptimo del desempeo provisionado de una tabla depende de estos factores:

La seleccin de la clave principal.


Los patrones de carga de trabajo de los elementos individuales.

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.

API Version 2012-08-10


697
Amazon DynamoDB Developer Guide
Diseo para distribuir de forma uniforme el acceso
a los datos entre los elementos de las tablas

Eleccin de una clave de particin


En la siguiente tabla se comparan algunos esquemas de claves de particin en lo referente a la eficiencia
de desempeo provisionado:

Valor de clave de particin Uniformidad

ID de usuario, en caso de que la aplicacin tenga Buena


muchos usuarios.

Cdigo de estado, aunque solo hay algunos Mala


cdigos de estado posibles.

Fecha de creacin del elemento, redondeada Mala


al periodo ms prximo (por ejemplo, da, hora,
minuto)

ID de dispositivo, en un caso en que cada Buena


dispositivo obtiene acceso a los datos a intervalos
relativamente similares

ID de dispositivo, en un caso en que, aunque se Mala


realiza el seguimiento de muchos dispositivos, uno
de ellos es muchsimo ms popular que los dems.

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.

Aleatorizacin entre varios valores de clave de particin


Una forma de aumentar el desempeo de escritura de esta aplicacin sera aleatorizar las escrituras entre
diversos valores de clave de particin. Elija un nmero aleatorio de un conjunto fijo (por ejemplo, el 1 200)
y concatnelo como sufijo de la fecha. Se generarn valores de clave de particin como, por ejemplo
2014-07-09.1, 2014-07-09.2 y as sucesivamente hasta el 2014-07-09.200. Al aleatorizar la clave
de particin, las escrituras en la tabla de cada da se reparten de manera uniforme entre todos los valores
de clave de particin. Con ello se consigue un paralelismo mejor y un desempeo general mayor.

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.

API Version 2012-08-10


698
Amazon DynamoDB Developer Guide
Comprensin del comportamiento de las particiones

Uso de un valor calculado


Una estrategia de aleatorizacin puede mejorar significativamente el desempeo de escritura; sin
embargo, dificulta la lectura de un elemento especfico porque no se sabe qu valor de sufijo se ha
utilizado al escribir el elemento. Para facilitar la lectura de elementos individuales, puede utilizar una
estrategia diferente: en lugar de utilizar un nmero aleatorio para distribuir los elementos entre las
particiones, utilice un nmero que pueda calcular basndose en algo que sea intrnseco al propio
elemento.

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.

Comprensin del comportamiento de las particiones


DynamoDB administra automticamente las particiones de las tablas; para ello, agrega nuevas particiones
si es preciso y distribuye la capacidad de desempeo provisionada de manera uniforme entre ellas.

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.

Asignacin inicial de particiones


Al crear una nueva tabla, DynamoDB le asigna las particiones en funcin de los ajustes de desempeo
provisionado que el autor especifica.

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:

( readCapacityUnits / 3,000 ) + ( writeCapacityUnits / 1,000 ) = initialPartitions (rounded


up)

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:

( 1,000 / 3,000 ) + ( 500 / 1,000 ) = 0.8333 --> 1

API Version 2012-08-10


699
Amazon DynamoDB Developer Guide
Comprensin del comportamiento de las particiones

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:

( 1,000 / 3,000 ) + ( 1,000 / 1,000 ) = 1.333 --> 2

En este caso, la tabla requerira dos particiones, cada una con 500unidades de capacidad de lectura y
500unidades de capacidad de escritura.

Asignacin posterior de particiones


Una nica particin puede contener aproximadamente 10 GB de datos y admite un mximo de
3000unidades de capacidad de lectura o 1000unidades 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:

1. Se asignan dos nuevas particiones (P1 y P2).


2. Se distribuyen los datos de P uniformemente entre P1 y P2.
3. Se cancela la asignacin de P de la tabla.

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.

Una divisin de particin puede producirse en respuesta a:

Un aumento de los ajustes de desempeo provisionado


Un aumento de los requisitos de almacenamiento

API Version 2012-08-10


700
Amazon DynamoDB Developer Guide
Comprensin del comportamiento de las particiones

Un aumento de los ajustes de desempeo provisionado


Si aumenta el desempeo provisionado de una tabla y el esquema de particiones actual de la tabla no
puede dar cabida a los nuevos requisitos, DynamoDB duplicar el nmero de particiones actual.

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:

( 5,000 / 3,000 ) + ( 2,000 / 1,000 ) = 3.6667 --> 4

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).

En el diagrama siguiente se muestran las cuatro particiones originales de la tabla y el esquema de


particiones resultante despus de que DynamoDB duplique el nmero de particiones. Los cuadrados
grandes representan las particiones y los pequeos, los elementos de datos de la tabla.

Aumento de los requisitos de almacenamiento


Si una particin existente se llena de datos, DynamoDB la dividir. El resultado sern dos particiones
nuevas, con los datos de la particin anterior repartidos a partes iguales entre ellas.

API Version 2012-08-10


701
Amazon DynamoDB Developer Guide
Comprensin del comportamiento de las particiones

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

Si una de estas particiones se llena al lmite de su capacidad, DynamoDB respondera dividindola,


de tal forma que habra en total nueve particiones y una capacidad de 90GB, tal y como se muestra a
continuacin:

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.

Capacidad de desempeo por particin


Si calcula el nmero de particiones de la tabla, puede determinar la capacidad de desempeo aproximada
por particin. Supongamos que desea crear una tabla con 5000unidades de capacidad de lectura y
2000unidades de capacidad de escritura. DynamoDB asignara cuatro particiones a la nueva tabla:

( 5,000 / 3,000 ) + ( 2,000 / 1,000 ) = 3.6667 --> 4

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

API Version 2012-08-10


702
Amazon DynamoDB Developer Guide
Utilice la capacidad de rfaga con moderacin

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:

Tres de las cinco particiones tendran 1250unidades de capacidad de lectura y 500unidades de


capacidad de escritura cada una.
Las otras dos particiones tendran 625unidades de capacidad de lectura y 250unidades de capacidad
de escritura cada una.

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.

Utilice la capacidad de rfaga con moderacin


DynamoDB proporciona cierta flexibilidad en el provisionamiento del desempeo por particiones. Cuando
no se utiliza todo el desempeo de una particin, DynamoDB conserva una parte de la capacidad no
utilizada para ms tarde ofrecer rfagas de uso del desempeo. En la actualidad, DynamoDB conserva
hasta cinco minutos (300segundos) de capacidad de lectura y escritura sin utilizar. Durante una rfaga de
actividad de lectura o escritura ocasional, estas unidades de capacidad adicionales pueden consumirse
muy rpidamente, incluso a ms velocidad que la capacidad de desempeo provisionada por segundo que
se ha definido para la tabla. Sin embargo, no disee ninguna aplicacin de tal forma que dependa de la
disponibilidad continua de la capacidad de rfaga: DynamoDB tambin utiliza la capacidad de rfaga para
realizar labores de mantenimiento en segundo plano y otras tareas sin previo aviso.
Note
En el futuro, estos datos de capacidad de rfaga pueden variar.

Distribuya la actividad de escritura al cargar los datos


Hay ocasiones en que se cargan datos de otros orgenes de datos en DynamoDB. Normalmente,
DynamoDB particiona los datos de la tabla entre varios servidores. Al cargar datos en una tabla, se obtiene
un desempeo mejor si se cargan los datos en todos los servidores asignados al mismo tiempo. Por
ejemplo, supongamos que desea cargar mensajes de usuarios en una tabla de DynamoDB. Podra disear
una tabla que utilice una clave principal compuesta cuya clave de particin sea UserID y cuya clave de
ordenacin sea MessageID. Al cargar datos desde el origen, podra intentar leer todos los elementos de
mensajes de un usuario concreto y cargarlos en DynamoDB, tal y como se muestra en la secuencia en la
siguiente tabla.

UserID MessageID

U1 1

U1 2

U1 ...

API Version 2012-08-10


703
Amazon DynamoDB Developer Guide
Comprensin de los patrones de
acceso en los datos de serie temporal

UserID MessageID

U1 ... hasta 100

U2 1

U2 2

U2 ...

U2 ... hasta 200

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.

Comprensin de los patrones de acceso en los datos


de serie temporal
Para cada tabla que se crea, es preciso especificar los requisitos de desempeo. DynamoDB asigna
recursos para satisfacer los requisitos de desempeo de tal forma que la latencia se mantenga baja.
Al disear la aplicacin y las tablas, debe estudiar el patrn de acceso de la aplicacin para utilizar los
recursos de las tablas de la manera ms eficiente posible.

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

API Version 2012-08-10


704
Amazon DynamoDB Developer Guide
Almacene en la cach los elementos populares

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.

Almacene en la cach los elementos populares


Algunos elementos de una tabla pueden ser ms populares que otros. Por ejemplo, tomemos la
tabla ProductCatalog que se describe en Creacin de tablas y carga de ejemplos de datos (p. 291) y
supongamos que contiene millones de productos distintos. Algunos productos pueden gozar de gran
popularidad entre los clientes, de tal forma que sistemticamente se obtenga acceso a los elementos
correspondientes con ms frecuencia que a los dems. En consecuencia, la distribucin de la actividad de
lectura en ProductCatalog presentara un sesgo marcado hacia los elementos populares.

Una solucin consistira en almacenar en cach estas lecturas en la capa de la aplicacin. El


almacenamiento en cach es una tcnica que se utiliza en muchas aplicaciones de alto desempeo, pues
la actividad de lectura de los elementos "calientes" se delegara en la cach, en lugar de llevarse a cabo
en la base de datos. La aplicacin puede almacenar en la memoria cach los elementos ms populares, o
bien utilizar un producto como ElastiCache para ello.

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.

Tenga en cuenta la uniformidad de las cargas de


trabajo al ajustar el desempeo provisionado
A medida que aumenta la cantidad de datos de la tabla o se provisiona ms capacidad de lectura y
escritura, DynamoDB reparte automticamente los datos entre varias particiones. Si la aplicacin no
requiere tanto desempeo, solo tiene que reducirlo mediante la operacin UpdateTable, para pagar
solamente por el desempeo que haya provisionado.

API Version 2012-08-10


705
Amazon DynamoDB Developer Guide
Pruebe la aplicacin a gran escala

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.

Si reduce la cantidad de desempeo provisionado de la tabla, DynamoDB no reducir el nmero de


particiones. Supongamos que cre una tabla con mucho ms desempeo provisionado del que la
aplicacin necesitaba realmente y lo redujo despus. En este caso, el desempeo provisionado por
particin sera inferior de lo que habra sido si la tabla se hubiese creado inicialmente con menos
desempeo.

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.

El desempeo de escritura mximo de una particin es de 1000unidades de capacidad de escritura


(consulte Comprensin del comportamiento de las particiones (p. 699)); por consiguiente, DynamoDB
creara 11particiones, cada una de ellas con 1000unidades de capacidad de escritura provisionadas.

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.

Pruebe la aplicacin a gran escala


Muchas tablas comienzan conteniendo pequeas cantidades de datos y crecen a medida que las
aplicaciones realizan actividades de escritura. Este crecimiento puede producirse de manera gradual,
sin superar los ajustes de desempeo provisionado que se han definido para la tabla. A medida que la
tabla aumenta de tamao, DynamoDB escala automticamente la tabla distribuyendo los datos entre ms
particiones. Cuando esto ocurre, el desempeo provisionado que se asigna a cada particin resultante es
inferior al que se ha asignado a la o las particiones originales.

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

API Version 2012-08-10


706
Amazon DynamoDB Developer Guide
Prcticas recomendadas para los elementos

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).

Prcticas recomendadas para los elementos


Temas
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)

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.

Use tablas de uno a varios en lugar de atributos de


tipo Set de gran tamao
Si la tabla contiene elementos en los que se almacenan atributos de tipo Set de gran tamao, tales como
conjuntos de nmeros o cadenas, puede ser interesante eliminar el atributo y desglosar la tabla en dos.
Para crear relaciones de uno a varios entre estas tablas, utilice las claves principales.

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.

API Version 2012-08-10


707
Amazon DynamoDB Developer Guide
Comprima los valores de atributos grandes

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.

Comprima los valores de atributos grandes


Puede comprimir los valores grandes antes de almacenarlos en DynamoDB. Esto permite reducir el costo
de almacenamiento y recuperacin de estos datos. Los algoritmos de compresin, tales como GZIP o LZO,
generan un resultado binario. A continuacin, puede almacenar estos resultados en un atributo de tipo
Binary.

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)

Almacene los valores de atributos grandes en Amazon


S3
En la actualidad, DynamoDB limita el tamao de los elementos que se almacenan en las tablas. Para
obtener ms informacin, consulte Lmites en DynamoDB (p. 765). Sin embargo, es posible que la
aplicacin necesite almacenar ms datos en un elemento de los que permite el lmite de tamao de
DynamoDB. Para solucionar este problema, puede almacenar los atributos grandes como objetos de
Amazon Simple Storage Service (Amazon S3) y almacenar el identificador de ese objeto en el elemento.
Tambin puede utilizar la compatibilidad con metadatos de objetos de Amazon S3 para almacenar el valor
de clave principal del elemento correspondiente como metadatos del objeto en Amazon S3. Este uso de
los metadatos puede ayudarle a realizar el mantenimiento de los objetos de Amazon S3 en el futuro.

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.

API Version 2012-08-10


708
Amazon DynamoDB Developer Guide
Divida los atributos grandes entre varios elementos

Este enfoque plantea algunas cuestiones que es importante tener en cuenta:

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.

Divida los atributos grandes entre varios elementos


Si necesita almacenar ms datos en un nico elemento de los que DynamoDB permite, puede almacenar
esos datos en varios elementos como porciones de un "elemento virtual" mayor. Para obtener los mejores
resultados, almacene las porciones en otra tabla distinta que tenga una clave principal simple (clave de
particin) y utilice operaciones por lotes (BatchGetItem y BatchWriteItem) para leer y escribir las
porciones. Este enfoque le ayudar a distribuir la carga de trabajo de manera uniforme entre las particiones
de la tabla.

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

Id ReplyDateTime Message ChunkCount ChunkVersion

"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..."

API Version 2012-08-10


709
Amazon DynamoDB Developer Guide
Prcticas recomendadas para consultar y examinar datos

Este enfoque plantea algunas cuestiones que es importante tener en cuenta:

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.

Prcticas recomendadas para consultar y examinar


datos
En esta seccin se explican algunas prcticas recomendadas relativas a las operaciones Query y Scan.

Consideraciones sobre el desempeo de los


exmenes
En general, las operaciones Scan son menos eficientes que otras operaciones de DynamoDB.

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.

Evite los picos repentinos en la actividad de lectura


Al crear una tabla, se establecen los requisitos de unidades de capacidad de lectura y escritura. Para
las lecturas, las unidades de capacidad se expresan como el nmero de solicitudes de consistencia alta
de lectura de datos de 4 KB por segundo. En el caso de lecturas consistentes finales, una unidad de
capacidad de lectura es de dos solicitudes de lectura de 4 KB por segundo. Una operacin Scan realiza
lecturas consistentes finales de forma predeterminada y puede devolver hasta 1 MB (una pgina) de
datos. Por lo tanto, una nica solicitud Scan puede consumir (tamao de pgina de 1 MB/tamao de
elemento 4 KB)/2 (lecturas consistentes finales) = 128 operaciones de lectura. Si desea solicitar lecturas
de consistencia alta en su lugar, la operacin Scan consumira el doble de desempeo provisionado, es
decir, 256operaciones de lectura.

API Version 2012-08-10


710
Amazon DynamoDB Developer Guide
Evite los picos repentinos en la actividad de lectura

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.

Tenga en cuenta que el problema no reside exclusivamente al aumento repentino de unidades de


capacidad que Scan utiliza. Se debe tambin a que es probable que el examen consuma todas sus
unidades de capacidad en la misma particin, porque las solicitudes de examen leen elementos que se
encuentran contiguos en la particin. Esto significa que la solicitud se dirige a la misma particin, con lo
que provoca que se consuman todas sus unidades de capacidad e impone una limitacin controlada que
impide que la particin reciba otras solicitudes. Si la solicitud de lectura de datos se hubiera distribuido
entre varias particiones, la operacin no habra impuesto una limitacin controlada a una particin
determinada.

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.

Reducir el tamao de la pgina

API Version 2012-08-10


711
Amazon DynamoDB Developer Guide
Cmo sacar partido de los exmenes en paralelo

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).

Cmo sacar partido de los exmenes en paralelo


Muchas aplicaciones pueden beneficiarse si se usan las operaciones Scan en paralelo, en lugar de
secuencialmente. Por ejemplo, una aplicacin que procesa una gran tabla de datos histricos puede
llevar a cabo un examen en paralelo mucho ms rpidamente que uno secuencial. Varios subprocesos de
trabajo contenidos en un proceso de "barrido" en segundo plano podran examinar una tabla con menor
prioridad sin afectar al trfico de produccin. En todos estos ejemplos, se utiliza una operacin Scan de tal
forma que no priva a las dems aplicaciones de los recursos de desempeo provisionado.

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:

El tamao de la tabla es de 20GB o mayor.


El desempeo de lectura provisionado de la tabla no se est utilizando en su totalidad.
Las operaciones Scan secuenciales son demasiado lentas.

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.

API Version 2012-08-10


712
Amazon DynamoDB Developer Guide
Prcticas recomendadas para
los ndices secundarios locales

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.

Prcticas recomendadas para los ndices


secundarios locales
Temas
Utilice los ndices con moderacin (p. 713)
Elija con cautela las proyecciones (p. 713)
Optimice las consultas frecuentes para evitar las recuperaciones (p. 714)
Saque partido de los ndices dispersos (p. 714)
Vigile la expansin de las colecciones de elementos (p. 715)

En esta seccin se explican algunas prcticas recomendadas relativas a los ndices secundarios locales.

Utilice los ndices con moderacin


No cree ndices secundarios locales en atributos que no vaya a consultar con frecuencia. La creacin y el
mantenimiento de varios ndices solo es razonable en tablas que se actualizan con escasa frecuencia y
se consultan segn muchos criterios distintos. Sin embargo, los ndices que no se utilizan contribuyen a
aumentar los costos de almacenamiento y E/S, sin mejorar en absoluto el desempeo de la aplicacin.

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.

Elija con cautela las proyecciones


Dado que los ndices secundarios locales consumen almacenamiento y desempeo provisionado, es
importante que su tamao sea lo menor posible. Adems, cuanto menor es el ndice, mayor es el beneficio
de desempeo en comparacin con una consulta que abarque toda la tabla. Si las consultas suelen
devolver tan solo un reducido subconjunto de atributos y el tamao total de estos atributos es mucho
menor que el elemento completo, proyecte solamente aquellos atributos que vaya a solicitar habitualmente.

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.

API Version 2012-08-10


713
Amazon DynamoDB Developer Guide
Optimice las consultas frecuentes
para evitar las recuperaciones

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.

Optimice las consultas frecuentes para evitar las


recuperaciones
Para lograr las consultas ms rpidas con la mnima latencia posible, proyecte todos los atributos que
est previsto que esas consultas devuelvan. Si consulta un ndice, pero los atributos solicitados no se han
proyectado, DynamoDB los recuperar de la tabla. Para ello, DynamoDB deber leer el elemento completo
en la tabla, lo que genera latencia y operaciones de E/S adicionales.

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.

Para obtener ms informacin sobre recuperaciones de tablas, consulte Consideraciones sobre el


desempeo provisionado para los ndices secundarios locales (p. 511).

Saque partido de los ndices dispersos


Para cualquier elemento de una tabla, DynamoDB solo escribir una entrada de ndice si el valor de la
clave de ordenacin del ndice se encuentra presente en el elemento. Si la clave de ordenacin no aparece
en todos los elementos de la tabla, se considera que el ndice es disperso.

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:

Clave de particin: CustomerId


Clave de ordenacin: OrderId

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,

API Version 2012-08-10


714
Amazon DynamoDB Developer Guide
Vigile la expansin de las colecciones de elementos

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.

Vigile la expansin de las colecciones de elementos


Una coleccin de elementos contiene todos los elementos de una tabla y sus ndices que tienen la misma
clave de particin. Una coleccin de elementos no puede superar los 10 GB, as que es posible que se
agote el espacio para un determinado valor de clave de particin.

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).

Prcticas recomendadas para los ndices


secundarios globales
Temas
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)
Cree una rplica de lectura consistente final (p. 716)

En esta seccin se explican algunas prcticas recomendadas relativas a los ndices secundarios globales.

Elija una clave que proporcione cargas de trabajo


uniformes
Al crear una tabla de DynamoDB, es importante distribuir la actividad de lectura y escritura de manera
uniforme en toda la tabla. Para ello, debe seleccionar los atributos de la clave principal de tal forma que los
datos se repartan uniformemente entre varias particiones.

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

API Version 2012-08-10


715
Amazon DynamoDB Developer Guide
Saque partido de los ndices dispersos

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.

Saque partido de los ndices dispersos


Para cualquier elemento de una tabla, DynamoDB solo escribir una entrada en el ndices secundario
global si el valor de la clave de ndice se encuentra presente en el elemento. En los ndices secundarios
globales, se trata de la clave de particin del ndice y su clave de ordenacin (si la hay). Si los valores
de las claves de ndice no aparecen en todos los elementos de la tabla, se considera que el ndice es
disperso.

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.

Utilice un ndice secundario global para realizar


bsquedas rpidas
Para crear un ndices secundario global, puede usar cualesquiera atributos de la tabla como claves de
particin y ordenacin del ndice. Incluso puede crear un ndice que tenga exactamente los mismos
atributos de clave que la tabla y proyectar solo un subconjunto de los atributos sin clave.

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.

Cree una rplica de lectura consistente final


Puede crear un ndices secundario global que tenga el mismo esquema de claves que la tabla y proyectar
en l algunos (o todos) los atributos sin clave. En la aplicacin, podra dirigir parte (o la totalidad) de la
actividad de lectura a este ndice, en lugar de a la tabla. De este modo, podra evitar tener que modificar
la capacidad de lectura provisionada de la tabla en respuesta al aumento de la actividad de lectura. Tenga
en cuenta que se producir un pequeo retraso de propagacin entre el momento en que se escribe en
la tabla y el momento en que los datos aparece en el ndice; por ello, las aplicaciones debern prever la
consistencia final cuando lean el ndice.

API Version 2012-08-10


716
Amazon DynamoDB Developer Guide
Cree una rplica de lectura consistente final

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.

API Version 2012-08-10


717
Amazon DynamoDB Developer Guide
Puntos de enlace de Amazon VPC para DynamoDB

Integracin de DynamoDB con otros


servicios de AWS

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)

Puntos de enlace de Amazon VPC para DynamoDB


Por motivos de seguridad, muchos clientes de AWS ejecutan sus aplicaciones en un entorno de Amazon
Virtual Private Cloud (Amazon VPC). Con Amazon VPC, puede lanzar instancias Amazon EC2 en una
nube virtual privada que est aislada de forma lgica de otras redes, incluida la Internet pblica. 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.
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 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.

De forma predeterminada, las comunicaciones de entrada y salida de DynamoDB usan el protocolo


HTTPS, que protege el trfico de la red mediante el uso del cifrado SSL/TLS. En el siguiente diagrama se
muestra cmo una instancia EC2 de una VPC obtiene acceso a DynamoDB:

API Version 2012-08-10


718
Amazon DynamoDB Developer Guide
Puntos de enlace de Amazon VPC para 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.

API Version 2012-08-10


719
Amazon DynamoDB Developer Guide
Tutorial: Uso de un punto de
conexin de la VPC para DynamoDB

Tutorial: Uso de un punto de conexin de la VPC para


DynamoDB
Temas
Paso 1: Lanzar una instancia Amazon EC2 (p. 720)
Paso2: Configurar la instancia Amazon EC2 (p. 722)
Paso 3: Crear un punto de conexin de la VPC para DynamoDB (p. 723)
Paso 4: Limpieza (opcional) (p. 724)

En esta seccin se explica cmo configurar y usar un punto de conexin de la VPC para DynamoDB.

Paso 1: Lanzar una instancia Amazon EC2


En este paso, lanza una instancia Amazon EC2 en su Amazon VPC predeterminada. A partir de ese
momento, podr crear y utilizar un punto de conexin de la VPC para DynamoDB.

1. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.


2. Elija Launch Instance y proceda del modo siguiente:

API Version 2012-08-10


720
Amazon DynamoDB Developer Guide
Tutorial: Uso de un punto de
conexin de la VPC para DynamoDB

Paso1: Elegir una imagen de mquina de Amazon (AMI)

En la parte superior de la lista de AMI, vaya a Amazon Linux AMI y elija Select.

Paso2: Elegir un tipo de instancia

En la parte superior de la lista de tipos de instancias, elija t2.micro.


Elija Next: Configure Instance Details.

Paso3: Configurar los detalles de la instancia

Vaya a Network y elija la VPC predeterminada.

Elija Next: Add Storage.

Paso4: Agregar almacenamiento

Elija Next: Tag Instance para omitir este paso.

Paso5: Etiquetar la instancia

Elija Next: Configure Security Group para omitir este paso.

Paso6: Configurar un grupo de seguridad

Elija Select an existing security group.


En la lista de grupos de seguridad, elija default. Se trata del grupo de seguridad predeterminado
para la VPC.
Elija Next: Review and Launch.

Paso7: Revisar el lanzamiento de la instancia

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)).

API Version 2012-08-10


721
Amazon DynamoDB Developer Guide
Tutorial: Uso de un punto de
conexin de la VPC para DynamoDB

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).

Paso2: Configurar la instancia Amazon EC2


Una vez que la instancia Amazon EC2 est disponible, podr iniciar sesin en ella y prepararla para
utilizarla por primera vez.
Note
En los pasos siguientes se presupone que se va a conectar a la instancia Amazon EC2 desde un
equipo que ejecuta Linux. Para conocer otras formas de conexin, consulte Connect to Your Linux
Instance en la Gua del usuario de Amazon EC2 para instancias de Linux.

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.

a. En el panel de navegacin, elija Security Groups.


b. Elija Create Security Group. En la ventana Create Security Group, haga lo siguiente:

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.

Cuando la configuracin sea la que desea, elija Create.


c. En el panel de navegacin, seleccione Instances.
d. Elija la instancia Amazon EC2 que ha lanzado en Paso 1: Lanzar una instancia Amazon
EC2 (p. 720).
e. Seleccione Actions --> Networking --> Change Security Groups.
f. En Cambiar Security Groups, seleccione el grupo de seguridad que ha creado anteriormente en
este procedimiento (por ejemplo: my-ssh-access). El grupo de seguridad default existente
tambin debe estar seleccionado. Cuando la configuracin sea la que desea, elija Assign Security
Groups.
2. Use el comando ssh para iniciar sesin en la instancia Amazon EC2. Por ejemplo:

ssh -i my-keypair.pem ec2-user@public-dns-name

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)).

El identificador de inicio de sesin es ec2-user. No se requiere contrasea.


3. Configure sus credenciales de AWS, tal y como se muestra a continuacin. Introduzca su ID de clave
de acceso de AWS, una clave secreta, y el nombre de la regin predeterminada cuando se le solicite:

aws configure

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE


AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

API Version 2012-08-10


722
Amazon DynamoDB Developer Guide
Tutorial: Uso de un punto de
conexin de la VPC para DynamoDB

Default region name [None]: us-east-1


Default output format [None]:

Ahora est listo para crear un punto de conexin de la VPC para DynamoDB.

Paso 3: Crear un punto de conexin de la VPC para DynamoDB


En este paso, crear un punto de conexin de la VPC para DynamoDB y lo probar para asegurarse de
que funciona.

1. Antes de empezar, compruebe que puede comunicarse con DynamoDB mediante su punto de enlace
pblico:

aws dynamodb list-tables

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).

aws ec2 describe-vpc-endpoint-services

{
"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.

aws ec2 describe-vpcs

{
"Vpcs": [
{
"VpcId": "vpc-0bbc736e",
"InstanceTenancy": "default",
"State": "available",
"DhcpOptionsId": "dopt-8454b7e1",
"CidrBlock": "172.31.0.0/16",
"IsDefault": true
}
]
}

En el resultado de ejemplo, el ID de la VPC es vpc-0bbc736e.


4. Cree el punto de conexin de la VPC. Para el parmetro --vpc-id, especifique el ID de la VPC del
paso anterior.

aws ec2 create-vpc-endpoint --vpc-id vpc-0bbc736e --service-name com.amazonaws.us-


east-1.dynamodb

API Version 2012-08-10


723
Amazon DynamoDB Developer Guide
Tutorial: Uso de un punto de
conexin de la VPC para DynamoDB

"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:

aws dynamodb list-tables

Si lo desea, puede probar otros comandos de la AWS CLI para DynamoDB. Para obtener ms
informacin, consulte la AWS Command Line Interface Reference.

Paso 4: Limpieza (opcional)


Si desea eliminar los recursos que ha creado en este tutorial, siga estos procedimientos:

Para eliminar el punto de conexin de la VPC para DynamoDB

1. Inicie sesin en la instancia Amazon EC2.


2. Determine el ID de punto de conexin de la VPC:

aws ec2 describe-vpc-endpoints

{
"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"
}
}

En el resultado de ejemplo, el ID de punto de conexin de la VPC es vpce-9b15e2f2.


3. Elimine el punto de conexin de la VPC:

aws ec2 delete-vpc-endpoints --vpc-endpoint-ids vpce-9b15e2f2

{
"Unsuccessful": []
}

La matriz vaca [] indica que la operacin se ha realizado correctamente (no hay solicitudes con
error).

API Version 2012-08-10


724
Amazon DynamoDB Developer Guide
Integracin con Amazon Cognito

Para terminar la instancia Amazon EC2

1. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.


2. En el panel de navegacin, seleccione Instances.
3. Seleccione la instancia Amazon EC2.
4. Elija Actions, Instance State, Terminate.
5. En la ventana de confirmacin, elija Yes, Terminate.

Configuracin de las credenciales de AWS en los


archivos mediante Amazon Cognito
La manera recomendada de obtener las credenciales de AWS para las aplicaciones web y para mviles
es utilizar Amazon Cognito. Amazon Cognito le evita tener que codificar de forma rgida las credenciales
de AWS en los archivos. Amazon Cognito utiliza los roles de IAM con el fin de generar credenciales
temporales para los usuarios autenticados y no autenticados de las aplicaciones.

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:

1. Cree un grupo de identidades de Amazon Cognito que permita identidades no autenticadas.

aws cognito-identity create-identity-pool \


--identity-pool-name DynamoPool \
--allow-unauthenticated-identities \
--output json
{
"IdentityPoolId": "us-west-2:12345678-1ab2-123a-1234-a12345ab12",
"AllowUnauthenticatedIdentities": true,
"IdentityPoolName": "DynamoPool"
}

2. Copie la poltica siguiente en un archivo denominado myCognitoPolicy.json. Cambie el


identificador del grupo de identidades (us-west-2:12345678-1ab2-123a-1234-a12345ab12) por su
propio IdentityPoolId obtenido en el paso anterior:

{
"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"
}
}
}
]
}

API Version 2012-08-10


725
Amazon DynamoDB Developer Guide
Integracin con Amazon Redshift

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.

aws iam create-role --role-name Cognito_DynamoPoolUnauth \


--assume-role-policy-document file://PathToFile/myCognitoPolicy.json --output json

4. Conceda al rol Cognito_DynamoPoolUnauth acceso pleno al servicio de DynamoDB adjuntndole


una poltica administrada (AmazonDynamoDBFullAccess).

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/


AmazonDynamoDBFullAccess \
--role-name Cognito_DynamoPoolUnauth

Note

Si lo prefiere, puede conceder acceso preciso a DynamoDB. Para obtener ms informacin,


consulte Uso de condiciones de polticas de IAM para control de acceso preciso.
5. Obtenga y copie el ARN del rol de IAM:

aws iam get-role --role-name Cognito_DynamoPoolUnauth --output json

6. Agregue el rol Cognito_DynamoPoolUnauth al grupo de identidades DynamoPool. El formato que


debe especificar es KeyName=string, donde KeyName es unauthenticated y string es el ARN
del rol obtenido en el paso anterior.

aws cognito-identity set-identity-pool-roles \


--identity-pool-id "us-west-2:12345678-1ab2-123a-1234-a12345ab12" \
--roles unauthenticated=arn:aws:iam::123456789012:role/Cognito_DynamoPoolUnauth --
output json

7. Especifique las credenciales de Amazon Cognito en sus archivos. Modifique los valores de
IdentityPoolId y RoleArn en consecuencia.

AWS.config.credentials = new AWS.CognitoIdentityCredentials({


IdentityPoolId: "us-west-2:12345678-1ab2-123a-1234-a12345ab12",
RoleArn: "arn:aws:iam::123456789012:role/Cognito_DynamoPoolUnauth"
});

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.

Carga de datos de DynamoDB a Amazon Redshift


Amazon Redshift complementa Amazon DynamoDB con prestaciones avanzadas de inteligencia
empresarial y una potente interfaz basada en SQL. Cuando se copian datos de una tabla de DynamoDB
en Amazon Redshift, se pueden llevar a cabo consultas complejas de anlisis de esos datos, lo que incluye
uniones con otras tablas del clster de Amazon Redshift.

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.

A continuacin se muestra un ejemplo de comando COPY de SQL en Amazon Redshift:

copy favoritemovies from 'dynamodb://my-favorite-movies-table'


credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-
Access-Key>'
readratio 50;

En este ejemplo, la tabla de origen de DynamoDB es my-favorite-movies-table. La tabla de


destino de Amazon Redshift es favoritemovies. La clusula readratio 50 regula el porcentaje
de desempeo provisionado que se consume; en este caso, el comando COPY utilizar como mximo
un 50% de las unidades de capacidad de lectura provisionadas para my-favorite-movies-table.
Recomendamos encarecidamente establecer este porcentaje en un valor menor que el promedio de
desempeo provisionado sin utilizar.

Para obtener instrucciones detalladas sobre cmo cargar datos de DynamoDB en Amazon Redshift,
consulte las secciones siguientes de la Amazon Redshift Database Developer Guide:

Loading data from a DynamoDB table


The COPY command
Ejemplos de COPY

Procesamiento de datos de DynamoDB con Apache


Hive en Amazon EMR
Amazon DynamoDB se integra con Apache Hive, una aplicacin de almacenamiento de datos que se
ejecuta en Amazon EMR. Hive puede leer y escribir datos en las tablas de DynamoDB, lo que le permite:

Consultar datos de DynamoDB en directo utilizando un lenguaje semejante a SQL (HiveQL).


Copiar datos de una tabla de DynamoDB en un bucket de Amazon S3 y viceversa.
Copiar datos de una tabla de DynamoDB en Hadoop Distributed File System (HDFS) y viceversa.
Realizar operaciones de unin con las tablas de DynamoDB.

Temas
Informacin general (p. 728)

API Version 2012-08-10


727
Amazon DynamoDB Developer Guide
Informacin general

Tutorial: Uso de Amazon DynamoDB y Apache Hive (p. 728)


Crear una tabla externa en Hive (p. 735)
Procesamiento de instrucciones de HiveQL (p. 737)
Consulta de datos en DynamoDB (p. 738)
Copia de datos en y desde Amazon DynamoDB (p. 740)
Ajuste del desempeo (p. 751)

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.

Tutorial: Uso de Amazon DynamoDB y Apache Hive


En este tutorial, lanzaremos un clster de Amazon EMR y, a continuacin, usaremos Apache Hive para
procesar los datos almacenados en una tabla de DynamoDB.

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).

API Version 2012-08-10


728
Amazon DynamoDB Developer Guide
Tutorial: Uso de Amazon DynamoDB y Apache Hive

Para obtener ms informacin, consulte el Hive Tutorial.

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

Paso 1: Crear un par de claves de Amazon EC2 (p. 729)

Paso 1: Crear un par de claves de Amazon EC2


En este paso, crearemos el par de claves de Amazon EC2 que se requiere para conectarse a un nodo
maestro de Amazon EMR y ejecutar comandos de Hive.

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

API Version 2012-08-10


729
Amazon DynamoDB Developer Guide
Tutorial: Uso de Amazon DynamoDB y Apache Hive

Paso 2: Lanzar un clster de Amazon EMR (p. 730)

Paso 2: Lanzar un clster de Amazon EMR


En este paso, configuraremos y lanzaremos un clster de Amazon EMR. Ya estarn instalados en el
clster tanto Hive como un controlador de almacenamiento para DynamoDB.

1. Abra la consola de Amazon EMR en https://console.aws.amazon.com/elasticmapreduce/.


2. Elija Create Cluster.
3. En la pgina Create Cluster - Quick Options, haga lo 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.

No cambie los valores predeterminados de los dems ajustes.


4. Elija Create cluster.

Se tardan unos minutos en lanzar el clster. Puede utilizar la pgina Cluster Details de la consola de
Amazon EMR para monitorizar el progreso.

Cuando el estado cambia a Waiting, el clster est preparado para usarlo.

Archivos log del clster y Amazon S3


Un clster de Amazon EMR genera archivos log que contienen informacin acerca del estado del clster
y sobre depuracin. La configuracin predeterminada de Create Cluster - Quick Options incluye la
configuracin de registros de Amazon EMR.

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

Paso 3: Conectarse al nodo maestro (p. 730)

Paso 3: Conectarse al nodo maestro


Cuando el estado del clster de Amazon EMR cambia a Waiting, ya puede conectarse al nodo maestro
mediante SSH y llevar a cabo operaciones de lnea de comandos.

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.

API Version 2012-08-10


730
Amazon DynamoDB Developer Guide
Tutorial: Uso de Amazon DynamoDB y Apache Hive

4. Siga las instrucciones de Connect to the Master Node Using 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

Paso 4: Cargar los datos en HDFS (p. 731)

Paso 4: Cargar los datos en HDFS


En este paso, copiaremos un archivo de datos en Hadoop Distributed File System (HDFS) y, a
continuacin, crearemos una tabla Hive externa mapeada con ese archivo de datos.

Descarga del ejemplo de datos

1. Descargue el ejemplo de archivo de datos (features.zip):

wget http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/
features.zip

2. Extraiga el archivo features.txt del archivo comprimido:

unzip features.zip

3. Vea las primeras lneas del archivo features.txt:

head features.txt

El resultado debe ser parecido al siguiente:

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

API Version 2012-08-10


731
Amazon DynamoDB Developer Guide
Tutorial: Uso de Amazon DynamoDB y Apache Hive

El archivo de datos contiene un subconjunto de datos proporcionados por el Consejo Estadounidense


de Nombres Geogrficos (United States Board on Geographic Names, http://geonames.usgs.gov/
domestic/download_data.htm).

El archivo features.txt contiene un subconjunto de los datos del Consejo Estadounidense de


Nombres Geogrficos (United States Board on Geographic Names, http://geonames.usgs.gov/
domestic/download_data.htm). Los campos de cada lnea representan lo siguiente:

Identificador del accidente geogrfico (identificador nico)


Nombre
Clase (lago, bosque, arroyo, etc.)
Estado
Latitud (grados)
Longitud (grados)
Altitud (en pies)
4. En el smbolo del sistema, escriba el siguiente comando:

hive

El smbolo del sistema cambia a lo siguiente: hive>


5. Escriba la siguiente instruccin de HiveQL para crear una tabla de Hive nativa:

CREATE TABLE hive_features


(feature_id BIGINT,
feature_name STRING ,
feature_class STRING ,
state_alpha STRING,
prim_lat_dec DOUBLE ,
prim_long_dec DOUBLE ,
elev_in_ft BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n';

6. Escriba la siguiente instruccin de HiveQL para cargar datos en la tabla:

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:

SELECT state_alpha, COUNT(*)


FROM hive_features
GROUP BY state_alpha;

API Version 2012-08-10


732
Amazon DynamoDB Developer Guide
Tutorial: Uso de Amazon DynamoDB y Apache Hive

El resultado debera ser una lista de estados y el nmero de accidentes geogrficos de cada uno de
ellos.

Paso siguiente

Paso 5: Copiar los datos a DynamoDB (p. 733)

Paso 5: Copiar los datos a DynamoDB


En este paso, copiaremos los datos de la tabla de Hive (hive_features) en una nueva tabla de
DynamoDB.

1. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


2. Seleccione Create Table.
3. En la pgina Create DynamoDB table, haga lo siguiente:

a. En Table, escriba Features.


b. En Primary key, en el campo Partition key, escriba Id. Establezca el tipo de datos en Number.

Desactive Use Default Settings. En Provisioned Capacity, especifique lo siguiente:

Unidades de capacidad de lectura10


Unidades de capacidad de escritura10

Seleccione Create.
4. En el smbolo del sistema de Hive, escriba la instruccin de HiveQL siguiente:

CREATE EXTERNAL TABLE ddb_features


(feature_id BIGINT,
feature_name STRING,
feature_class STRING,
state_alpha STRING,
prim_lat_dec DOUBLE,
prim_long_dec DOUBLE,
elev_in_ft BIGINT)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES(
"dynamodb.table.name" = "Features",

"dynamodb.column.mapping"="feature_id:Id,feature_name:Name,feature_class:Class,state_alpha:State,p
);

Ahora, hemos establecido un mapeo entre Hive y la tabla Features de DynamoDB.


5. Escriba la instruccin de HiveQL siguiente para importar los datos a DynamoDB:

INSERT OVERWRITE TABLE ddb_features


SELECT
feature_id,
feature_name,
feature_class,
state_alpha,
prim_lat_dec,
prim_long_dec,

API Version 2012-08-10


733
Amazon DynamoDB Developer Guide
Tutorial: Uso de Amazon DynamoDB y Apache Hive

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:

a. En el panel de navegacin de la consola de DynamoDB, elija Tables.


b. Elija la tabla Features y, a continuacin, elija la pestaa Items para ver los datos.

Paso siguiente

Paso 6: Consultar los datos en la tabla de DynamoDB (p. 734)

Paso 6: Consultar los datos en la tabla de DynamoDB


En este paso, vamos a usar HiveQL para consultar la tabla Features en DynamoDB. Pruebe las siguientes
consultas en Hive:

1. Todos los tipos de accidentes geogrficos (feature_class) por orden alfabtico:

SELECT DISTINCT feature_class


FROM ddb_features
ORDER BY feature_class;

2. Todos los lagos que empiezan por la letra "M":

SELECT feature_name, state_alpha


FROM ddb_features
WHERE feature_class = 'Lake'
AND feature_name LIKE 'M%'
ORDER BY feature_name;

3. Los estados que tienen al menos tres accidentes geogrficos con ms de una milla de altitud
(5280pies/1609,34metros):

SELECT state_alpha, feature_class, COUNT(*)


FROM ddb_features
WHERE elev_in_ft > 5280
GROUP by state_alpha, feature_class
HAVING COUNT(*) >= 3
ORDER BY state_alpha, feature_class;

Paso siguiente

Paso 7: Limpieza (opcional) (p. 734)

Paso 7: Limpieza (opcional)


Una vez completado el tutorial, puede continuar leyendo esta seccin para obtener ms informacin sobre
cmo usar los datos de DynamoDB en Amazon EMR. Mientras lo hace, puede que prefiera mantener el
clster de Amazon EMR en funcionamiento.

API Version 2012-08-10


734
Amazon DynamoDB Developer Guide
Crear una tabla externa en Hive

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.

1. Termine el clster de Amazon EMR:

a. Abra la consola de Amazon EMR en https://console.aws.amazon.com/elasticmapreduce/.


b. Elija el clster de Amazon EMR, seleccione Terminate y, a continuacin, confirme la operacin.
2. Elimine la tabla Features de DynamoDB:

a. Abra la consola de DynamoDB en https://console.aws.amazon.com/dynamodb/.


b. En el panel de navegacin, elija Tables.
c. Elija la tabla Features. En el men Actions, elija Delete Table.
3. Elimine el bucket de Amazon S3 que contiene los archivos log de Amazon EMR:

a. Abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.


b. En la lista de buckets, elija aws-logs- accountID-region, donde accountID es el nmero
de su cuenta de AWS y region es la regin en la que ha lanzado el clster.
c. En el men Action, elija Delete.

Crear una tabla externa en Hive


En Tutorial: Uso de Amazon DynamoDB y Apache Hive (p. 728), hemos creado una tabla de Hive
externa mapeada a una tabla de DynamoDB. Cada vez que se emitan instrucciones de HiveQL para la
tabla externa, las operaciones de lectura y escritura se transmitan a la tabla de DynamoDB.

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)

Sintaxis de CREATE EXTERNAL TABLE


A continuacin se muestra la sintaxis de HiveQL para crear una tabla de Hive externa mapeada a una tabla
de DynamoDB:

CREATE EXTERNAL TABLE hive_table


(hive_column1_name hive_column1_datatype, hive_column2_name hive_column2_datatype...)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'

API Version 2012-08-10


735
Amazon DynamoDB Developer Guide
Crear una tabla externa en Hive

TBLPROPERTIES (
"dynamodb.table.name" = "dynamodb_table",
"dynamodb.column.mapping" =
"hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name..."
);

La lnea 1 es el principio de la instruccin CREATE EXTERNAL TABLE, en la que se indica el nombre de la


tabla de Hive (hive_table) que se desea a crear.

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'.

La lnea 4 es el principio de la clusula TBLPROPERTIES, en la que se definen los parmetros siguientes


de DynamoDBStorageHandler:

dynamodb.table.name: nombre de la tabla de DynamoDB.


dynamodb.column.mapping: pares de los nombres de las columnas de la tabla de Hive
y sus atributos correspondientes en la tabla de DynamoDB. Cada par tiene el formato
nombre_de_columna_de_hive:nombre_de_atributo_de_dynamodb y los pares estn separados entre s
por comas.

Tenga en cuenta lo siguiente:

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

La instruccin CREATE EXTERNAL TABLE no lleva a cabo ninguna validacin relativa a


la clusula TBLPROPERTIES. Los valores que proporcione para dynamodb.table.name
y dynamodb.column.mapping solamente sern evaluados por la clase
DynamoDBStorageHandler cuando se intente obtener acceso a la tabla.

Mapeos de tipos de datos


En la tabla siguiente se muestran los tipos de datos de DynamoDB y aquellos de Hive que son
compatibles:

Tipo de datos de DynamoDB Tipo de datos de Hive

Cadena STRING

API Version 2012-08-10


736
Amazon DynamoDB Developer Guide
Procesamiento de instrucciones de HiveQL

Tipo de datos de DynamoDB Tipo de datos de Hive

Nmero BIGINT o bien DOUBLE

Binary BINARY

String Set ARRAY<STRING>

Number Set ARRAY<BIGINT> o bien ARRAY<DOUBLE>

Binary Set ARRAY<BINARY>

Note

La clase DynamoDBStorageHandler no admite los siguientes tipos de datos de DynamoDB, por


lo que estos no se pueden utilizar con dynamodb.column.mapping:

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.

Procesamiento de instrucciones de HiveQL


Hive es una aplicacin que se ejecuta en Hadoop, que es un marco de trabajo orientado al procesamiento
por lotes para ejecutar trabajos de MapReduce. Cuando emite una instruccin de HiveQL, Hive determina
si puede devolver los resultados de forma inmediata o si se debe enviar un trabajo de MapReduce.

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:

SELECT state_alpha, count(*)


FROM ddb_features
WHERE feature_class = 'Summit'
GROUP BY state_alpha;

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:

API Version 2012-08-10


737
Amazon DynamoDB Developer Guide
Consulta de datos en DynamoDB

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)

Monitorizacin y cancelacin de trabajos


Cuando Hive lanza un trabajo de Hadoop, imprime el resultado de ese trabajo. El estado de realizacin
del trabajo se actualiza a medida que este progresa. En algunos casos, el estado podra tardar mucho en
actualizarse. Esto puede suceder cuando se consulta una tabla de DynamoDB de gran tamao con un
ajuste bajo de capacidad de lectura provisionada.

Si necesita cancelar el trabajo antes de que finalice, puede pulsar las teclas Ctrl+C en cualquier
momento.

Consulta de datos en DynamoDB


En los siguientes ejemplos se muestran algunas formas de usar HiveQL para consultar los datos
almacenados en DynamoDB.

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)

Uso de funciones de agregacin


HiveQL proporciona funciones integradas para sintetizar los valores de los datos. Por ejemplo, puede
utilizar la funcin MAX para hallar el valor mximo de una columna seleccionada. En el siguiente ejemplo se
devuelve la altitud del accidente geogrfico ms alto del estado de Colorado.

API Version 2012-08-10


738
Amazon DynamoDB Developer Guide
Consulta de datos en DynamoDB

SELECT MAX(elev_in_ft)
FROM ddb_features
WHERE state_alpha = 'CO';

Uso de las clusulas GROUP BY y HAVING


Puede utilizar la clusula GROUP BY para recopilar datos a travs de varios registros. Esto se utiliza a
menudo con una funcin de agregacin, como SUM, COUNT, MIN o MAX. Tambin puede usar la clusula
HAVING para descartar todos los resultados que no cumplan determinados criterios.

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.

SELECT state_alpha, max(elev_in_ft)


FROM ddb_features
GROUP BY state_alpha
HAVING count(*) >= 5;

Unin de dos tablas de DynamoDB


En el siguiente ejemplo se mapea otra tabla de Hive (east_coast_states) a una tabla de DynamoDB. La
instruccin SELECT es una unin de estas dos tablas. La unin se calcula en el clster y se devuelve. La
unin no tiene lugar en DynamoDB.

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:

CREATE EXTERNAL TABLE ddb_east_coast_states (state_name STRING, state_alpha STRING)


STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "EastCoastStates",
"dynamodb.column.mapping" = "state_name:StateName,state_alpha:StateAbbrev");

La unin siguiente devuelve los estados de la costa oriental de Estados Unidos que tienen al menos tres
accidentes geogrficos:

API Version 2012-08-10


739
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

SELECT ecs.state_name, f.feature_class, COUNT(*)


FROM ddb_east_coast_states ecs
JOIN ddb_features f on ecs.state_alpha = f.state_alpha
GROUP BY ecs.state_name, f.feature_class
HAVING COUNT(*) >= 3;

Unin de tablas de orgenes diferentes


En el siguiente ejemplo, s3_east_coast_states es una tabla de Hive asociada a un archivo CSV
almacenado en Amazon S3. La tabla ddb_features est asociada con datos de DynamoDB. En el ejemplo
siguiente se unen estas dos tablas y se devuelven los accidentes geogrficos de los estados cuyos
nombres comienzan por "New".

create external table s3_east_coast_states (state_name STRING, state_alpha STRING)


ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://bucketname/path/subpath/';

SELECT ecs.state_name, f.feature_name, f.feature_class


FROM s3_east_coast_states ecs
JOIN ddb_features f
ON ecs.state_alpha = f.state_alpha
WHERE ecs.state_name LIKE 'New%';

Copia de datos en y desde Amazon DynamoDB


En el Tutorial: Uso de Amazon DynamoDB y Apache Hive (p. 728), hemos copiado datos de una tabla
de Hive nativa en una tabla de DynamoDB externa y, a continuacin, hemos consultado la tabla de
DynamoDB externa. La tabla es externa porque existe fuera de Hive. Aunque se elimine la tabla de Hive
que est mapeada a ella, la tabla de DynamoDB no se ver afectada.

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)

Copia de datos entre DynamoDB y una tabla de Hive nativa


Si tiene datos en una tabla de DynamoDB, puede copiarlos en una tabla de Hive nativa. Al hacerlo,
obtendr una instantnea de los datos en el momento de la copia.

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

API Version 2012-08-10


740
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

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).

Example Desde una tabla de Hive nativa a DynamoDB


Puede crear una tabla de Hive nativa y rellenarla con datos de ddb_features, as:

CREATE TABLE features_snapshot AS


SELECT * FROM ddb_features;

A continuacin, puede actualizar los datos en cualquier momento:

INSERT OVERWRITE TABLE features_snapshot


SELECT * FROM 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:

CREATE TABLE lakes_and_summits AS


SELECT feature_name, feature_class, state_alpha
FROM ddb_features
WHERE feature_class IN ('Lake','Summit');

Example Desde DynamoDB a una tabla de Hive nativa


La instruccin de HiveQL siguiente permite copiar los datos de la tabla de Hive nativa a ddb_features:

INSERT OVERWRITE TABLE ddb_features


SELECT * FROM features_snapshot;

Copia de datos entre DynamoDB y Amazon S3


Si tiene datos en una tabla de DynamoDB, puede usar Hive para copiarlos en un bucket de Amazon S3.

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:

API Version 2012-08-10


741
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

1. Abra la consola de Amazon EMR en https://console.aws.amazon.com/elasticmapreduce/.


2. En Name, elija el clster.
3. La URI aparece en Log URI bajo Configuration Details.
4. Anote la ruta raz del bucket. La convencin de nomenclatura es:

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)

Copia de datos mediante el formato predeterminado de Hive


Example De DynamoDB a Amazon S3

Use una instruccin INSERT OVERWRITE para escribir directamente en Amazon S3.

INSERT OVERWRITE DIRECTORY 's3://aws-logs-123456789012-us-west-2/hive-test'


SELECT * FROM ddb_features;

El archivo de datos de Amazon S3 tiene este aspecto:

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135


1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260
253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133
264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900
115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

Cada campo se separa por un carcter SOH (inicio del encabezado, 0x01). En el archivo, SOH aparece
como ^A.

Example De Amazon S3 a DynamoDB

1. Cree una tabla externa que apunte a los datos sin formato de Amazon S3.

CREATE EXTERNAL TABLE s3_features_unformatted

API Version 2012-08-10


742
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

(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';

2. Copie los datos en DynamoDB.

INSERT OVERWRITE TABLE ddb_features


SELECT * FROM s3_features_unformatted;

Copia de datos con un formato especificado por el usuario


Si desea especificar su propio carcter separador de campos, puede crear una tabla externa que est
mapeada al bucket de Amazon S3. Puede utilizar esta tcnica para crear archivos de datos con valores
separados por comas (CSV).

Example De DynamoDB a Amazon S3

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.

CREATE EXTERNAL TABLE s3_features_csv


(feature_id BIGINT,
feature_name STRING,
feature_class STRING,
state_alpha STRING,
prim_lat_dec DOUBLE,
prim_long_dec DOUBLE,
elev_in_ft BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';

2. Copie los datos desde DynamoDB.

INSERT OVERWRITE TABLE s3_features_csv


SELECT * FROM ddb_features;

El archivo de datos de Amazon S3 tiene este aspecto:

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135


1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260
253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133
264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900
115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0

API Version 2012-08-10


743
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

Example De Amazon S3 a DynamoDB

Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de Amazon
S3:

INSERT OVERWRITE TABLE ddb_features


SELECT * FROM s3_features_csv;

Copia de datos sin mapeo de columnas


Puede copiar datos de DynamoDB en formato sin procesar y escribirlos en Amazon S3 sin especificar
ningn tipo de datos ni mapeo de columnas. Puede utilizar este mtodo para crear un archivo comprimido
de los datos de DynamoDB y almacenarlos en Amazon S3.
Note

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.

Example De DynamoDB a Amazon S3

1. Cree una tabla externa asociada con la tabla de DynamoDB. Esta instruccin de HiveQL no contiene
ningn mapeo dynamodb.column.mapping.

CREATE EXTERNAL TABLE ddb_features_no_mapping


(item MAP<STRING, STRING>)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Features");

2. Cree otra tabla externa asociada con el bucket de Amazon S3.

CREATE EXTERNAL TABLE s3_features_no_mapping


(item MAP<STRING, STRING>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';

3. Copie los datos de DynamoDB a Amazon S3.

INSERT OVERWRITE TABLE s3_features_no_mapping


SELECT * FROM ddb_features_no_mapping;

El archivo de datos de Amazon S3 tiene este aspecto:

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"}

API Version 2012-08-10


744
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

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.

Example De Amazon S3 a DynamoDB

Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de Amazon
S3:

INSERT OVERWRITE TABLE ddb_features_no_mapping


SELECT * FROM s3_features_no_mapping;

Visualizacin de datos en Amazon S3


Si usa SSH para conectarse al nodo maestro, puede usar la AWS Command Line Interface (AWS CLI)
para obtener acceso a los datos que Hive escribi en 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/

El aspecto de la respuesta debe ser parecido al siguiente:

2016-11-01 23:19:54 81983 000000_0

El nombre de archivo (000000_0) lo genera el sistema.


3. (Opcional) Puede copiar el archivo de datos de Amazon S3 al sistema de archivos local en el nodo
maestro. Despus de hacerlo, puede utilizar las utilidades estndar de la lnea de comandos de Linux
para trabajar con los datos del archivo.

aws s3 cp s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 .

El aspecto de la respuesta debe ser parecido al siguiente:

download: s3://aws-logs-123456789012-us-west-2/hive-test/000000_0
to ./000000_0

API Version 2012-08-10


745
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

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.

Copia de datos entre DynamoDB y HDFS


Si tiene datos en una tabla de DynamoDB, puede usar Hive para copiarlos a Hadoop Distributed File
System (HDFS).

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)

Copia de datos mediante el formato predeterminado de Hive


Example De DynamoDB a HDFS
Use una instruccin INSERT OVERWRITE para escribir directamente en HDFS.

INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test'


SELECT * FROM ddb_features;

El archivo de datos de HDFS tiene este aspecto:

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135


1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260
253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133
264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900
115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

Cada campo se separa por un carcter SOH (inicio del encabezado, 0x01). En el archivo, SOH aparece
como ^A.

Example De HDFS a DynamoDB

1. Cree una tabla externa mapeada a los datos sin formato de HDFS.

API Version 2012-08-10


746
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

CREATE EXTERNAL TABLE hdfs_features_unformatted


(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 'hdfs:///user/hadoop/hive-test';

2. Copie los datos en DynamoDB.

INSERT OVERWRITE TABLE ddb_features


SELECT * FROM hdfs_features_unformatted;

Copia de datos con un formato especificado por el usuario


Si desea usar un carcter separador de campos distinto, puede crear una tabla externa que est mapeada
al directorio de HDFS. Puede utilizar esta tcnica para crear archivos de datos con valores separados por
comas (CSV).

Example De DynamoDB a 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.

CREATE EXTERNAL TABLE hdfs_features_csv


(feature_id BIGINT,
feature_name STRING ,
feature_class STRING ,
state_alpha STRING,
prim_lat_dec DOUBLE ,
prim_long_dec DOUBLE ,
elev_in_ft BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION 'hdfs:///user/hadoop/hive-test';

2. Copie los datos desde DynamoDB.

INSERT OVERWRITE TABLE hdfs_features_csv


SELECT * FROM ddb_features;

El archivo de datos de HDFS tiene este aspecto:

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135


1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260
253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133

API Version 2012-08-10


747
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900
115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0

Example De HDFS a DynamoDB

Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de HDFS:

INSERT OVERWRITE TABLE ddb_features


SELECT * FROM hdfs_features_csv;

Copia de datos sin mapeo de columnas


Puede copiar datos de DynamoDB en formato sin procesar y escribirlos en HDFS sin especificar ningn
tipo de datos ni mapeo de columnas. Puede utilizar este mtodo para crear un archivo comprimido de los
datos de DynamoDB y almacenarlos en HDFS.
Note

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.

Example De DynamoDB a HDFS

1. Cree una tabla externa asociada con la tabla de DynamoDB. Esta instruccin de HiveQL no contiene
ningn mapeo dynamodb.column.mapping.

CREATE EXTERNAL TABLE ddb_features_no_mapping


(item MAP<STRING, STRING>)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Features");

2. Cree otra tabla externa asociada con el directorio de HDFS.

CREATE EXTERNAL TABLE hdfs_features_no_mapping


(item MAP<STRING, STRING>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 'hdfs:///user/hadoop/hive-test';

3. Copie los datos de DynamoDB a HDFS.

INSERT OVERWRITE TABLE hdfs_features_no_mapping


SELECT * FROM ddb_features_no_mapping;

El archivo de datos de HDFS tiene este aspecto:

API Version 2012-08-10


748
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

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.

Example De HDFS a DynamoDB

Con una sola instruccin de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de HDFS:

INSERT OVERWRITE TABLE ddb_features_no_mapping


SELECT * FROM hdfs_features_no_mapping;

Acceso a los datos de HDFS


HDFS es un sistema de archivos distribuido, accesible para todos los nodos del clster de Amazon EMR.
Si usa SSH para conectarse al nodo maestro, puede usar las herramientas de lnea de comandos para
obtener acceso a los datos que Hive escribi en 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.

hadoop fs -ls /user/hadoop/hive-test

El aspecto de la respuesta debe ser parecido al siguiente:

Found 1 items
-rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0

El nombre de archivo (000000_0) lo genera el sistema.


3. Visualice el contenido del archivo :

API Version 2012-08-10


749
Amazon DynamoDB Developer Guide
Copia de datos en y desde Amazon DynamoDB

hadoop fs -cat /user/hadoop/hive-test/000000_0

Note

En este ejemplo, el archivo es relativamente pequeo (aproximadamente, 29KB). Tenga


cuidado cuando utilice este comando con archivos que sean muy grandes o contengan
caracteres no imprimibles.
4. (Opcional) Puede copiar el archivo de datos de HDFS al sistema de archivos local en el nodo maestro.
Despus de hacerlo, puede utilizar las utilidades estndar de la lnea de comandos de Linux para
trabajar con los datos del archivo.

hadoop fs -get /user/hadoop/hive-test/000000_0

Este comando no sobrescribir el archivo.


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.

Uso de la compresin de datos


Cuando utilice Hive para copiar datos entre orgenes de datos diferentes, puede solicitar la compresin de
datos sobre la marcha. Hive proporciona varios cdecs de compresin. Puede elegir uno de ellos durante
la sesin de Hive. Si lo hace, los datos se comprimirn en el formato especificado.

El siguiente ejemplo comprime los datos utilizando el algoritmo Lempel-Ziv-Oberhumer (LZO).

SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK;
SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec;

CREATE EXTERNAL TABLE lzo_compression_table (line STRING)


ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
LOCATION 's3://bucketname/path/subpath/';

INSERT OVERWRITE TABLE lzo_compression_table SELECT *


FROM hiveTableName;

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).

Los cdecs de compresin disponibles son:

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

API Version 2012-08-10


750
Amazon DynamoDB Developer Guide
Ajuste del desempeo

Lectura de datos de caracteres UTF-8 no imprimibles


Para leer y escribir datos de caracteres UTF-8 no imprimibles, puede usar la clusula STORED AS
SEQUENCEFILE al crear una tabla de Hive. Un SequenceFile es un formato de archivo binario de Hadoop.
Debe usar Hadoop para leer este archivo. En el siguiente ejemplo se muestra cmo exportar datos desde
DynamoDB a Amazon S3. Puede utilizar esta funcionalidad para controlar caracteres codificados con
UTF-8 no imprimibles.

CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>)


STORED AS SEQUENCEFILE
LOCATION 's3://bucketname/path/subpath/';

INSERT OVERWRITE TABLE s3_export SELECT *


FROM hiveTableName;

Ajuste del desempeo


Al crear una tabla Hive externa mapeada a una tabla de DynamoDB, no se consume ninguna capacidad de
lectura o escritura de DynamoDB. Sin embargo, la actividad de lectura y escritura en la tabla de Hive (por
ejemplo, INSERT o SELECT) se convierte directamente en operaciones de lectura y escritura en la tabla de
DynamoDB subyacente.

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)

Desempeo provisionado de DynamoDB


Cuando se emiten instrucciones de HiveQL para la tabla de DynamoDB externa, la clase
DynamoDBStorageHandler realiza las solicitudes apropiadas de API de bajo nivel de DynamoDB, que
consumen desempeo provisionado. Si no hay suficiente capacidad de lectura o escritura en la tabla de
DynamoDB, se aplica una limitacin controlada a la solicitud, lo que da lugar a un desempeo lento de
HiveQL. Por este motivo, debe asegurarse de que la tabla tenga suficiente capacidad de desempeo.

API Version 2012-08-10


751
Amazon DynamoDB Developer Guide
Ajuste del desempeo

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:

21474836480 / 409600 = 52429segundos = 14,56horas

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.

Es conveniente monitorizar peridicamente las mtricas de CloudWatch correspondientes a la tabla. Para


obtener un resumen breve en la consola de DynamoDB, elija la tabla y, a continuacin, seleccione la
pestaa Metrics. A partir de aqu, puede ver las unidades de capacidad de lectura y escritura consumidas y
las solicitudes de lectura y escritura que han sido objeto de una limitacin controlada.

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.

El valor de dynamodb.throughput.read.percent puede estar comprendido entre 0.1 y 1.5, ambos


incluidos. 0.5 representa la tasa de lectura predeterminada, lo que significa que Hive intentar consumir
la mitad de la capacidad de lectura de la tabla. Si aumenta el valor por encima de 0.5, Hive aumentar la
tasa de solicitudes; al reducir el valor por debajo de 0.5, disminuir la tasa de solicitudes de lectura. La
tasa de lectura real vara, segn diversos factores tales como el hecho de que exista o no una distribucin
uniforme de claves en la tabla de DynamoDB.

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

API Version 2012-08-10


752
Amazon DynamoDB Developer Guide
Ajuste del desempeo

de mensajes de ProvisionedThroughputExceeded en el resultado del trabajo, puede ajustar


la tasa de escritura predeterminada. Para ello, puede modificar la variable de configuracin
dynamodb.throughput.write.percent. Puede usar el comando SET para establecer esta variable en
el smbolo del sistema de Hive:

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.

El valor de dynamodb.throughput.write.percent puede estar comprendido entre 0.1 y 1.5, ambos


incluidos. 0.5 representa la tasa de escritura predeterminada, lo que significa que Hive intentar consumir
la mitad de la capacidad de escritura de la tabla. Si aumenta el valor por encima de 0.5, Hive aumentar
la tasa de solicitudes; al reducir el valor por debajo de 0.5, disminuir la tasa de solicitudes de escritura.
La tasa de escritura real vara en funcin de diversos factores, tales como el hecho de que exista o no una
distribucin uniforme de claves en la tabla de DynamoDB.

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).

Ajuste de los mapeadores


Cuando Hive lanza un trabajo de Hadoop, lo procesan una o varias tareas de mapeador. Suponiendo
que la tabla de DynamoDB tenga suficiente capacidad de desempeo, puede modificar el nmero de
mapeadores del clster, lo que podra mejorar el desempeo.
Note

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.

Aumento del nmero de mapeadores


Cada mapeador de un Amazon EMR tiene una tasa de lectura mxima de 1MiB por segundo. El nmero
de mapeadores del clster depende del tamao de los nodos que este contiene. Para obtener informacin
sobre los tamaos de los nodos y el nmero de mapeadores por nodo, consulte Task Configuration en la
Amazon EMR Developer Guide.

API Version 2012-08-10


753
Amazon DynamoDB Developer Guide
Ajuste del desempeo

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.

Otra forma de aumentar el nmero de mapeadores consiste en modificar el parmetro de configuracin


mapred.tasktracker.map.tasks.maximum de Hadoop. Se trata de un parmetro de Hadoop, no
de Hive. No puede modificarlo de forma interactiva desde el smbolo del sistema. Si aumenta el valor
de mapred.tasktracker.map.tasks.maximum, puede incrementar el nmero de mapeadores sin
aumentar el nmero ni el tamao de los nodos. Sin embargo, es posible que los nodos del clster se
queden sin memoria si establece un valor demasiado elevado.

El valor de mapred.tasktracker.map.tasks.maximum se establece como accin de arranque la


primera vez que se lanza el clster de Amazon EMR. Para obtener ms informacin, consulte (Optional)
Create Bootstrap Actions to Install Additional Software en la Amazon EMR Management Guide.

Reduccin del nmero de mapeadores


Si utiliza la instruccin SELECT para seleccionar datos de una tabla de Hive externa mapeada a
DynamoDB, el trabajo de Hadoop puede utilizar tantas tareas como sea necesario, hasta el nmero
mximo de mapeadores del clster. En esta situacin, es posible que una consulta de Hive que tarde
bastante en ejecutarse consuma toda la capacidad de lectura provisionada de la tabla de DynamoDB, lo
que afectara negativamente a otros usuarios.

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.

Duracin del intervalo de reintento


De forma predeterminada, Hive vuelve a ejecutar un trabajo de Hadoop si este no devuelve resultados
de DynamoDB en un plazo de dos minutos. Puede ajustar este intervalo modificando el parmetro
dynamodb.retry.duration:

SET dynamodb.retry.duration=2;

API Version 2012-08-10


754
Amazon DynamoDB Developer Guide
Integracin con AWS Data Pipeline

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).

Solicitudes de datos paralelas


Varias solicitudes de datos a una nica tabla, ya sean de ms de un usuario o de ms de una aplicacin,
podran agotar el desempeo de lectura provisionado y ralentizar el desempeo.

Duracin del proceso


La consistencia de datos en DynamoDB depende del orden de las operaciones de lectura y escritura en
cada nodo. Aunque haya una consulta de Hive en curso, otra aplicacin podra cargar nuevos datos en la
tabla de DynamoDB o modificar o eliminar datos existentes. En este caso, los resultados de la consulta de
Hive podran no reflejar los cambios realizados en los datos mientras se ejecutaba la consulta.

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.

Exportacin e importacin de datos de DynamoDB


mediante AWS Data Pipeline
Puede utilizar AWS Data Pipeline para exportar datos de una tabla de DynamoDB a un archivo de un
bucket de Amazon S3. Tambin puede utilizar la consola para importar datos de Amazon S3 a una tabla de
DynamoDB, ya sea de la misma regin de AWS o de otra.

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.

En el siguiente diagrama se muestra informacin general sobre la exportacin e importacin de datos de


DynamoDB con AWS Data Pipeline.

API Version 2012-08-10


755
Amazon DynamoDB Developer Guide
Integracin con AWS Data Pipeline

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:

AWS Data Pipeline: administra automticamente el flujo de trabajo de importacin/exportacin.


Amazon S3: contiene los datos que se exportan desde DynamoDB o se importan a DynamoDB.

API Version 2012-08-10


756
Amazon DynamoDB Developer Guide
Requisitos previos para exportar e importar datos

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.

Requisitos previos para exportar e importar datos


Cuando se utiliza AWS Data Pipeline para importar y exportar datos, se deben especificar las acciones que
la canalizacin podr realizar y los recursos que podr consumir. Las acciones y los recursos permitidos se
definen mediante roles de AWS Identity and Access Management (IAM).

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.

Creacin de roles de IAM para AWS Data Pipeline


Para poder utilizar AWS Data Pipeline, los roles de IAM siguientes deben estar presentes en su cuenta de
AWS:

DataPipelineDefaultRole: las acciones que la canalizacin puede llevar a cabo automticamente.


DataPipelineDefaultResourceRole: los recursos de AWS que la canalizacin provisionar
automticamente. Para importar y exportar datos de DynamoDB, estos recursos incluyen un clster de
Amazon EMR y las instancias Amazon EC2 asociadas a l.

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).

1. Inicie sesin en la Consola de administracin de AWS y abra la consola de IAM en https://


console.aws.amazon.com/iam/.
2. En el panel de la consola de IAM, haga clic en Roles.
3. Haga clic en Create New Role y realice las siguientes operaciones:

a. En el campo Role Name, escriba DataPipelineDefaultRole y despus haga clic en Next


Step.
b. En el panel Select Role Type, en la lista de AWS Service Roles, vaya a AWS Data Pipeline y haga
clic en Select.
c. En el panel Attach Policy, haga clic en la casilla situada junto a la poltica AWSDataPipelineRole y
despus haga clic en Next Step.

API Version 2012-08-10


757
Amazon DynamoDB Developer Guide
Requisitos previos para exportar e importar datos

d. En el panel Review, haga clic en Create Role.


4. Haga clic en Create New Role y realice las siguientes operaciones:

a. En el campo Role Name, escriba DataPipelineDefaultResourceRole y despus haga clic


en Next Step.
b. En el panel Select Role Type, en la lista de AWS Service Roles, vaya a Amazon EC2 Role for
Data Pipeline y haga clic en Select.
c. En el panel Attach Policy, haga clic en la casilla situada junto a la poltica
AmazonEC2RoleforDataPipelineRole y despus haga clic en Next Step.
d. En el panel Review, haga clic en Create Role.

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).

Concesin de permisos a los usuarios y grupos de IAM para


realizar tareas de exportacin e importacin
Si desea permitir que otros usuarios o grupos de IAM importen y exporten los datos de sus tablas de
DynamoDB, puede crear una poltica de IAM y adjuntrsela a los usuarios o grupos que designe. La
poltica contiene nicamente los permisos necesarios para realizar estas tareas.

Concesin de acceso pleno mediante una poltica administrada de AWS


En el siguiente procedimiento se describe cmo adjuntar la poltica administrada de AWS
AmazonDynamoDBFullAccesswithDataPipeline a un usuario de IAM. Esta poltica administrada
proporciona acceso pleno a AWS Data Pipeline y a los recursos de DynamoDB.

1. Inicie sesin en la Consola de administracin de AWS y abra la consola de IAM en https://


console.aws.amazon.com/iam/.
2. En el panel de la consola de IAM, haga clic en Users y seleccione el usuario que desee modificar.
3. En la pestaa Permissions, haga clic en Attach Policy.
4. En el panel Attach Policy, seleccione AmazonDynamoDBFullAccesswithDataPipeline y haga clic
en Attach Policy.

Note

Puede utilizar un procedimiento similar para adjuntar esta poltica administrada a un grupo, en
lugar de a un usuario.

Restriccin del acceso a determinadas tablas de DynamoDB


Si desea restringir el acceso de forma que un usuario solo pueda exportar o importar un subconjunto
de las tablas, tendr que crear un documento de poltica de IAM personalizado. Puede usar la poltica
administrada de AWS AmazonDynamoDBFullAccesswithDataPipeline como punto de partida para
la poltica personalizada y modificarla para permitir que un usuario solamente pueda trabajar con las tablas
que especifique.

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.

1. Inicie sesin en la Consola de administracin de AWS y abra la consola de IAM en https://


console.aws.amazon.com/iam/.

API Version 2012-08-10


758
Amazon DynamoDB Developer Guide
Requisitos previos para exportar e importar datos

2. En el panel de la consola de IAM, haga clic en Policies y despus en Create Policy.


3. En el panel Create Policy, vaya a Copy an AWS Managed Policy y haga clic en Select.
4. En el panel Copy an AWS Managed Policy, vaya a
AmazonDynamoDBFullAccesswithDataPipeline y haga clic en Select.
5. En el panel Review Policy haga lo siguiente:

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"
},

...remainder of document omitted...

Para restringir la poltica, primero debe eliminar la siguiente lnea:

"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"
]

API Version 2012-08-10


759
Amazon DynamoDB Developer Guide
Requisitos previos para exportar e importar datos

},

Note

Sustituya us-west-2 por la regin en la que residen sus tablas de DynamoDB.


Sustituya 123456789012 por el nmero de su cuenta de AWS.

Por ltimo, agregue la nueva instruccin Action al documento de poltica:

{
"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"
},

...remainder of document omitted...

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

Puede utilizar un procedimiento similar para adjuntar su poltica a un grupo, en lugar de a un


usuario.

API Version 2012-08-10


760
Amazon DynamoDB Developer Guide
Exportacin de datos de DynamoDB a Amazon S3

Exportacin de datos de DynamoDB a Amazon S3


En esta seccin se describe cmo exportar los datos de una o varias tablas de DynamoDB a un bucket de
Amazon S3. Debe crear previamente el bucket de Amazon S3 para poder realizar la exportacin.
Important

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.

De lo contrario, si ya dispone de al menos una canalizacin, elija Create new pipeline.


3. En la pgina Create Pipeline, proceda del modo siguiente:

a. En el campo Name, escriba el nombre de la canalizacin. Por ejemplo:


MyDynamoDBExportPipeline.
b. Para el parmetro Source, seleccione Build using a template. En la lista desplegable de plantillas,
seleccione Export DynamoDB table to S3.
c. En el campo Source DynamoDB table name, escriba el nombre de la tabla de DynamoDB que
desee exportar.
d. En el cuadro de texto Output S3 Folder, escriba el URI de Amazon S3 en el que se escribir el
archivo de la exportacin. Por ejemplo: s3://mybucket/exports

El formato de este URI es s3://bucketname/folder, donde:

bucketname es el nombre del bucket de Amazon S3.


folder es el nombre de una carpeta de ese bucket. Si la carpeta no existe, se crear
automticamente. Si no especifica el nombre de la carpeta, se le asignar un nombre con este
formato: s3://bucketname/region/tablename.
e. En el cuadro de texto S3 location for logs, escriba el URI de Amazon S3 en el que se escribir el
archivo log de la exportacin. Por ejemplo: s3://mybucket/logs/

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.

Importacin de datos de Amazon S3 a DynamoDB


En esta seccin se da por hecho que ya ha exportado datos de una tabla de DynamoDB y que el archivo
de exportacin se ha escrito en el bucket de Amazon S3. El formato interno de este archivo se describe en
Verify the Data Export File en la Gua para desarrolladores de AWS Data Pipeline. Tenga en cuenta que
este es el nico formato de archivo que DynamoDB puede importar mediante AWS Data Pipeline.

API Version 2012-08-10


761
Amazon DynamoDB Developer Guide
Importacin de datos de Amazon S3 a DynamoDB

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 ya exista, porque el proceso de importacin no crear la tabla.


La tabla de destino tenga el mismo esquema de claves que la tabla de origen.

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:

a. En el campo Name, escriba el nombre de la canalizacin. Por ejemplo:


MyDynamoDBImportPipeline.
b. Para el parmetro Source, seleccione Build using a template. En la lista desplegable de plantillas,
seleccione Import DynamoDB backup data from S3.
c. En el cuadro de texto Input S3 Folder, escriba el URI de Amazon S3 en el que se pueda encontrar
el archivo de la exportacin. Por ejemplo: s3://mybucket/exports

El formato de este URI es s3://bucketname/folder, donde:

bucketname es el nombre del bucket de Amazon S3.


folder es el nombre de la carpeta que contiene el archivo de exportacin.

El trabajo de importacin esperar encontrar un archivo en la ubicacin de Amazon S3


especificada. El formato interno de este archivo se describe en Verify the Data Export File en la
Gua para desarrolladores de AWS Data Pipeline.
d. En el campo Target DynamoDB table name, escriba el nombre de la tabla de DynamoDB en la
que desee importar los datos.
e. En el cuadro de texto S3 location for logs, escriba el URI de Amazon S3 en el que se escribir el
archivo log de la importacin. Por ejemplo: s3://mybucket/logs/

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.

API Version 2012-08-10


762
Amazon DynamoDB Developer Guide
Solucin de problemas

5. Cuando est conforme con la configuracin, haga clic en Activate.

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.

Plantillas predefinidas para AWS Data Pipeline y


DynamoDB
Si desea comprender mejor el funcionamiento de AWS Data Pipeline, recomendamos consultar la
Gua para desarrolladores de AWS Data Pipeline. Esta gua contiene tutoriales paso a paso para crear
canalizaciones y trabajar con ellas. Puede utilizar estos tutoriales como punto de partida para crear sus
propias canalizaciones. Recomendamos leer el tutorial de DynamoDB, que recorre uno a uno los pasos
necesarios para crear una canalizacin de exportacin e importacin que puede personalizar de acuerdo
con sus requisitos. Consulte Tutorial: Amazon DynamoDB Import and Export Using AWS Data Pipeline en
la Gua para desarrolladores de AWS Data Pipeline.

API Version 2012-08-10


763
Amazon DynamoDB Developer Guide
Plantillas predefinidas para AWS Data Pipeline y DynamoDB

AWS Data Pipeline ofrece varias plantillas para crear canalizaciones; las siguientes son pertinentes para
DynamoDB.

Exportacin de datos entre DynamoDB y Amazon S3


La consola de AWS Data Pipeline ofrece dos plantillas predefinidas para exportar datos entre DynamoDB
y Amazon S3. Para obtener ms informacin sobre estas plantillas, consulte las secciones siguientes de la
Gua para desarrolladores de AWS Data Pipeline:

Export DynamoDB to Amazon S3


Export Amazon S3 to DynamoDB

API Version 2012-08-10


764
Amazon DynamoDB Developer Guide
Unidades de capacidad y desempeo provisionado

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)

Unidades de capacidad y desempeo provisionado


Tamaos de unidades de capacidad
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 elementos con un tamao de hasta 4 KB.

Una unidad de capacidad de escritura equivale a una escritura por segundo para los elementos con un
tamao de hasta 1 KB.

Descripcin de los lmites de desempeo


aprovisionados predeterminados
Para cualquier tabla o ndices secundario global, los ajustes mnimos de desempeo provisionado son de
una unidad de capacidad de lectura y una unidad de capacidad de escritura.

API Version 2012-08-10


765
Amazon DynamoDB Developer Guide
Aumento de desempeo provisionado

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.

Regin US East (N. Virginia):


Por tabla: 40000unidades de capacidad de lectura y 40000unidades de capacidad de escritura
Por cuenta: 80000unidades de capacidad de lectura y 80000unidades de capacidad de escritura
Todas las dems regiones:
Por tabla: 10000unidades de capacidad de lectura y 10000unidades de capacidad de escritura
Por cuenta: 20000unidades de capacidad de lectura y 20000unidades de capacidad de escritura
Note

Todo el desempeo disponible para la cuenta se puede aplicar a una sola tabla o a varias
tablas.

El lmite de desempeo provisionado incluye la suma de la capacidad de la tabla y de la capacidad de


todos sus ndices secundarios globales.

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.

Aumento de desempeo provisionado


Puede aumentar el valor de ReadCapacityUnits o WriteCapacityUnits con tanta frecuencia como
sea preciso; para ello, puede usar la Consola de administracin de AWS o la operacin UpdateTable.
En una sola llamada, puede aumentar el desempeo provisionado de una tabla, de cualquier ndices
secundario global de esa tabla o de cualquier combinacin de ellos. El nuevo ajuste no surtir efecto hasta
que se haya completado la operacin UpdateTable.

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).

Reduccin de desempeo provisionado


Para cada tabla y ndices secundario global de una operacin UpdateTable, puede reducir el valor de
ReadCapacityUnits, de WriteCapacityUnits o de ambas opciones. El nuevo ajuste no surtir efecto
hasta que se haya completado la operacin UpdateTable. Se permite reducir la capacidad 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).
Important

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:

Reducir los valores WriteCapacityUnits o ReadCapacityUnits (o ambos) de la tabla cuatro veces.


Reducir los valores WriteCapacityUnits o ReadCapacityUnits (o ambos) del ndice secundario global
cuatro veces.

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.

Tablas por cuenta


Para cualquier cuenta de AWS, existe un lmite inicial de 256tablas por regin.

Para solicitar un aumento del lmite de servicio, consulte https://aws.amazon.com/support.

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.

Atributos de ndice secundario proyectados por tabla


Puede proyectar un mximo de 20atributos en todos los ndices secundarios locales y globales de una
tabla. Esto solo se aplica a los atributos proyectados especificados por el usuario.

En una operacin CreateTable, si especifica INCLUDE como valor de ProjectionType, el recuento


total de atributos especificados en NonKeyAttributes y sumados para todos los ndices secundarios no
deber superar el valor de 20. Si se proyecta el mismo nombre de atributo en dos ndices diferentes, esto
cuenta como dos atributos distintos a la hora de determinar la cantidad total.

Este lmite no se aplica a los ndices secundarios cuyo valor de ProjectionType sea KEYS_ONLY o ALL.

Claves de particin y claves de ordenacin


Longitud de la clave de particin
La longitud mnima de un valor de clave de particin es de 1byte. La longitud mxima es de 2048 bytes.

API Version 2012-08-10


767
Amazon DynamoDB Developer Guide
Valores de clave de particin

Valores de clave de particin


No existe ningn lmite prctico respecto al nmero de valores diferentes de clave de particin, ni para
tablas ni para los ndices secundarios.

Longitud de la clave de ordenacin


La longitud mnima de un valor de clave de ordenacin es de 1byte. La longitud mxima es de 1024 bytes.

Valores de clave de ordenacin


En general, no existe ningn lmite prctico respecto al nmero de valores diferentes de clave de
ordenacin por cada valor de clave de particin.

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)

Nombres de los atributos


En general, un nombre de atributo debe tener 1carcter como mnimo y su tamao mximo no debe
superar los 64KB.

Las excepciones se enumeran a continuacin. Los siguientes nombres de atributo no puede tener ms de
255caracteres:

Los nombres de las claves de particin de un Secondary index.


Los nombres de las claves de ordenacin de un Secondary index.
Los nombres de los atributos proyectados especificados por el usuario (aplicables solo a los
ndices secundarios locales). En una operacin CreateTable, si especifica el valor INCLUDE para
ProjectionType, los nombres de los atributos del parmetro NonKeyAttributes estarn sujetos a
restricciones de longitud. Los tipos de proyecciones KEYS_ONLY y ALL no se ven afectados.

API Version 2012-08-10


768
Amazon DynamoDB Developer Guide
Tipos de datos

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.

Rango de valores positivos: de 1E-130 a 9.9999999999999999999999999999999999999E+125


Rango de valores negativos: de -9.9999999999999999999999999999999999999E+125 a -1E-130

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.

Tamao de los elementos en las tablas con ndices


secundarios locales
Para cada local secondary index de una tabla, existe un lmite de 400 KB que se aplica al total de los
siguientes tamaos:

API Version 2012-08-10


769
Amazon DynamoDB Developer Guide
Atributos

El tamao de los datos de un elemento de la tabla.


El tamao de la entrada del local secondary index correspondiente a dicho elemento, incluidos sus
valores de clave y atributos proyectados.

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).

Nmero de valores de una lista, un mapa o un


conjunto
No existe ningn lmite respecto al nmero de valores de una lista, un mapa o un conjunto, siempre y
cuando el elemento que contenga los valores se ajuste al lmite de tamao de elemento de 400 KB.

Valores de los atributos


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.

Profundidad de los atributos anidados


DynamoDB admite atributos anidados hasta un mximo de 32 niveles de profundidad.

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 cualquier nombre de atributo de expresin individual o valor de atributo de


expresin es de 255bytes. Por ejemplo, #name tiene cinco bytes y :val, cuatro.

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 "+".

La cantidad mxima de operandos del comparador IN es de 100.

API Version 2012-08-10


770
Amazon DynamoDB Developer Guide
Palabras reservadas

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.

Capacidad de escritura mxima de una tabla con


Streams habilitado
Los siguientes lmites de capacidad de escritura son aplicables a las tablas que tienen habilitado
DynamoDB Streams:

Regin EE.UU. Este (Virginia):


Por tabla: 40000unidades de capacidad de escritura
Por cuenta: 80000unidades de capacidad de escritura
Todas las dems regiones:
Por tabla: 10000unidades de capacidad de escritura
Por cuenta: 20000unidades de capacidad de escritura

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".

DynamoDB Accelerator (DAX)


Disponibilidad en las regiones de AWS
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)

API Version 2012-08-10


771
Amazon DynamoDB Developer Guide
Nodos

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.

Dentro de un grupo de subredes, puede definir hasta 20subredes.

Lmites especficos de API


CreateTable/UpdateTable/DeleteTable

En general, puede haber hasta 10 solicitudes CreateTable, UpdateTable y DeleteTable en


ejecucin simultneamente (en cualquier combinacin). Es decir, el nmero total de tablas que se
encuentren en estado CREATING, UPDATING o DELETING no puede ser mayor que 10.

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

Una misma operacin BatchWriteItem puede contener hasta 25 solicitudes PutItem o


DeleteItem. El tamao total de todos los elementos escritos no puede ser mayor que 16 MB.

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.

API Version 2012-08-10


772
Amazon DynamoDB Developer Guide
Ejemplos de tablas y datos

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)

Ejemplos de tablas y datos


En la Gua para desarrolladores de Amazon DynamoDB se utilizan ejemplos de tablas para ilustrar
diversos aspectos de DynamoDB.

Nombre de la tabla Clave principal

ProductCatalog Clave principal simple:

Id (Nmero)

Forum Clave principal simple:

Name (Cadena)

Thread Clave principal compuesta:

ForumName (Cadena)
Subject (Cadena)

Responder Clave principal compuesta:

Id (Cadena)
ReplyDateTime (Cadena)

API Version 2012-08-10


773
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

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.

Nombre de ndice Clave principal

PostedBy-Message-Index Clave principal compuesta:

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).

Ejemplos de archivos de datos


Temas
Ejemplos de datos de ProductCatalog (p. 774)
Ejemplo de datos de Forum (p. 779)
Ejemplo de datos de Thread (p. 779)
Ejemplo de datos de Reply (p. 781)

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).

Ejemplos de datos de ProductCatalog


{
"ProductCatalog": [
{
"PutRequest": {
"Item": {
"Id": {
"N": "101"
},
"Title": {
"S": "Book 101 Title"
},
"ISBN": {
"S": "111-1111111111"
},
"Authors": {
"L": [
{
"S": "Author1"
}
]
},

API Version 2012-08-10


774
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

"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"

API Version 2012-08-10


775
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

},
"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"
}

API Version 2012-08-10


776
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

}
}
},
{
"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"
},

API Version 2012-08-10


777
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

{
"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"
},

API Version 2012-08-10


778
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

"Price": {
"N": "500"
},
"Color": {
"L": [
{
"S": "Red"
},
{
"S": "Black"
}
]
},
"ProductCategory": {
"S": "Bicycle"
}
}
}
}
]
}

Ejemplo de datos de Forum


{
"Forum": [
{
"PutRequest": {
"Item": {
"Name": {"S":"Amazon DynamoDB"},
"Category": {"S":"Amazon Web Services"},
"Threads": {"N":"2"},
"Messages": {"N":"4"},
"Views": {"N":"1000"}
}
}
},
{
"PutRequest": {
"Item": {
"Name": {"S":"Amazon S3"},
"Category": {"S":"Amazon Web Services"}
}
}
}
]
}

Ejemplo de datos de Thread


{
"Thread": [
{
"PutRequest": {
"Item": {
"ForumName": {
"S": "Amazon DynamoDB"
},
"Subject": {
"S": "DynamoDB Thread 1"
},
"Message": {

API Version 2012-08-10


779
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

"S": "DynamoDB thread 1 message"


},
"LastPostedBy": {
"S": "User A"
},
"LastPostedDateTime": {
"S": "2015-09-22T19:58:22.514Z"
},
"Views": {
"N": "0"
},
"Replies": {
"N": "0"
},
"Answered": {
"N": "0"
},
"Tags": {
"L": [
{
"S": "index"
},
{
"S": "primarykey"
},
{
"S": "table"
}
]
}
}
}
},
{
"PutRequest": {
"Item": {
"ForumName": {
"S": "Amazon DynamoDB"
},
"Subject": {
"S": "DynamoDB Thread 2"
},
"Message": {
"S": "DynamoDB thread 2 message"
},
"LastPostedBy": {
"S": "User A"
},
"LastPostedDateTime": {
"S": "2015-09-15T19:58:22.514Z"
},
"Views": {
"N": "3"
},
"Replies": {
"N": "0"
},
"Answered": {
"N": "0"
},
"Tags": {
"L": [
{
"S": "items"
},
{

API Version 2012-08-10


780
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

"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"
}
]
}
}
}
}
]
}

Ejemplo de datos de Reply


{
"Reply": [
{
"PutRequest": {
"Item": {
"Id": {
"S": "Amazon DynamoDB#DynamoDB Thread 1"
},
"ReplyDateTime": {

API Version 2012-08-10


781
Amazon DynamoDB Developer Guide
Ejemplos de archivos de datos

"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"
}
}
}
}
]

API Version 2012-08-10


782
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos

Creacin de ejemplos de tablas y carga de datos


Temas
Creacin de ejemplos de tablas y carga de datos mediante el AWS SDK para Java (p. 783)
Creacin de ejemplos de tablas y carga de datos mediante el AWS SDK para .NET (p. 790)

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.

Creacin de ejemplos de tablas y carga de datos


mediante el AWS SDK para Java
En el siguiente ejemplo de cdigo Java se crean tablas y se cargan datos en ellas. La estructura de tablas
y los datos resultantes se muestran en Creacin de tablas y carga de ejemplos de datos (p. 291). Para
obtener instrucciones paso a paso sobre cmo ejecutar este cdigo mediante Eclipse, consulte Ejemplos
de cdigo Java (p. 296).

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.


// Licensed under the Apache License, Version 2.0.
package com.amazonaws.codesamples;

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;

public class CreateTablesLoadData {

static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();


static DynamoDB dynamoDB = new DynamoDB(client);

static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-


dd'T'HH:mm:ss.SSS'Z'");

static String productCatalogTableName = "ProductCatalog";


static String forumTableName = "Forum";
static String threadTableName = "Thread";

API Version 2012-08-10


783
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: Java

static String replyTableName = "Reply";

public static void main(String[] args) throws Exception {

try {

deleteTable(productCatalogTableName);
deleteTable(forumTableName);
deleteTable(threadTableName);
deleteTable(replyTableName);

// Parameter1: table name


// Parameter2: reads per second
// Parameter3: writes per second
// Parameter4/5: partition key and data type
// Parameter6/7: sort key and data type (if applicable)

createTable(productCatalogTableName, 10L, 5L, "Id", "N");


createTable(forumTableName, 10L, 5L, "Name", "S");
createTable(threadTableName, 10L, 5L, "ForumName", "S", "Subject", "S");
createTable(replyTableName, 10L, 5L, "Id", "S", "ReplyDateTime", "S");

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.");
}

private static void deleteTable(String tableName) {


Table table = dynamoDB.getTable(tableName);
try {
System.out.println("Issuing DeleteTable request for " + tableName);
table.delete();
System.out.println("Waiting for " + tableName + " to be deleted...this may take
a while...");
table.waitForDelete();

}
catch (Exception e) {
System.err.println("DeleteTable request failed for " + tableName);
System.err.println(e.getMessage());
}
}

private static void createTable(String tableName, long readCapacityUnits, long


writeCapacityUnits,
String partitionKeyName, String partitionKeyType) {

createTable(tableName, readCapacityUnits, writeCapacityUnits, partitionKeyName,


partitionKeyType, null, null);
}

private static void createTable(String tableName, long readCapacityUnits, long


writeCapacityUnits,
String partitionKeyName, String partitionKeyType, String sortKeyName, String
sortKeyType) {

try {

API Version 2012-08-10


784
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: Java

ArrayList<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();


keySchema.add(new
KeySchemaElement().withAttributeName(partitionKeyName).withKeyType(KeyType.HASH)); //
Partition

// key

ArrayList<AttributeDefinition> attributeDefinitions = new


ArrayList<AttributeDefinition>();
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName(partitionKeyName).withAttributeType(partitionKeyType));

if (sortKeyName != null) {
keySchema.add(new
KeySchemaElement().withAttributeName(sortKeyName).withKeyType(KeyType.RANGE)); // Sort

// key
attributeDefinitions
.add(new
AttributeDefinition().withAttributeName(sortKeyName).withAttributeType(sortKeyType));
}

CreateTableRequest request = new


CreateTableRequest().withTableName(tableName).withKeySchema(keySchema)
.withProvisionedThroughput(new
ProvisionedThroughput().withReadCapacityUnits(readCapacityUnits)
.withWriteCapacityUnits(writeCapacityUnits));

// If this is the Reply table, define a local secondary index


if (replyTableName.equals(tableName)) {

attributeDefinitions
.add(new
AttributeDefinition().withAttributeName("PostedBy").withAttributeType("S"));

ArrayList<LocalSecondaryIndex> localSecondaryIndexes = new


ArrayList<LocalSecondaryIndex>();
localSecondaryIndexes.add(new
LocalSecondaryIndex().withIndexName("PostedBy-Index")
.withKeySchema(new
KeySchemaElement().withAttributeName(partitionKeyName).withKeyType(KeyType.HASH), //
Partition

// key
new
KeySchemaElement().withAttributeName("PostedBy").withKeyType(KeyType.RANGE)) // Sort

// key
.withProjection(new
Projection().withProjectionType(ProjectionType.KEYS_ONLY)));

request.setLocalSecondaryIndexes(localSecondaryIndexes);
}

request.setAttributeDefinitions(attributeDefinitions);

System.out.println("Issuing CreateTable request for " + tableName);


Table table = dynamoDB.createTable(request);
System.out.println("Waiting for " + tableName + " to be created...this may take
a while...");
table.waitForActive();

}
catch (Exception e) {
System.err.println("CreateTable request failed for " + tableName);

API Version 2012-08-10


785
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: Java

System.err.println(e.getMessage());
}
}

private static void loadSampleProducts(String tableName) {

Table table = dynamoDB.getTable(tableName);

try {

System.out.println("Adding data to " + tableName);

Item item = new Item().withPrimaryKey("Id", 101).withString("Title", "Book 101


Title")
.withString("ISBN", "111-1111111111")
.withStringSet("Authors", new
HashSet<String>(Arrays.asList("Author1"))).withNumber("Price", 2)
.withString("Dimensions", "8.5 x 11.0 x 0.5").withNumber("PageCount", 500)
.withBoolean("InPublication", true).withString("ProductCategory", "Book");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 102).withString("Title", "Book 102


Title")
.withString("ISBN", "222-2222222222")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author1",
"Author2")))
.withNumber("Price", 20).withString("Dimensions", "8.5 x 11.0 x
0.8").withNumber("PageCount", 600)
.withBoolean("InPublication", true).withString("ProductCategory", "Book");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 103).withString("Title", "Book 103


Title")
.withString("ISBN", "333-3333333333")
.withStringSet("Authors", new HashSet<String>(Arrays.asList("Author1",
"Author2")))
// Intentional. Later we'll run Scan to find price error. Find
// items > 1000 in price.
.withNumber("Price", 2000).withString("Dimensions", "8.5 x 11.0 x
1.5").withNumber("PageCount", 600)
.withBoolean("InPublication", false).withString("ProductCategory", "Book");
table.putItem(item);

// Add bikes.

item = new Item().withPrimaryKey("Id", 201).withString("Title", "18-Bike-201")


// Size, followed by some title.
.withString("Description", "201 Description").withString("BicycleType",
"Road")
.withString("Brand", "Mountain A")
// Trek, Specialized.
.withNumber("Price", 100).withStringSet("Color", new
HashSet<String>(Arrays.asList("Red", "Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 202).withString("Title", "21-Bike-202")


.withString("Description", "202 Description").withString("BicycleType",
"Road")
.withString("Brand", "Brand-Company A").withNumber("Price", 200)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Green",
"Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 203).withString("Title", "19-Bike-203")

API Version 2012-08-10


786
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: Java

.withString("Description", "203 Description").withString("BicycleType",


"Road")
.withString("Brand", "Brand-Company B").withNumber("Price", 300)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red", "Green",
"Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 204).withString("Title", "18-Bike-204")


.withString("Description", "204 Description").withString("BicycleType",
"Mountain")
.withString("Brand", "Brand-Company B").withNumber("Price", 400)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);

item = new Item().withPrimaryKey("Id", 205).withString("Title", "20-Bike-205")


.withString("Description", "205 Description").withString("BicycleType",
"Hybrid")
.withString("Brand", "Brand-Company C").withNumber("Price", 500)
.withStringSet("Color", new HashSet<String>(Arrays.asList("Red", "Black")))
.withString("ProductCategory", "Bicycle");
table.putItem(item);

}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}

private static void loadSampleForums(String tableName) {

Table table = dynamoDB.getTable(tableName);

try {

System.out.println("Adding data to " + tableName);

Item item = new Item().withPrimaryKey("Name", "Amazon DynamoDB")


.withString("Category", "Amazon Web Services").withNumber("Threads",
2).withNumber("Messages", 4)
.withNumber("Views", 1000);
table.putItem(item);

item = new Item().withPrimaryKey("Name", "Amazon S3").withString("Category",


"Amazon Web Services")
.withNumber("Threads", 0);
table.putItem(item);

}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}
}

private static void loadSampleThreads(String tableName) {


try {
long time1 = (new Date()).getTime() - (7 * 24 * 60 * 60 * 1000); // 7
// days
// ago
long time2 = (new Date()).getTime() - (14 * 24 * 60 * 60 * 1000); // 14
// days
// ago

API Version 2012-08-10


787
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: Java

long time3 = (new Date()).getTime() - (21 * 24 * 60 * 60 * 1000); // 21


// days
// ago

Date date1 = new Date();


date1.setTime(time1);

Date date2 = new Date();


date2.setTime(time2);

Date date3 = new Date();


date3.setTime(time3);

dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));

Table table = dynamoDB.getTable(tableName);

System.out.println("Adding data to " + tableName);

Item item = new Item().withPrimaryKey("ForumName", "Amazon DynamoDB")


.withString("Subject", "DynamoDB Thread 1").withString("Message", "DynamoDB
thread 1 message")
.withString("LastPostedBy", "User A").withString("LastPostedDateTime",
dateFormatter.format(date2))
.withNumber("Views", 0).withNumber("Replies", 0).withNumber("Answered", 0)
.withStringSet("Tags", new HashSet<String>(Arrays.asList("index",
"primarykey", "table")));
table.putItem(item);

item = new Item().withPrimaryKey("ForumName", "Amazon


DynamoDB").withString("Subject", "DynamoDB Thread 2")
.withString("Message", "DynamoDB thread 2
message").withString("LastPostedBy", "User A")
.withString("LastPostedDateTime",
dateFormatter.format(date3)).withNumber("Views", 0)
.withNumber("Replies", 0).withNumber("Answered", 0)
.withStringSet("Tags", new HashSet<String>(Arrays.asList("index",
"partitionkey", "sortkey")));
table.putItem(item);

item = new Item().withPrimaryKey("ForumName", "Amazon


S3").withString("Subject", "S3 Thread 1")
.withString("Message", "S3 Thread 3 message").withString("LastPostedBy",
"User A")
.withString("LastPostedDateTime",
dateFormatter.format(date1)).withNumber("Views", 0)
.withNumber("Replies", 0).withNumber("Answered", 0)
.withStringSet("Tags", new HashSet<String>(Arrays.asList("largeobjects",
"multipart upload")));
table.putItem(item);

}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());
}

private static void loadSampleReplies(String tableName) {


try {
// 1 day ago
long time0 = (new Date()).getTime() - (1 * 24 * 60 * 60 * 1000);
// 7 days ago
long time1 = (new Date()).getTime() - (7 * 24 * 60 * 60 * 1000);
// 14 days ago

API Version 2012-08-10


788
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: Java

long time2 = (new Date()).getTime() - (14 * 24 * 60 * 60 * 1000);


// 21 days ago
long time3 = (new Date()).getTime() - (21 * 24 * 60 * 60 * 1000);

Date date0 = new Date();


date0.setTime(time0);

Date date1 = new Date();


date1.setTime(time1);

Date date2 = new Date();


date2.setTime(time2);

Date date3 = new Date();


date3.setTime(time3);

dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));

Table table = dynamoDB.getTable(tableName);

System.out.println("Adding data to " + tableName);

// Add threads.

Item item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread


1")
.withString("ReplyDateTime", (dateFormatter.format(date3)))
.withString("Message", "DynamoDB Thread 1 Reply 1
text").withString("PostedBy", "User A");
table.putItem(item);

item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 1")


.withString("ReplyDateTime", dateFormatter.format(date2))
.withString("Message", "DynamoDB Thread 1 Reply 2
text").withString("PostedBy", "User B");
table.putItem(item);

item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 2")


.withString("ReplyDateTime", dateFormatter.format(date1))
.withString("Message", "DynamoDB Thread 2 Reply 1
text").withString("PostedBy", "User A");
table.putItem(item);

item = new Item().withPrimaryKey("Id", "Amazon DynamoDB#DynamoDB Thread 2")


.withString("ReplyDateTime", dateFormatter.format(date0))
.withString("Message", "DynamoDB Thread 2 Reply 2
text").withString("PostedBy", "User A");
table.putItem(item);

}
catch (Exception e) {
System.err.println("Failed to create item in " + tableName);
System.err.println(e.getMessage());

}
}

API Version 2012-08-10


789
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

Creacin de ejemplos de tablas y carga de datos


mediante el AWS SDK para .NET
En el siguiente ejemplo de cdigo C# se crean tablas y se cargan datos en ellas. La estructura de tablas
y los datos resultantes se muestran en Creacin de tablas y carga de ejemplos de datos (p. 291). Para
obtener instrucciones paso a paso sobre cmo ejecutar este cdigo en Visual Studio, consulte Ejemplos de
cdigo de .NET (p. 298).

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();

static void Main(string[] args)


{
try
{
//DeleteAllTables(client);
DeleteTable("ProductCatalog");
DeleteTable("Forum");
DeleteTable("Thread");
DeleteTable("Reply");

// Create tables (using the AWS SDK for .NET low-level API).
CreateTableProductCatalog();
CreateTableForum();
CreateTableThread(); // ForumTitle, Subject */
CreateTableReply();

// Load data (using the .NET SDK document API)


LoadSampleProducts();
LoadSampleForums();
LoadSampleThreads();
LoadSampleReplies();
Console.WriteLine("Sample complete!");
Console.WriteLine("Press ENTER to continue");
Console.ReadLine();
}
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
}

private static void DeleteTable(string tableName)


{
try
{
var deleteTableResponse = client.DeleteTable(new DeleteTableRequest()
{
TableName = tableName
});
WaitTillTableDeleted(client, tableName, deleteTableResponse);
}
catch (ResourceNotFoundException)

API Version 2012-08-10


790
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

{
// There is no such table.
}
}

private static void CreateTableProductCatalog()


{
string tableName = "ProductCatalog";

var response = client.CreateTable(new CreateTableRequest


{
TableName = tableName,
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "Id",
AttributeType = "N"
}
},
KeySchema = new List<KeySchemaElement>()
{
new KeySchemaElement
{
AttributeName = "Id",
KeyType = "HASH"
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 10,
WriteCapacityUnits = 5
}
});

WaitTillTableCreated(client, tableName, response);


}

private static void CreateTableForum()


{
string tableName = "Forum";

var response = client.CreateTable(new CreateTableRequest


{
TableName = tableName,
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "Name",
AttributeType = "S"
}
},
KeySchema = new List<KeySchemaElement>()
{
new KeySchemaElement
{
AttributeName = "Name", // forum Title
KeyType = "HASH"
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 10,
WriteCapacityUnits = 5
}

API Version 2012-08-10


791
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

});

WaitTillTableCreated(client, tableName, response);


}

private static void CreateTableThread()


{
string tableName = "Thread";

var response = client.CreateTable(new CreateTableRequest


{
TableName = tableName,
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "ForumName", // Hash attribute
AttributeType = "S"
},
new AttributeDefinition
{
AttributeName = "Subject",
AttributeType = "S"
}
},
KeySchema = new List<KeySchemaElement>()
{
new KeySchemaElement
{
AttributeName = "ForumName", // Hash attribute
KeyType = "HASH"
},
new KeySchemaElement
{
AttributeName = "Subject", // Range attribute
KeyType = "RANGE"
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 10,
WriteCapacityUnits = 5
}
});

WaitTillTableCreated(client, tableName, response);


}

private static void CreateTableReply()


{
string tableName = "Reply";
var response = client.CreateTable(new CreateTableRequest
{
TableName = tableName,
AttributeDefinitions = new List<AttributeDefinition>()
{
new AttributeDefinition
{
AttributeName = "Id",
AttributeType = "S"
},
new AttributeDefinition
{
AttributeName = "ReplyDateTime",
AttributeType = "S"
},

API Version 2012-08-10


792
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

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",

KeySchema = new List<KeySchemaElement>() {


new KeySchemaElement() {
AttributeName = "Id", KeyType = "HASH"
},
new KeySchemaElement() {
AttributeName = "PostedBy", KeyType = "RANGE"
}
},
Projection = new Projection() {
ProjectionType = ProjectionType.KEYS_ONLY
}
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 10,
WriteCapacityUnits = 5
}
});

WaitTillTableCreated(client, tableName, response);


}

private static void WaitTillTableCreated(AmazonDynamoDBClient client, string


tableName,
CreateTableResponse response)
{
var tableDescription = response.TableDescription;

string status = tableDescription.TableStatus;

Console.WriteLine(tableName + " - " + status);

// Let us wait until table is created. Call DescribeTable.


while (status != "ACTIVE")
{
System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
try
{
var res = client.DescribeTable(new DescribeTableRequest

API Version 2012-08-10


793
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

{
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)
{ }
}
}

private static void WaitTillTableDeleted(AmazonDynamoDBClient client, string


tableName,
DeleteTableResponse response)
{
var tableDescription = response.TableDescription;

string status = tableDescription.TableStatus;

Console.WriteLine(tableName + " - " + status);

// Let us wait until table is created. Call DescribeTable


try
{
while (status == "DELETING")
{
System.Threading.Thread.Sleep(5000); // wait 5 seconds

var res = client.DescribeTable(new DescribeTableRequest


{
TableName = tableName
});
Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName,
res.Table.TableStatus);
status = res.Table.TableStatus;
}
}
catch (ResourceNotFoundException)
{
// Table deleted.
}
}

private static void LoadSampleProducts()


{
Table productCatalogTable = Table.LoadTable(client, "ProductCatalog");
// ********** Add Books *********************
var book1 = new Document();
book1["Id"] = 101;
book1["Title"] = "Book 101 Title";
book1["ISBN"] = "111-1111111111";
book1["Authors"] = new List<string> { "Author 1" };
book1["Price"] = -2; // *** Intentional value. Later used to illustrate scan.
book1["Dimensions"] = "8.5 x 11.0 x 0.5";
book1["PageCount"] = 500;
book1["InPublication"] = true;
book1["ProductCategory"] = "Book";
productCatalogTable.PutItem(book1);

var book2 = new Document();

book2["Id"] = 102;
book2["Title"] = "Book 102 Title";
book2["ISBN"] = "222-2222222222";

API Version 2012-08-10


794
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

book2["Authors"] = new List<string> { "Author 1", "Author 2" }; ;


book2["Price"] = 20;
book2["Dimensions"] = "8.5 x 11.0 x 0.8";
book2["PageCount"] = 600;
book2["InPublication"] = true;
book2["ProductCategory"] = "Book";
productCatalogTable.PutItem(book2);

var book3 = new Document();


book3["Id"] = 103;
book3["Title"] = "Book 103 Title";
book3["ISBN"] = "333-3333333333";
book3["Authors"] = new List<string> { "Author 1", "Author2", "Author 3" }; ;
book3["Price"] = 2000;
book3["Dimensions"] = "8.5 x 11.0 x 1.5";
book3["PageCount"] = 700;
book3["InPublication"] = false;
book3["ProductCategory"] = "Book";
productCatalogTable.PutItem(book3);

// ************ Add bikes. *******************


var bicycle1 = new Document();
bicycle1["Id"] = 201;
bicycle1["Title"] = "18-Bike 201"; // size, followed by some title.
bicycle1["Description"] = "201 description";
bicycle1["BicycleType"] = "Road";
bicycle1["Brand"] = "Brand-Company A"; // Trek, Specialized.
bicycle1["Price"] = 100;
bicycle1["Color"] = new List<string> { "Red", "Black" };
bicycle1["ProductCategory"] = "Bike";
productCatalogTable.PutItem(bicycle1);

var bicycle2 = new Document();


bicycle2["Id"] = 202;
bicycle2["Title"] = "21-Bike 202Brand-Company A";
bicycle2["Description"] = "202 description";
bicycle2["BicycleType"] = "Road";
bicycle2["Brand"] = "";
bicycle2["Price"] = 200;
bicycle2["Color"] = new List<string> { "Green", "Black" };
bicycle2["ProductCategory"] = "Bicycle";
productCatalogTable.PutItem(bicycle2);

var bicycle3 = new Document();


bicycle3["Id"] = 203;
bicycle3["Title"] = "19-Bike 203";
bicycle3["Description"] = "203 description";
bicycle3["BicycleType"] = "Road";
bicycle3["Brand"] = "Brand-Company B";
bicycle3["Price"] = 300;
bicycle3["Color"] = new List<string> { "Red", "Green", "Black" };
bicycle3["ProductCategory"] = "Bike";
productCatalogTable.PutItem(bicycle3);

var bicycle4 = new Document();


bicycle4["Id"] = 204;
bicycle4["Title"] = "18-Bike 204";
bicycle4["Description"] = "204 description";
bicycle4["BicycleType"] = "Mountain";
bicycle4["Brand"] = "Brand-Company B";
bicycle4["Price"] = 400;
bicycle4["Color"] = new List<string> { "Red" };
bicycle4["ProductCategory"] = "Bike";
productCatalogTable.PutItem(bicycle4);

var bicycle5 = new Document();

API Version 2012-08-10


795
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

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);
}

private static void LoadSampleForums()


{
Table forumTable = Table.LoadTable(client, "Forum");

var forum1 = new Document();


forum1["Name"] = "Amazon DynamoDB"; // PK
forum1["Category"] = "Amazon Web Services";
forum1["Threads"] = 2;
forum1["Messages"] = 4;
forum1["Views"] = 1000;

forumTable.PutItem(forum1);

var forum2 = new Document();


forum2["Name"] = "Amazon S3"; // PK
forum2["Category"] = "Amazon Web Services";
forum2["Threads"] = 1;

forumTable.PutItem(forum2);
}

private static void LoadSampleThreads()


{
Table threadTable = Table.LoadTable(client, "Thread");

// 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);

API Version 2012-08-10


796
Amazon DynamoDB Developer Guide
Creacin de ejemplos de tablas y carga de datos: .NET

// 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);
}

private static void LoadSampleReplies()


{
Table replyTable = Table.LoadTable(client, "Reply");

// 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";

API Version 2012-08-10


797
Amazon DynamoDB Developer Guide
Ejemplo de aplicacin con el AWS SDK para Python (Boto)

thread2Reply2["PostedBy"] = "User A";

replyTable.PutItem(thread2Reply2);
}
}
}

Ejemplo de aplicacin de DynamoDB con el AWS


SDK para Python (Boto): tres en raya
Temas
Paso 1: Implementar y probar localmente (p. 799)
Paso2: Examinar el modelo de datos y los detalles de implementacin (p. 802)
Paso3: Implementar en produccin mediante el servicio de DynamoDB (p. 809)
Paso4: Eliminar recursos (p. 815)

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.

A continuacin se indica cmo se juega a la aplicacin Tic-Tac-Toe en la Web:

1. Inicie sesin en la pgina de inicio de la aplicacin.


2. A continuacin, invite a otro usuario a jugar una partida como su contrincante.

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.

El ejercicio completa de creacin de la aplicacin se describe en varios pasos:

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.

API Version 2012-08-10


798
Amazon DynamoDB Developer Guide
Paso 1: Implementar y probar localmente

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.

Paso 1: Implementar y probar localmente


Temas
1.1: Descargar e instalar los paquetes obligatorios (p. 799)
1.2: Pruebe la aplicacin del juego (p. 800)

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.

1.1: Descargar e instalar los paquetes obligatorios


Necesitar lo siguiente para probar localmente esta aplicacin:

Python
Flask (un micromarco de trabajo para Python)
El AWS SDK para Python (Boto)
DynamoDB en ejecucin en su equipo
Git

Para obtener estas herramientas, haga lo siguiente:

1. Instalacin de Python. Para obtener instrucciones paso a paso, vaya a Download Python.

La aplicacin Tic-Tac-Toe se ha probado con Python versin 2.7.


2. Utilice Python Package Installer (PIP) para instalar Flask y el AWS SDK para Python (Boto):
Instale PIP.

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

En Linux, no se especifica la extensin .exe. Solo se especifica python get-pip.py.


Utilice PIP para instalar los paquetes Flask y Boto mediante el siguiente cdigo:

pip install Flask


pip install boto
pip install configparser

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

git clone https://github.com/awslabs/dynamodb-tictactoe-example-app.git

1.2: Pruebe la aplicacin del juego


Para probar la aplicacin Tic-Tac-Toe, debe ejecutar DynamoDB localmente en su equipo.

Para ejecutar la aplicacin Tic-Tac-Toe

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:

python.exe application.py--mode local --serverPort 5000 --port 8000

En Linux, no se especifica la extensin .exe.


3. Abra el navegador web y escriba lo siguiente:

http://localhost:5000/

En el navegador aparece la pgina de inicio:

4. Escriba user1 en el cuadro Log in para iniciar sesin como user1.


Note
En este ejemplo de aplicacin no se lleva a cabo la autenticacin del usuario. El identificador
de usuario se utiliza solamente para identificar a los jugadores. Si dos jugadores inician
sesin con el mismo alias, la aplicacin funciona como si estuviesen jugando en dos
navegadores distintos.
5. Si es la primera vez que inicia el juego, aparece una pgina que le pide que cree la tabla requerida
(Games) en DynamoDB. Seleccione CREATE TABLE.

API Version 2012-08-10


800
Amazon DynamoDB Developer Guide
Paso 1: Implementar y probar localmente

6. Elija CREATE para crear la primera partida de tres en raya.


7. Escriba user2 en el cuadro Choose an Opponent y elija Create Game!

Se crea la partida agregando un elemento a la tabla Games. El estado de la partida se establece en


PENDING.
8. Abra otra ventana del navegador y escriba lo siguiente.

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 una pgina con una invitacin pendiente de user1.

10. Elija accept para aceptar la invitacin.

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.

API Version 2012-08-10


801
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin

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.

Paso2: Examinar el modelo de datos y los detalles de


implementacin
Temas
2.1: Modelo de datos bsicos (p. 802)
2.2: Aplicacin en accin (gua del cdigo) (p. 804)

2.1: Modelo de datos bsicos


En este ejemplo de aplicacin se resaltan los siguientes conceptos del modelo de datos de DynamoDB:

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:

API Version 2012-08-10


802
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin

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:

Atributos de valores concatenados: el atributo StatusDate ilustra un valor de atributo concatenado. En


este enfoque, en lugar de crear atributos separados para almacenar el estado de la partida (PENDING,
IN_PROGRESS y FINISHED) y la fecha (cundo se realiz la ltima jugada), se combinan como un solo
atributo; por ejemplo IN_PROGRESS_2014-04-30 10:20:32.

A continuacin, la aplicacin utiliza el atributo StatusDate para crear ndices secundarios


especificando StatusDate como clave de ordenacin del ndice. El beneficio de utilizar el atributo de
valores concatenados StatusDate se ilustra mejor en la explicacin sobre ndices que encontrar ms
adelante.
ndices secundarios globales: puede utilizar la clave principal de la tabla, GameId, para consultar
esa tabla de manera eficiente con el fin de encontrar un elemento de partida. Para consultar la tabla
para hallar otros atributos distintos de los de clave principal, DynamoDB admite la creacin de ndices
secundarios. En este ejemplo de aplicacin, se crean los dos ndices secundarios siguientes:

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.

API Version 2012-08-10


803
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin

OpponentId-StatusDate-index. Este ndice tiene OpponentId como clave de particin y StatusDate


como clave de ordenacin. Puede utilizar este ndice para realizar una consulta sobre Opponent, por
ejemplo, para encontrar las partidas en las que un usuario determinado ha sido el contrincante.

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).

2.2: Aplicacin en accin (gua del cdigo)


Esta aplicacin tiene dos pginas principales:

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.

La pgina de inicio no se actualiza automticamente; debe actualizarla para renovar la informacin de


las listas.
Pgina de la partida: muestra la cuadrcula de tres en raya en la que juegan los usuarios.

La aplicacin actualiza la pgina de la partida automticamente cada segundo. El cdigo JavaScript


del navegador llama al servidor web Python cada segundo para consultar la tabla Games y saber si los
elementos de partidas contenidos en la tabla han cambiado. En caso afirmativo, JavaScript activa una
actualizacin de la pgina para que el usuario vea el tablero con la informacin ms reciente.

Vamos a estudiar en detalle el funcionamiento de la aplicacin.

Pgina de inicio
Cuando el usuario inicia sesin, la aplicacin muestra las tres listas de informacin siguientes:

API Version 2012-08-10


804
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin

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.

API Version 2012-08-10


805
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin

Vamos a revisar las tres funciones para entender cmo consultan la tabla Games y utilizan ndices
secundarios globales para recuperar los datos pertinentes.

Uso de getGameInvites para obtener la lista de invitaciones pendientes para jugar

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.

La funcin especifica la consulta de la siguiente manera:

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_".

El ndice OpponentId-StatusDate-index se utiliza para recuperar partidas a las que se ha invitado


a jugar al usuario que ha iniciado sesin; es decir, en las que el usuario que ha iniciado sesin es el
contrincante.
La consulta limita el resultado a diez elementos.

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.

Uso de getGamesWithStatus para obtener la lista de partidas con un estado determinado

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.

inProgressGames = controller.getGamesWithStatus(session["username"], "IN_PROGRESS")


finishedGames = controller.getGamesWithStatus(session["username"], "FINISHED")

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:

Las partidas en curso organizadas por el usuario


Las partidas en curso en las que el usuario es el contrincante

La funcin getGamesWithStatus ejecuta las dos consultas siguientes, utilizando en cada caso el ndice
secundario apropiado.

API Version 2012-08-10


806
Amazon DynamoDB Developer Guide
Paso2: Examinar el modelo de datos
y los detalles de implementacin

La funcin consulta la tabla Games mediante el ndice HostId-StatusDate-index. Para el ndice,


la consulta especifica los valores de clave principal; es decir, los valores tanto de la clave de particin
(HostId) como de la clave de ordenacin (StatusDate), as como los operadores de comparacin.

hostGamesInProgress = self.cm.getGamesTable ().query(HostId__eq=user,


StatusDate__beginswith=status,
index="HostId-StatusDate-index",
limit=10)

Fjese en la sintaxis de Python para los operadores de comparacin:


HostId__eq=user especifica el operador de comparacin de igualdad.
StatusDate__beginswith=status especifica el operador de comparacin BEGINS_WITH.
La funcin consulta la tabla Games mediante el ndice OpponentId-StatusDate-index.

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:

La aplicacin muestra la pgina de la partida en las siguientes situaciones:

Cuando el usuario ha creado una partida e invitado a otro usuario a jugar.

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:

Agrega un nuevo atributo especfico de la jugada.


Actualiza el valor del atributo Turn con el valor del usuario al que le toca jugar a continuacin.

controller.updateBoardAndTurn(item, value, session["username"])

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

La diferencia entre las operaciones UpdateItem y PutItem es que PutItem sustituye al


elemento completo. Para obtener ms informacin, consulte PutItem.

Para la llamada a update_item, el cdigo identifica lo siguiente:

Clave principal de la tabla Games (es decir, ItemId).

key = { "GameId" : { "S" : gameId } }

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 }
}
}

Condiciones que deben cumplirse para que la actualizacin se lleve a cabo:


La partida debe estar en curso. Es decir, el valor del atributo StatusDate debe comenzar por
IN_PROGRESS.
El turno actual debe ser vlido para el usuario segn lo especificado por el atributo Turn.
La casilla elegida por el usuario debe estar disponible. Es decir, el atributo correspondiente a la casilla
no debe existir.

expectations = {"StatusDate" : {"AttributeValueList": [{"S" : "IN_PROGRESS_"}],


"ComparisonOperator": "BEGINS_WITH"},
"Turn" : {"Value" : {"S" : current_player}},
position : {"Exists" : False}}

Ahora, la funcin llama a update_item para actualizar el elemento.

API Version 2012-08-10


808
Amazon DynamoDB Developer Guide
Paso3: Implementar en produccin

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.

Paso3: Implementar en produccin mediante el


servicio de DynamoDB
Temas
3.1: Crear un rol de IAM para Amazon EC2 (p. 810)
3.2: Crear la tabla Games en Amazon DynamoDB (p. 811)
3.3: Empaquete e implemente el cdigo de la aplicacin Tic-Tac-Toe (p. 811)
3.4: Configurar el entorno de AWS Elastic Beanstalk (p. 812)

En las secciones anteriores, hemos implementado y probado la aplicacin Tic-Tac-Toe localmente en


el equipo utilizando DynamoDB Local. Ahora, vamos a implementarla en un entorno de produccin, del
siguiente modo:

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

API Version 2012-08-10


809
Amazon DynamoDB Developer Guide
Paso3: Implementar en produccin

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.

Resumiendo, debe hacer lo siguiente para implementar la aplicacin Tic-Tac-Toe en un entorno de


produccin:

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.

En el archivo de configuracin (beanstalk.config), se indica la informacin sobre la regin y el


punto de enlace de AWS. La aplicacin Tic-Tac-Toe utiliza esta informacin para determinar con qu
regin de DynamoDB debe comunicarse.
3. Configure el entorno de Elastic Beanstalk. Elastic Beanstalk lanzar una o varias instancias Amazon
EC2 e implementar el paquete de la aplicacin Tic-Tac-Toe en ellas. Una vez que el entorno de Elastic
Beanstalk est preparado, deber indicar el nombre del archivo de configuracin agregando la variable
de entorno CONFIG_FILE.
4. Cree la tabla de DynamoDB. Con el servicio de Amazon DynamoDB, cree una tabla Games en AWS, en
lugar de localmente en el equipo. Recuerde que esta tabla posee una clave principal simple que consta
de la clave de particin GameId, de tipo String.
5. Pruebe el juego en el entorno de produccin.

3.1: Crear un rol de IAM para Amazon EC2


La creacin de un rol de IAM del tipo Amazon EC2 permitir que la instancia Amazon EC2 en la que se
ejecuta la aplicacin Tic-Tac-Toe asuma el rol de IAM correcto y realice solicitudes a la aplicacin para
obtener acceso a la tabla Games. Al crear el rol, elija la opcin Custom Policy y copie y pegue la siguiente
poltica.

{
"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/*"
]
}

API Version 2012-08-10


810
Amazon DynamoDB Developer Guide
Paso3: Implementar en produccin

]
}

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.

3.2: Crear la tabla Games en Amazon DynamoDB


La tabla Games de DynamoDB almacena datos sobre las partidas. Si la tabla no existe, la aplicacin la
crear automticamente. En este caso, vamos a dejar que la aplicacin cree la tabla Games.

3.3: Empaquete e implemente el cdigo de la aplicacin Tic-Tac-


Toe
Si ha seguido los pasos de este ejemplo, ya tendr la aplicacin Tic-Tac-Toe descargada. Si no es as,
descargue la aplicacin y extraiga todos los archivos en una carpeta en su equipo local. Para obtener
instrucciones, consulte Paso 1: Implementar y probar localmente (p. 799).

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.

1. Cambie a la carpeta en la que ha descargado la aplicacin Tic-Tac-Toe.


2. En la carpeta raz de la aplicacin, cree un archivo de texto denominado beanstalk.config con el
contenido siguiente:

[dynamodb]
region=<AWS region>
endpoint=<DynamoDB endpoint>

Por ejemplo, podra utilizar el contenido siguiente:

[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

La regin especificada en el archivo de configuracin es la ubicacin donde la aplicacin Tic-


Tac-Toe crear la tabla Games en DynamoDB. Debe crear la aplicacin de Elastic Beanstalk
que se describe en la siguiente seccin en la misma regin.
Note

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

En la comunicacin cliente-servidor en la cual el servidor enva la respuesta, por motivos


de seguridad el servidor enva una cookie firmada que el cliente devuelve al servidor en la
siguiente solicitud. Cuando hay un nico servidor, este puede generar localmente una clave
de cifrado al iniciarse. Si hay muchos servidores, todos ellos deben conocer la misma clave
de cifrado; de lo contrario, no podrn leer las cookies establecidas por los dems servidores.
Si se agrega secret_key al archivo de configuracin, indicamos a todos los servidores que
utilicen esta clave de cifrado.
3. Comprima el contenido de la carpeta raz de la aplicacin (que incluye el archivo
beanstalk.config); por ejemplo, TicTacToe.zip.
4. Cargue el archivo .zip en un bucket de Amazon Simple Storage Service (Amazon S3). En la
siguiente seccin, proporcionaremos este archivo .zip a Elastic Beanstalk para cargarlo en el o los
servidores.

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.

3.4: Configurar el entorno de AWS Elastic Beanstalk


En este paso, se crea una aplicacin de Elastic Beanstalk, que es una coleccin de componentes,
incluidos los entornos. En este ejemplo, vamos a lanzar una instancia Amazon EC2 para implementar y
ejecutar la aplicacin Tic-Tac-Toe.

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.

API Version 2012-08-10


812
Amazon DynamoDB Developer Guide
Paso3: Implementar en produccin

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.

b. Al final de la seccin Environment Properties, escriba CONFIG_FILE y su valor


beanstalk.config; a continuacin, elija Save.

Puede que la actualizacin del entorno tarde unos minutos en completarse.

Una vez completada la actualizacin, ya puede jugar.


5. En el navegador, escriba la URL que copi en el paso anterior, tal y como se muestra en el siguiente
ejemplo.

API Version 2012-08-10


813
Amazon DynamoDB Developer Guide
Paso3: Implementar en produccin

http://<pen-name>.elasticbeanstalk.com

Se abrir la pgina de inicio de la aplicacin.

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.

8. Abra otra ventana del navegador.

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

10. Inicie sesin como testuser2.


11. Vaya a la invitacin de testuser1 en la lista de invitaciones pendientes y elija accept.

12. Aparecer la pgina de la partida.

API Version 2012-08-10


814
Amazon DynamoDB Developer Guide
Paso4: Eliminar recursos

Pueden jugar la partida los usuarios testuser1 y testuser2. La aplicacin guardar cada jugada en el
elemento correspondiente de la tabla Games.

Paso4: Eliminar recursos


Se han completado la implementacin y las pruebas de la aplicacin Tic-Tac-Toe. La aplicacin abarca
el desarrollo integral de aplicaciones web en Amazon DynamoDB, salvo la autenticacin de usuarios.
La aplicacin utiliza la informacin de inicio de sesin de la pgina de inicio nicamente para agregar el
nombre de un jugador al crear una partida. En una aplicacin de produccin, tendra que agregar el cdigo
necesario para llevar a cabo el inicio de sesin y la autenticacin de los usuarios.

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 eliminar los recursos que ha creado

1. Elimine la tabla Games que ha creado en DynamoDB.


2. Termine el entorno de Elastic Beanstalk para liberar las instancias Amazon EC2.
3. Elimine el rol de IAM que ha creado.
4. Elimine el objeto que ha creado en Amazon S3.

Amazon DynamoDB Storage Backend for Titan


El proyecto DynamoDB Storage Backend for Titan se ha reemplazado por Amazon DynamoDB Storage
Backend para JanusGraph, disponible en GitHub.

Para obtener instrucciones actualizadas sobre DynamoDB Storage Backend para JanusGraph, consulte el
archivo README.md.

Palabras reservadas en DynamoDB


Las siguientes palabras clave estn reservadas para el uso de DynamoDB. No utilice ninguna de estas
palabras como nombres de atributos en las expresiones.

API Version 2012-08-10


815
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


816
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


817
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


818
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


819
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


820
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


821
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


822
Amazon DynamoDB Developer Guide
Palabras reservadas en DynamoDB

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

API Version 2012-08-10


823
Amazon DynamoDB Developer Guide
Parmetros condicionales heredados

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

Parmetros condicionales heredados


En esta seccin se comparan los parmetros condicionales heredados con los parmetros de expresin de
DynamoDB.

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).)

API Version 2012-08-10


824
Amazon DynamoDB Developer Guide
AttributesToGet

Note

DynamoDB no permite mezclar parmetros condicionales heredados con parmetros


de expresin en una misma llamada. Por ejemplo, llamar a la operacin Query con
AttributesToGet y ConditionExpression dar lugar a un error.

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.

Si utiliza este API... Con estos parmetros Utilice estos parmetros de


heredados... expresin en su lugar

BatchGetItem AttributesToGet ProjectionExpression

DeleteItem Expected ConditionExpression

GetItem AttributesToGet ProjectionExpression

PutItem Expected ConditionExpression

Query AttributesToGet ProjectionExpression

KeyConditions KeyConditionExpression

QueryFilter FilterExpression

Scan AttributesToGet ProjectionExpression

ScanFilter FilterExpression

UpdateItem AttributeUpdates UpdateExpression

Expected ConditionExpression

En las secciones siguientes se proporciona ms informacin acerca de los parmetros condicionales


heredados.

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.

API Version 2012-08-10


825
Amazon DynamoDB Developer Guide
AttributeUpdates

AttributesToGet permite recuperar atributos de tipo List o Map; sin embargo, no puede recuperar
entradas individuales dentro de una lista o un mapa.

Tenga en cuenta que AttributesToGet no modifica el consumo de desempeo provisionado.


DynamoDB determina las 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.

Utilice ProjectionExpression en su lugar


Supongamos que desea recuperar un elemento de la tabla Music, pero no devolverlo completo, sino solo
algunos de los atributos. Podra usar una solicitud GetItem con un parmetro AttributesToGet como
en este ejemplo de la AWS CLI:

aws dynamodb get-item \


--table-name Music \
--attributes-to-get '["Artist", "Genre"]' \
--key '{
"Artist": {"S":"No One You Know"},
"SongTitle": {"S":"Call Me Today"}
}'

Pero, en su lugar, podra usar una expresin ProjectionExpression:

aws dynamodb get-item \


--table-name Music \
--projection-expression "Artist, Genre" \
--key '{
"Artist": {"S":"No One You Know"},
"SongTitle": {"S":"Call Me Today"}
}'

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:

Value: el nuevo valor, si procede, de este atributo.


Action: un valor que especifica cmo llevar a cabo la actualizacin. Esta accin solo es vlida para un
atributo existente cuyo tipo de datos sea Number o que sea un conjunto; no use ADD con otros tipos de
datos.

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.

API Version 2012-08-10


826
Amazon DynamoDB Developer Guide
AttributeUpdates

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.

Use UpdateExpression en su lugar


Supongamos que desea modificar un elemento de la tabla Music. Podra usar una solicitud UpdateItem
con un parmetro AttributeUpdates como en este ejemplo de la AWS CLI:

aws dynamodb update-item \


--table-name Music \
--key '{
"SongTitle": {"S":"Call Me Today"},
"Artist": {"S":"No One You Know"}
}' \
--attribute-updates '{
"Genre": {
"Action": "PUT",
"Value": {"S":"Rock"}

API Version 2012-08-10


827
Amazon DynamoDB Developer Guide
ConditionalOperator

}
}'

Pero, en su lugar, podra usar una expresin UpdateExpression:

aws dynamodb update-item \


--table-name Music \
--key '{
"SongTitle": {"S":"Call Me Today"},
"Artist": {"S":"No One You Know"}
}' \
--update-expression 'SET Genre = :g' \
--expression-attribute-values '{
":g": {"S":"Rock"}
}'

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.

Si se omite ConditionalOperator, entonces AND es el valor predeterminado.

La operacin se llevar a cabo correctamente solo si todo el mapa se evala en true.


Note

Este parmetro no es compatible con atributos de tipo List o Map.

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.

Si el mapa Expected se evala en true, entonces la operacin condicional se realiza correctamente; de lo


contrario, se produce un error.

Expected contiene lo siguiente:

AttributeValueList: uno o ms valores que se evaluarn respecto al atributo suministrado. El


nmero de valores de la lista depende del valor de ComparisonOperator que se utilice.

Para el tipo Number, las comparaciones de los valores son numricas.

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.

API Version 2012-08-10


828
Amazon DynamoDB Developer Guide
Expected

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.

Estn disponibles los siguientes operadores de comparacin:

EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS |


BEGINS_WITH | IN | BETWEEN

A continuacin se indican las descripciones de cada operador de comparacin.


EQ: igual que. EQ 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,
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 un solo AttributeValue de tipo String, Number, Binary,


String Set, Number Set o Binary Set. Si un elemento contiene un 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"]}.
LE: menor o igual 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"]}.
LT : Menor que.

AttributeValueList puede contener un solo 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"]}.
GE: mayor o igual 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

Este operador comprueba si no existe un atributo, no su tipo de datos. Si el tipo de datos


del atributo "a" es null y se evala mediante NULL, el resultado es un valor false de tipo
Boolean. Esto se debe a que el atributo "a" existe; su tipo de datos no es pertinente para el
operador de comparacin NULL.
CONTAINS: comprueba si hay una subsecuencia, o 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 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 puede contener una o varias entradas AttributeValue de tipo String,


Number o Binary (no de tipo Set). Estos atributos se comparan con un atributo existente 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.
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"]}.

Los parmetros siguientes se pueden utilizar en lugar de AttributeValueList y


ComparisonOperator:

Value: valor que DynamoDB compara con un2012-08-10


API Version atributo.
830
Amazon DynamoDB Developer Guide
Expected

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.

Tenga en cuenta que el valor predeterminado de Exists es true.

Los parmetros Value y Exists son incompatibles con AttributeValueList y


ComparisonOperator. Tenga en cuenta que si utiliza los dos conjuntos de parmetros a la vez,
DynamoDB devolver una excepcin ValidationException.
Note

Este parmetro no es compatible con atributos de tipo List o Map.

Utilice ConditionExpression en su lugar


Supongamos que desea modificar un elemento de la tabla Music, pero solo si se cumple una condicin
determinada. Podra usar una solicitud UpdateItem con un parmetro Expected como en este ejemplo
de la AWS CLI:

aws dynamodb update-item \


--table-name Music \
--key '{
"Artist": {"S":"No One You Know"},
"SongTitle": {"S":"Call Me Today"}
}' \
--attribute-updates '{
"Price": {
"Action": "PUT",
"Value": {"N":"1.98"}
}
}' \
--expected '{
"Price": {
"ComparisonOperator": "LE",
"AttributeValueList": [ {"N":"2.00"} ]
}
}'

Pero, en su lugar, podra usar una expresin ConditionExpression:

aws dynamodb update-item \


--table-name Music \
--key '{
"Artist": {"S":"No One You Know"},
"SongTitle": {"S":"Call Me Today"}
}' \
--update-expression 'SET Price = :p1' \
--condition-expression 'Price <= :p2' \
--expression-attribute-values '{
":p1": {"N":"1.98"},
":p2": {"N":"2.00"}
}'

API Version 2012-08-10


831
Amazon DynamoDB Developer Guide
KeyConditions

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:

AttributeValueList: uno o ms valores que se evaluarn respecto al atributo suministrado. El


nmero de valores de la lista depende del valor de ComparisonOperator que se utilice.

Para el tipo Number, las comparaciones de los valores son numricas.

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.

Para KeyConditions, solo se admiten los siguientes operadores de comparacin:

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

A continuacin se indican las descripciones de estos operadores de comparacin.


EQ: igual que.

AttributeValueList puede contener un solo AttributeValue de tipo String, Number o


Binary (no de tipo Set). Si un elemento contiene una entrada AttributeValue de un tipo distinto
del especificado 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"]}.
LE: menor o igual 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"]}.
LT : Menor que.

AttributeValueList puede contener un solo 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"]}.
GE: mayor o igual 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

API Version 2012-08-10


832
Amazon DynamoDB Developer Guide
QueryFilter

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"]}.

Utilice KeyConditionExpression en su lugar


Supongamos que desea recuperar varios elementos con la misma clave de particin de la tabla Music.
Podra usar una solicitud Query con un parmetro KeyConditions como en este ejemplo de la AWS CLI:

aws dynamodb query \


--table-name Music \
--key-conditions '{
"Artist":{
"ComparisonOperator":"EQ",
"AttributeValueList": [ {"S": "No One You Know"} ]
},
"SongTitle":{
"ComparisonOperator":"BETWEEN",
"AttributeValueList": [ {"S": "A"}, {"S": "M"} ]
}
}'

Pero, en su lugar, podra usar una expresin KeyConditionExpression:

aws dynamodb query \


--table-name Music \
--key-condition-expression 'Artist = :a AND SongTitle BETWEEN :t1 AND :t2' \
--expression-attribute-values '{
":a": {"S": "No One You Know"},
":t1": {"S": "A"},
":t2": {"S": "M"}
}'

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.

Este parmetro no es compatible con atributos de tipo List o Map.

API Version 2012-08-10


833
Amazon DynamoDB Developer Guide
QueryFilter

Note

QueryFilter se aplica despus de haber ledo los elementos; el proceso de filtrado no consume
ninguna unidad de capacidad de lectura adicional.

Si proporciona ms de una condicin en el mapa QueryFilter, 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 (p. 828) 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.

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:

AttributeValueList: uno o ms valores que se evaluarn respecto al atributo suministrado. El


nmero de valores de la lista depende del operador especificado en ComparisonOperator.

Para el tipo Number, las comparaciones de los valores son numricas.

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.

Estn disponibles los siguientes operadores de comparacin:

EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS |


BEGINS_WITH | IN | BETWEEN

Use FilterExpression en su lugar


Supongamos que desea consultar la tabla Music, pero quiere aplicar una condicin a los elementos antes
de que se devuelvan. Podra usar una solicitud Query con un parmetro QueryFilter como en este
ejemplo de la AWS CLI:

aws dynamodb query \


--table-name Music \
--key-conditions '{
"Artist": {
"ComparisonOperator": "EQ",
"AttributeValueList": [ {"S": "No One You Know"} ]
}
}' \
--query-filter '{
"Price": {
"ComparisonOperator": "GT",
"AttributeValueList": [ {"N": "1.00"} ]
}
}'

Pero, en su lugar, podra usar una expresin FilterExpression:

API Version 2012-08-10


834
Amazon DynamoDB Developer Guide
ScanFilter

aws dynamodb query \


--table-name Music \
--key-condition-expression 'Artist = :a' \
--filter-expression 'Price > :p' \
--expression-attribute-values '{
":p": {"N":"1.00"},
":a": {"S":"No One You Know"}
}'

ScanFilter
En una operacin Scan, ScanFilter es una condicin que evala los resultados del examen y devuelve
nicamente los valores deseados.
Note

Este parmetro no es compatible con atributos de tipo List o Map.

Si especifica ms de una condicin en el mapa ScanFilter, 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 (p. 828) 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.

Cada entrada ScanFilter consta de un nombre de atributo que se va a comparar, junto con lo siguiente:

AttributeValueList: uno o ms valores que se evaluarn respecto al atributo suministrado. El


nmero de valores de la lista depende del operador especificado en ComparisonOperator.

Para el tipo Number, las comparaciones de los valores son numricas.

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.

Estn disponibles los siguientes operadores de comparacin:

EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS |


BEGINS_WITH | IN | BETWEEN

Use FilterExpression en su lugar


Supongamos que desea examinar la tabla Music, pero quiere aplicar una condicin a los elementos
antes de que se devuelvan. Podra usar una solicitud Scan con un parmetro ScanFilter como en este
ejemplo de la AWS CLI:

aws dynamodb scan \


--table-name Music \
--scan-filter '{
"Genre":{
API Version 2012-08-10
835
Amazon DynamoDB Developer Guide
Escritura de condiciones con parmetros heredados

"AttributeValueList":[ {"S":"Rock"} ],
"ComparisonOperator": "EQ"
}
}'

Pero, en su lugar, podra usar una expresin FilterExpression:

aws dynamodb scan \


--table-name Music \
--filter-expression 'Genre = :g' \
--expression-attribute-values '{
":g": {"S":"Rock"}
}'

Escritura de condiciones con parmetros heredados


En la siguiente seccin se describe cmo escribir condiciones para usarlas con parmetros heredados,
tales como Expected, QueryFilter y ScanFilter.
Note

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:

ComparisonOperator: mayor que, menor que, igual que, etc.


AttributeValueList (opcional): valor o valores de atributo respecto a los que se va a establecer la
comparacin. Segn cul esa el operador ComparisonOperator utilizado, AttributeValueList
puede contener uno, dos o ms valores; o puede omitirse.

En las siguientes secciones se describen los distintos operadores de comparacin, adems de ejemplos
de cmo utilizarlos en las condiciones.

Operadores de comparacin sin valores de atributos


NOT_NULL: es true si un atributo existe.
NULL: es true si un atributo no existe.

Utilice estos operadores para comprobar si un atributo existe o no. Dado que no hay ningn valor que
comparar, no especifique AttributeValueList.

Ejemplo

La siguiente expresin se evala en true si el atributo Dimensions existe.

...
"Dimensions": {
ComparisonOperator: "NOT_NULL"
}
...

API Version 2012-08-10


836
Amazon DynamoDB Developer Guide
Escritura de condiciones con parmetros heredados

Operadores de comparacin con un valor de atributo


EQ: es true si un atributo 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. 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.

API Version 2012-08-10


837
Amazon DynamoDB Developer Guide
Escritura de condiciones con parmetros heredados

Ejemplos

Las siguientes expresiones se evalan en true si:

El precio de un producto es mayor que 100.

...
"Price": {
ComparisonOperator: "GT",
AttributeValueList: [ {"N":100"} ]
}
...

La categora de un producto comienza con "Bo".

...
"ProductCategory": {
ComparisonOperator: "BEGINS_WITH",
AttributeValueList: [ {"S":"Bo"} ]
}
...

Un producto est disponible en rojo, verde o negro:

...
"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.

Operadores de comparacin con dos valores de atributos


BETWEEN: es true si un valor est comprendido entre un lmite inferior y un lmite superior, ambos
incluidos.

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": {

API Version 2012-08-10


838
Amazon DynamoDB Developer Guide
Escritura de condiciones con parmetros heredados

ComparisonOperator: "BETWEEN",
AttributeValueList: [ {"N":"100"}, {"N":"200"} ]
}
...

Operadores de comparacin con N valores de atributos


IN: es true si un valor es igual que cualquiera de los valores de una lista. Solo se admiten valores
escalares en la lista, no conjuntos. El atributo de destino debe ser del mismo tipo y valor exactos para
que se produzca la coincidencia.

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

La siguiente expresin se evala en true si el valor de Id es 201, 203 o 205.

...
"Id": {
ComparisonOperator: "IN",
AttributeValueList: [ {"N":"201"}, {"N":"203"}, {"N":"205"} ]
}
...

Uso de varias condiciones


DynamoDB permite combinar varias condiciones para crear expresiones complejas. Para ello, hay que
proporcionar al menos dos expresiones, con un ConditionalOperator (p. 828) opcional.

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"} ]
}

API Version 2012-08-10


839
Amazon DynamoDB Developer Guide
Escritura de condiciones con parmetros heredados

...

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.

Otros operadores condicionales


En versiones anteriores de DynamoDB, el parmetro Expected se comportaba de forma distinta para las
escrituras condicionales. Cada elemento del mapa Expected representaba un nombre de atributo que
DynamoDB deba comprobar, adems de lo siguiente:

Value: valor que se va a comparar con el atributo.


Exists: determina si el valor existe antes de intentar la operacin.

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

API Version 2012-08-10


840
Amazon DynamoDB Developer Guide
Escritura de condiciones con parmetros heredados

AttributeValueList en su lugar, porque estas opciones permiten construir un abanico de condiciones


mucho ms amplio.

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:

aws dynamodb delete-item \


--table-name ProductCatalog \
--key '{
"Id": {"N":"600"}
}' \
--expected '{
"InPublication": {
"Exists": true,
"Value": {"BOOL":false}
}
}'

En el siguiente ejemplo se realiza la misma operacin, pero sin la condicin heredada:

aws dynamodb delete-item \


--table-name ProductCatalog \
--key '{
"Id": {"N":"600"}
}' \
--expected '{
"InPublication": {
"ComparisonOperator": "EQ",
"AttributeValueList": [ {"BOOL":false} ]
}
}'

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:

aws dynamodb put-item \


--table-name ProductCatalog \
--item '{
"Id": {"N":"500"},
"Title": {"S":"Book 500 Title"}
}' \
--expected '{
"Id": { "Exists": false }
}'

En el siguiente ejemplo se realiza la misma operacin, pero sin la condicin heredada:

aws dynamodb put-item \


--table-name ProductCatalog \
--item '{
"Id": {"N":"500"},
"Title": {"S":"Book 500 Title"}

API Version 2012-08-10


841
Amazon DynamoDB Developer Guide
Versin actual del API de bajo nivel (2012-08-10)

}' \
--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.

Versin actual del API de bajo nivel (2012-08-10)


La versin actual del API de bajo nivel de DynamoDB es 2012-08-10. Para ver la documentacin completa,
consulte la Amazon DynamoDB API Reference.

Se admiten las siguientes operaciones:

BatchGetItem
BatchWriteItem
CreateTable
DeleteItem
DeleteTable
DescribeLimits
DescribeTable
DescribeTimeToLive
GetItem
ListTables
ListTagsOfResource
PutItem
Query
Scan
TagResource
UpdateItem
UpdateTable
UpdateTimeToLive
UntagResource

Versin anterior del API de bajo nivel (2011-12-05)


En esta seccin se documentan las operaciones disponibles en la versin anterior del API de bajo nivel
de DynamoDB (2011-12-05). Esta versin del API de bajo nivel se mantiene para ofrecer compatibilidad
retroactiva con las aplicaciones existentes.

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).

API Version 2012-08-10


842
Amazon DynamoDB Developer Guide
BatchGetItem

Note

Recomendamos migrar las aplicaciones existentes a la versin ms reciente del API


(2012-08-10), porque las nuevas caractersticas de DynamoDB no se podrn aplicar
retroactivamente en la versin anterior del API.

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

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 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.

Si no se puede procesar ningn elemento porque no hay desempeo provisionado


suficiente en cada una de las tablas objeto de la solicitud, DynamoDB devuelve un error
ProvisionedThroughputExceededException.
Note

De forma predeterminada, BatchGetItem realiza lecturas consistentes finales en cada tabla


incluida en la solicitud. Si desea realizar en su lugar lecturas consistentes, puede establecer el
parmetro ConsistentRead en true para cada tabla.

API Version 2012-08-10


843
Amazon DynamoDB Developer Guide
BatchGetItem

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"]
}
}
}

Nombre Descripcin Obligatorio

RequestItems Contenedor del nombre S


de la tabla y los elementos
correspondientes que se deben
obtener segn su clave principal.
Mientras se solicitan elementos,
cada nombre de tabla puede
invocarse solo una vez por
operacin.

Tipo: String

Valor predeterminado: None

Table Nombre de la tabla que S


contiene los elementos que
hay que obtener. La entrada es
simplemente una cadena que
especifica una tabla existente sin
ninguna etiqueta.

Tipo: String

API Version 2012-08-10


844
Amazon DynamoDB Developer Guide
BatchGetItem

Nombre Descripcin Obligatorio


Valor predeterminado: None

Table:Keys Valores de clave principal que S


definen los elementos de la
tabla especificada. Para obtener
ms informacin sobre claves
principales, consulte Clave
principal (p. 6).

Tipo: Keys

Table:AttributesToGet Matriz de nombres de No


atributos contenidos en la
tabla especificada. Si no se
especifican sus nombres, se
devuelven todos los atributos. Si
algn atributo no se encuentra,
no aparecer en los resultados.

Tipo: Array

Table:ConsistentRead Si se establece en true, se No


emite una lectura consistente;
en caso contrario, se utiliza una
lectura consistente final.

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"]}

API Version 2012-08-10


845
Amazon DynamoDB Developer Guide
BatchGetItem

}],
"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

Responses Nombres de tablas y los atributos de los elementos


respectivos de las tablas.

Tipo: Map

Table Nombre de la tabla que contiene los elementos. La


entrada es simplemente una cadena que especifica
la tabla existente sin ninguna etiqueta.

Tipo: String

Items Contenedor de los nombres y valores de los


atributos que coinciden con los parmetros de la
operacin.

Tipo: Map, mapa de los nombres de atributos y sus


tipos de datos y valores.

ConsumedCapacityUnits Nmero de unidades de capacidad de lectura


consumidas para cada tabla. Este valor muestra el
nmero aplicado al desempeo provisionado. Las
solicitudes de elementos inexistentes consumen
las unidades de capacidad de lectura mnimas,
segn el tipo de lectura. Para obtener ms
informacin, consulte Ajustes de desempeo de
lecturas y escrituras (p. 305).

Tipo: Number

UnprocessedKeys Contiene una matriz de tablas y sus respectivos


claves que no se han procesado en la respuesta
actual, posiblemente debido a que se ha alcanzado
un lmite de tamao de respuesta. El valor de
UnprocessedKeys tiene el mismo formato que
el parmetro RequestItems (por lo que se
puede proporcionar directamente a una operacin
BatchGetItem posterior). Para obtener ms
informacin, consulte el parmetro RequestItems
anterior.

Tipo: Array

UnprocessedKeys: Table: Keys Valores de los atributos de clave principal que


definen los elementos y los atributos asociados
con los elementos. Para obtener ms informacin

API Version 2012-08-10


846
Amazon DynamoDB Developer Guide
BatchGetItem

Nombre Descripcin
sobre claves principales, consulte Clave
principal (p. 6).

Tipo: Array; matriz de pares de nombre-valor del


atributo.

UnprocessedKeys: Table: AttributesToGet Nombres de los atributos contenidos en la tabla


especificada. Si no se especifican sus nombres, se
devuelven todos los atributos. Si algn atributo no
se encuentra, no aparecer en los resultados.

Tipo: Array, matriz de nombres de atributos.

UnprocessedKeys: Table: ConsistentRead Si se establece en true, se utiliza una lectura


consistente para la tabla especificada; en caso
contrario, se utiliza una lectura consistente final.

Tipo: booleano.

Errores especiales

Error Descripcin

ProvisionedThroughputExceededException Se ha superado el desempeo provisionado


mximo permitido.

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.

// 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
content-length: 409

{"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"]}
}

API Version 2012-08-10


847
Amazon DynamoDB Developer Guide
BatchWriteItem

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).

Cuando utilice BatchWriteItem, tenga en cuenta las siguientes limitaciones:

API Version 2012-08-10


848
Amazon DynamoDB Developer Guide
BatchWriteItem

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:

Si una o varias tablas especificados en la solicitud BatchWriteItem no existe.


Si los atributos de clave principal especificados en un elemento de la solicitud no coinciden con el
esquema de clave principal de la tabla correspondiente.
Si intenta realizar varias operaciones con el mismo elemento en la misma solicitud BatchWriteItem.
Por ejemplo, no puede colocar y eliminar el mismo elemento en la misma solicitud BatchWriteItem.
Si el tamao total de la solicitud supera el lmite de tamao de solicitud de 1MB (la carga de HTTP).
Si cualquier elemento individual de un lote supera el lmite de tamao de elemento de 64KB.

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, ... ],

API Version 2012-08-10


849
Amazon DynamoDB Developer Guide
BatchWriteItem

...
}

Request ::=
PutRequest | DeleteRequest

PutRequest ::=
{
"PutRequest" : {
"Item" : {
"Attribute-Name1" : Attribute-Value,
"Attribute-Name2" : Attribute-Value,
...
}
}
}

DeleteRequest ::=
{
"DeleteRequest" : {
"Key" : PrimaryKey-Value
}
}

PrimaryKey-Value ::= HashTypePK | HashAndRangeTypePK

HashTypePK ::=
{
"HashKeyElement" : Attribute-Value
}

HashAndRangeTypePK
{
"HashKeyElement" : Attribute-Value,
"RangeKeyElement" : Attribute-Value,
}

Attribute-Value ::= String | Numeric| Binary | StringSet | NumericSet | BinarySet

Numeric ::=
{
"N": "Number"
}

String ::=
{
"S": "String"
}

Binary ::=
{
"B": "Base64 encoded binary data"
}

StringSet ::=
{
"SS": [ "String1", "String2", ... ]
}

NumberSet ::=
{
"NS": [ "Number1", "Number2", ... ]
}

BinarySet ::=

API Version 2012-08-10


850
Amazon DynamoDB Developer Guide
BatchWriteItem

{
"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:

Colocar un elemento y eliminar un elemento de la tabla Reply


Colocar un elemento en la tabla 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

API Version 2012-08-10


851
Amazon DynamoDB Developer Guide
BatchWriteItem

{
"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

API Version 2012-08-10


852
Amazon DynamoDB Developer Guide
CreateTable

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.

Use la operacin DescribeTables (p. 865) para comprobar el estado de la tabla.

Solicitudes
Sintaxis

// This header is abbreviated.

API Version 2012-08-10


853
Amazon DynamoDB Developer Guide
CreateTable

// For a sample of a complete header, see API de bajo nivel de DynamoDB.


POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.CreateTable
content-type: application/x-amz-json-1.0

{"TableName":"Table1",
"KeySchema":
{"HashKeyElement":{"AttributeName":"AttributeName1","AttributeType":"S"},
"RangeKeyElement":{"AttributeName":"AttributeName2","AttributeType":"N"}},
"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":10}
}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que se va a S


crear.

Los caracteres permitidos son


a-z, A-Z, 0-9, "_" (guion bajo),
"-" (guion) y "." (punto). Los
nombres pueden tener de 3 a
255 caracteres de longitud.

Tipo: String

KeySchema Estructura de la clave principal S


(simple o compuesta) de la tabla.
Se requiere un par de nombre-
valor de HashKeyElement,
pero el par de nombre-valor de
RangeKeyElement es opcional
(solo es obligatorio para las
claves principales compuestas).
Para obtener ms informacin
sobre claves principales, consulte
Clave principal (p. 6).

Los nombres de elemento de


clave principal pueden tener
entre 1 y 255caracteres y
no tienen restricciones de
caracteres.

Los valores posibles de


AttributeType son "S" (cadena),
"N" (numrico) o "B" (binario).

Tipo: Map, mapa de


HashKeyElement, o bien
de HashKeyElement y de
RangeKeyElement si se
trata de una clave principal
compuesta.

ProvisionedThroughput Nuevo desempeo de la S


tabla especificada, que se
compone de los valores de
ReadCapacityUnits y
WriteCapacityUnits. Para

API Version 2012-08-10


854
Amazon DynamoDB Developer Guide
CreateTable

Nombre Descripcin Obligatorio


obtener ms informacin,
consulte Ajustes de desempeo
de lecturas y escrituras (p. 305).
Note

Para obtener los


valores mnimo y
mximo actuales,
consulte Lmites en
DynamoDB (p. 765).

Tipo: Array

ProvisionedThroughput: Establece el nmero mnimo de S


ReadCapacityUnits unidades ReadCapacityUnits
consistentes consumidas
por segundo para la tabla
especificada antes de
DynamoDB equilibre la carga con
otras operaciones.

Las operaciones de lectura


consistente final requieren menos
esfuerzo que una operacin
de lectura consistente; por lo
tanto, un ajuste de 50unidades
ReadCapacityUnits
consistentes por
segundo proporciona
100unidades de capacidad
ReadCapacityUnits
consistentes finales por segundo.

Tipo: Number

ProvisionedThroughput: Establece el nmero S


WriteCapacityUnits mnimo de unidades
WriteCapacityUnits
consumidas por segundo para
la tabla especificada antes de
DynamoDB equilibre la carga con
otras operaciones.

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

API Version 2012-08-10


855
Amazon DynamoDB Developer Guide
CreateTable

{"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

TableDescription Contenedor de propiedades de la tabla.

CreationDateTime Fecha en que se cre la tabla en formato de


tiempo UNIX.

Tipo: Number

KeySchema Estructura de la clave principal (simple o


compuesta) de la tabla. Se requiere un par de
nombre-valor de HashKeyElement, pero el par de
nombre-valor de RangeKeyElement es opcional
(solo es obligatorio para las claves principales
compuestas). Para obtener ms informacin sobre
claves principales, consulte Clave principal (p. 6).

Tipo: Map, mapa de HashKeyElement, o bien de


HashKeyElement y de RangeKeyElement si se
trata de una clave principal compuesta.

ProvisionedThroughput Desempeo de la tabla especificada, que se


compone de los valores de ReadCapacityUnits
y WriteCapacityUnits. Consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

Tipo: Array

ProvisionedThroughput Nmero mnimo de ReadCapacityUnits


:ReadCapacityUnits consumidas por segundo antes de que DynamoDB
equilibre la carga con otras operaciones.

Tipo: Number

ProvisionedThroughput Nmero mnimo de ReadCapacityUnits


:WriteCapacityUnits consumidas por segundo antes de que
WriteCapacityUnits equilibre la carga con
otras operaciones.

Tipo: Number

TableName Nombre de la tabla creada.

Tipo: String

TableStatus Estado actual de la tabla (CREATING). Una vez que


la tabla adquiere el estado ACTIVE, puede colocar
datos en ella.

API Version 2012-08-10


856
Amazon DynamoDB Developer Guide
CreateTable

Nombre Descripcin
Use el API DescribeTables (p. 865) para
comprobar el estado de la tabla.

Tipo: String

Errores especiales

Error Descripcin

ResourceInUseException Se intent volver a crear una tabla que ya exista.

LimitExceededException El nmero de solicitudes simultneas para la


tabla (nmero acumulado de tablas que se
encuentren en los estados CREATING, DELETING
o UPDATING) supera el mximo permitido.
Note

Para obtener los valores mnimo y


mximo actuales, consulte Lmites en
DynamoDB (p. 765).
.

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

// 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.CreateTable
content-type: application/x-amz-json-1.0

{"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":

API Version 2012-08-10


857
Amazon DynamoDB Developer Guide
DeleteItem

{"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

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
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

// 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.DeleteItem
content-type: application/x-amz-json-1.0

{"TableName":"Table1",
"Key":
{"HashKeyElement":{"S":"AttributeValue1"},"RangeKeyElement":
{"N":"AttributeValue2"}},
"Expected":{"AttributeName3":{"Value":{"S":"AttributeValue3"}}},
"ReturnValues":"ALL_OLD"}
}

API Version 2012-08-10


858
Amazon DynamoDB Developer Guide
DeleteItem

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que contiene S


el elemento que se va a eliminar.

Tipo: String

Key Clave principal que define S


el elemento. Para obtener
ms informacin sobre claves
principales, consulte Clave
principal (p. 6).

Tipo: Map, mapa de


HashKeyElement a su valor y
RangeKeyElement a su valor.

Expected Designa un atributo para una No


eliminacin condicional. El
parmetro Expected permite
proporcionar un nombre de
atributo e indicar si DynamoDB
debe comprobar si el atributo
tiene un valor determinado antes
de eliminarlo.

Tipo: Map, mapa de nombres de


atributos.

Expected:AttributeName Nombre del atributo para la No


operacin Put condicional.

Tipo: String

Expected:AttributeName: Use este parmetro para No


ExpectedAttributeValue especificar si ya existe un valor
del par de nombre-valor del
atributo.

En la siguiente notacin JSON,


se elimina el elemento si todava
no existe el atributo "Color" para
ese elemento:

"Expected" :
{"Color":{"Exists":false}}

En la siguiente notacin JSON


se comprueba si el atributo
denominado "Color" tiene el valor
"Yellow" antes de eliminar el
elemento:

"Expected" :
{"Color":{"Exists":true},
{"Value":{"S":"Yellow"}}}

API Version 2012-08-10


859
Amazon DynamoDB Developer Guide
DeleteItem

Nombre Descripcin Obligatorio


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.

ReturnValues Use este parmetro si desea No


obtener los pares de nombre-
valor de los atributos antes de
eliminarlos. Los valores posibles
de los parmetros son NONE
(predeterminado) o ALL_OLD.
Si se especifica ALL_OLD,
se devuelve el contenido del
elemento anterior. Si este
parmetro no se proporciona o si
su valor es NONE, no se devuelve
nada.

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
}

API Version 2012-08-10


860
Amazon DynamoDB Developer Guide
DeleteItem

Nombre Descripcin

Attributes Si el parmetro ReturnValues se suministra


como ALL_OLD en la solicitud, DynamoDB
devuelve una matriz de pares de nombre-valor del
atributo (es decir, el elemento eliminado). De lo
contrario, la respuesta contiene un conjunto vaco.

Tipo: Array; matriz de pares de nombre-valor del


atributo.

ConsumedCapacityUnits Nmero de unidades de capacidad de escritura


consumidas por la operacin. Este valor muestra el
nmero aplicado al desempeo provisionado. Cada
solicitud de eliminacin de elementos inexistentes
consume una unidad de capacidad de escritura.
Para obtener ms informacin, consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

Tipo: Number

Errores especiales

Error Descripcin

ConditionalCheckFailedException Error en la comprobacin condicional. No se


encontr un valor de atributo esperado.

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.DeleteItem
content-type: application/x-amz-json-1.0

{"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

API Version 2012-08-10


861
Amazon DynamoDB Developer Guide
DeleteTable

{"Attributes":
{"friends":{"SS":["Dooley","Ben","Daisy"]},
"status":{"S":"shopping"},
"time":{"N":"200"},
"user":{"S":"Mingus"}
},
"ConsumedCapacityUnits":1
}

Acciones relacionadas
PutItem (p. 872)

DeleteTable
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 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.

Use la operacin DescribeTables (p. 865) para comprobar el estado de la tabla.

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.DeleteTable
content-type: application/x-amz-json-1.0

{"TableName":"Table1"}

API Version 2012-08-10


862
Amazon DynamoDB Developer Guide
DeleteTable

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que se va a S


eliminar.

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

TableDescription Contenedor de propiedades de la tabla.

CreationDateTime Fecha de creacin de la tabla.

Tipo: Number

KeySchema Estructura de la clave principal (simple o


compuesta) de la tabla. Se requiere un par de
nombre-valor de HashKeyElement, pero el par de
nombre-valor de RangeKeyElement es opcional
(solo es obligatorio para las claves principales
compuestas). Para obtener ms informacin sobre
claves principales, consulte Clave principal (p. 6).

Tipo: Map, mapa de HashKeyElement, o bien de


HashKeyElement y de RangeKeyElement si se
trata de una clave principal compuesta.

ProvisionedThroughput Desempeo de la tabla especificada, que se


compone de los valores de ReadCapacityUnits
y WriteCapacityUnits. Consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

ProvisionedThroughput: Nmero mnimo de unidades


ReadCapacityUnits ReadCapacityUnits consumidas por segundo
para la tabla especificada antes de DynamoDB
equilibre la carga con otras operaciones.

API Version 2012-08-10


863
Amazon DynamoDB Developer Guide
DeleteTable

Nombre Descripcin
Tipo: Number

ProvisionedThroughput: Nmero mnimo de unidades


WriteCapacityUnits WriteCapacityUnits consumidas por segundo
para la tabla especificada antes de DynamoDB
equilibre la carga con otras operaciones.

Tipo: Number

TableName Nombre de la tabla eliminada.

Tipo: String

TableStatus Estado actual de la tabla (DELETING). Una vez que


se elimina la tabla, las solicitudes posteriores de la
tabla devuelven resource not found.

Use la operacin DescribeTables (p. 865) para


comprobar el estado de la tabla.

Tipo: String

Errores especiales

Error Descripcin

ResourceInUseException La tabla se encuentra en el estado CREATING o


UPDATING y no se puede eliminar.

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"}},

API Version 2012-08-10


864
Amazon DynamoDB Developer Guide
DescribeTables

"TableName":"favorite-movies-table",
"TableStatus":"DELETING"
}

Acciones relacionadas
CreateTable (p. 853)
DescribeTables (p. 865)

DescribeTables
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
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

// 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.DescribeTable
content-type: application/x-amz-json-1.0

{"TableName":"Table1"}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que se S


describe.

Tipo: String

Respuestas
Sintaxis

HTTP/1.1 200
x-amzn-RequestId: 8966d095-71e9-11e0-a498-71d736f27375
content-type: application/x-amz-json-1.0

API Version 2012-08-10


865
Amazon DynamoDB Developer Guide
DescribeTables

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

Table Contenedor de la tabla que se describe.

Tipo: String

CreationDateTime Fecha en que se cre la tabla en formato de


tiempo UNIX.

ItemCount Nmero de elementos de la tabla especificada.


DynamoDB actualiza este valor aproximadamente
cada seis horas. Los cambios recientes podran no
reflejarse en este valor.

Tipo: Number

KeySchema Estructura de la clave principal (simple o


compuesta) de la tabla. Se requiere un par de
nombre-valor de HashKeyElement, pero el par de
nombre-valor de RangeKeyElement es opcional
(solo es obligatorio para las claves principales
compuestas). El tamao mximo de la clave hash
es de 2048bytes. El tamao mximo de la clave
de rango es de 1024bytes. Ambos lmites se
aplican por separado (es decir, puede disponer
de una clave combinada de rango y hash de
2048+1024). Para obtener ms informacin sobre
claves principales, consulte Clave principal (p. 6).

ProvisionedThroughput Desempeo de la tabla especificada, que consta


de los valores de LastIncreaseDateTime (si
procede), LastDecreaseDateTime (si procede),
ReadCapacityUnits y WriteCapacityUnits.
Si el desempeo de la tabla no se ha aumentado ni
disminuido, DynamoDB no devuelve valores para
estos elementos. Consulte Ajustes de desempeo
de lecturas y escrituras (p. 305).

Tipo: Array

TableName Nombre de la tabla solicitada.

Tipo: String

API Version 2012-08-10


866
Amazon DynamoDB Developer Guide
DescribeTables

Nombre Descripcin

TableSizeBytes Tamao total de la tabla especificada, en bytes.


DynamoDB actualiza este valor aproximadamente
cada seis horas. Los cambios recientes podran no
reflejarse en este valor.

Tipo: Number

TableStatus Estado actual de la tabla (CREATING, ACTIVE,


DELETING o UPDATING). Una vez que la tabla
adquiere el estado ACTIVE, puede agregarle
datos.

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

// 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.DescribeTable
content-type: application/x-amz-json-1.0

{"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)

API Version 2012-08-10


867
Amazon DynamoDB Developer Guide
GetItem

DeleteTable (p. 862)


ListTables (p. 870)

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

// 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.GetItem
content-type: application/x-amz-json-1.0

{"TableName":"Table1",
"Key":
{"HashKeyElement": {"S":"AttributeValue1"},
"RangeKeyElement": {"N":"AttributeValue2"}
},
"AttributesToGet":["AttributeName3","AttributeName4"],
"ConsistentRead":Boolean
}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que contiene S


el elemento solicitado.

Tipo: String

Key Valores de clave principal S


que definen el elemento. Para
obtener ms informacin sobre
claves principales, consulte
Clave principal (p. 6).

Tipo: Map, mapa de


HashKeyElement a su valor y
RangeKeyElement a su valor.

API Version 2012-08-10


868
Amazon DynamoDB Developer Guide
GetItem

Nombre Descripcin Obligatorio

AttributesToGet Matriz de nombres de atributo. Si No


no se especifican sus nombres,
se devuelven todos los atributos.
Si algn atributo no se encuentra,
no aparecer en los resultados.

Tipo: Array

ConsistentRead Si se establece en true, se No


emite una lectura consistente;
en caso contrario, se utiliza una
lectura consistente final.

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

Item Contiene los atributos solicitados.

Tipo: Map, mapa de pares de nombre-valor del


atributo.

ConsumedCapacityUnits Nmero de unidades de capacidad de lectura


consumidas por la operacin. Este valor muestra el
nmero aplicado al desempeo provisionado. Las
solicitudes de elementos inexistentes consumen
las unidades de capacidad de lectura mnimas,
segn el tipo de lectura. Para obtener ms
informacin, consulte Ajustes de desempeo de
lecturas y escrituras (p. 305).

Tipo: Number

Errores especiales
No hay errores especficos de esta operacin.

API Version 2012-08-10


869
Amazon DynamoDB Developer Guide
ListTables

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.GetItem
content-type: application/x-amz-json-1.0

{"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

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
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

API Version 2012-08-10


870
Amazon DynamoDB Developer Guide
ListTables

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

// 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.ListTables
content-type: application/x-amz-json-1.0

{"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.

Nombre Descripcin Obligatorio

Limit Nmero mximo de nombres de No


tabla que se devolvern.

Tipo: Nmero entero

ExclusiveStartTableName Nombre de la primera tabla de No


la lista. Si ya se ha ejecutado
una operacin ListTables
y se ha recibido un valor
LastEvaluatedTableName en
la respuesta, use ese valor aqu
para continuar la lista.

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

TableNames Nombres de las tablas asociadas con la cuenta


actual en el punto de enlace actual.

Tipo: Array

API Version 2012-08-10


871
Amazon DynamoDB Developer Guide
PutItem

Nombre Descripcin

LastEvaluatedTableName Nombre de la ltima tabla de la lista actual, pero


solo si no se han devuelto algunas tablas de
la cuenta y el punto de enlace. Este valor no
existe en una respuesta si ya se han devuelto
los nombres de todas las tablas. Use este valor
en ExclusiveStartTableName en una nueva
solicitud para continuar la lista hasta que se hayan
devuelto los nombres de todas las tablas.

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

// 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.ListTables
content-type: application/x-amz-json-1.0

{"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

Esta seccin se refiere a la versin 2011-12-05 del API, que est


obsoleta y no debe utilizarse para nuevas aplicaciones.

API Version 2012-08-10


872
Amazon DynamoDB Developer Guide
PutItem

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"}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que S


contendr el elemento.

Tipo: String

Item Mapa de los atributos del S


elemento, que debe incluir
los valores de clave principal
que definen el elemento. Se
pueden indicar otros pares de
nombre-valor de los atributos
del elemento. Para obtener
ms informacin sobre claves
principales, consulte Clave
principal (p. 6).

API Version 2012-08-10


873
Amazon DynamoDB Developer Guide
PutItem

Nombre Descripcin Obligatorio


Tipo: Map, mapa de los nombres
de atributos a los valores de
atributos.

Expected Designa un atributo para una No


colocacin condicional. El
parmetro Expected permite
proporcionar un nombre de
atributo e indicar si DynamoDB
debe comprobar si el valor del
atributo ya existe; o bien si el
valor del atributo existe y tiene
un valor determinado antes de
cambiarlo.

Tipo: Map, mapa de nombres


de un atributo a valores de un
atributo e indicacin de si existe.

Expected:AttributeName Nombre del atributo para la No


operacin Put condicional.

Tipo: String

API Version 2012-08-10


874
Amazon DynamoDB Developer Guide
PutItem

Nombre Descripcin Obligatorio

Expected:AttributeName: Use este parmetro para No


ExpectedAttributeValue especificar si ya existe un valor
del par de nombre-valor del
atributo.

En la siguiente notacin JSON,


se sustituye el elemento si
todava no existe el atributo
"Color" para ese elemento:

"Expected" :
{"Color":{"Exists":false}}

En la siguiente notacin JSON


se comprueba si el atributo
denominado "Color" tiene el valor
"Yellow" antes de sustituir el
elemento:

"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.

API Version 2012-08-10


875
Amazon DynamoDB Developer Guide
PutItem

Nombre Descripcin Obligatorio

ReturnValues Use este parmetro si desea No


obtener los pares de nombre-
valor de los atributos antes de
actualizarlos mediante la solicitud
PutItem. Los valores posibles
de los parmetros son NONE
(predeterminado) o ALL_OLD.
Si se especifica ALL_OLD y
PutItem ha sobrescrito un par
de nombre-valor del atributo,
se devuelve el contenido del
elemento anterior. Si este
parmetro no se proporciona o si
su valor es NONE, no se devuelve
nada.

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

Attributes Valores de los atributos antes de la operacin


de colocacin, pero solamente si el parmetro
ReturnValues se especifica como ALL_OLD en la
solicitud.

Tipo: Map, mapa de pares de nombre-valor del


atributo.

ConsumedCapacityUnits Nmero de unidades de capacidad de escritura


consumidas por la operacin. Este valor muestra
el nmero aplicado al desempeo provisionado.
Para obtener ms informacin, consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

API Version 2012-08-10


876
Amazon DynamoDB Developer Guide
PutItem

Nombre Descripcin
Tipo: Number

Errores especiales

Error Descripcin

ConditionalCheckFailedException Error en la comprobacin condicional. No se


encontr un valor de atributo esperado.

ResourceNotFoundException No se encontr el elemento o atributo especificado.

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)

API Version 2012-08-10


877
Amazon DynamoDB Developer Guide
Consulta

GetItem (p. 868)


BatchGetItem (p. 843)

Consulta
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
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

// 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":"Table1",
"Limit":2,
"ConsistentRead":true,
"HashKeyValue":{"S":"AttributeValue1":},
"RangeKeyCondition": {"AttributeValueList":
[{"N":"AttributeValue2"}],"ComparisonOperator":"GT"}
"ScanIndexForward":true,
"ExclusiveStartKey":{
"HashKeyElement":{"S":"AttributeName1"},
"RangeKeyElement":{"N":"AttributeName2"}
},

API Version 2012-08-10


878
Amazon DynamoDB Developer Guide
Consulta

"AttributesToGet":["AttributeName1", "AttributeName2", "AttributeName3"]},


}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que contiene S


los elementos solicitados.

Tipo: String

AttributesToGet Matriz de nombres de atributo. Si No


no se especifican sus nombres,
se devuelven todos los atributos.
Si algn atributo no se encuentra,
no aparecer en los resultados.

Tipo: Array

Limit Nmero mximo de elementos No


que se devolvern, que no es
necesariamente el nmero de
elementos coincidentes. Si
DynamoDB alcanza el lmite
del nmero de elementos
mientras consulta la tabla,
detiene la consulta y devuelve
los valores coincidentes hasta
ese punto, junto con el valor de
LastEvaluatedKey, que puede
aplicarse en una operacin
ulterior para continuar con la
consulta. Adems, si el tamao
del conjunto de resultados
supera 1MB antes de que
DynamoDB alcance este lmite,
detiene la consulta y devuelve los
valores coincidentes, junto con el
valor de LastEvaluatedKey,
que puede aplicarse en una
operacin ulterior para continuar
con la consulta.

Tipo: Number

ConsistentRead Si se establece en true, se No


emite una lectura consistente;
en caso contrario, se utiliza una
lectura consistente final.

Tipo: booleano

Count Si se establece en true, No


DynamoDB devuelve el nmero
total de elementos que coinciden
con los parmetros de la
consulta, en lugar de una lista
de elementos coincidentes y
sus atributos. Puede aplicar el

API Version 2012-08-10


879
Amazon DynamoDB Developer Guide
Consulta

Nombre Descripcin Obligatorio


parmetro Limit a las consultas
que son solo de recuento.

No establezca Count en true


si proporciona una lista de
AttributesToGet; si lo hiciera,
DynamoDB devolvera un error
de validacin. Para obtener
ms informacin, consulte
Recuento de los elementos de
los resultados (p. 430).

Tipo: booleano

HashKeyValue Valor de atributo del componente S


hash de la clave principal
compuesta.

Tipo: String, Number o Binary

RangeKeyCondition Contenedor de los valores No


de los atributos y operadores
de comparacin que se
usarn en la consulta. Una
solicitud de consulta no
requiere una condicin
RangeKeyCondition. Si
se proporciona solo el valor
HashKeyValue, DynamoDB
devuelve todos los elementos
que tienen el valor especificado
de clave hash.

Tipo: Map

RangeKeyCondition: Valores de los atributos que No


AttributeValueList se van a evaluar para los
parmetros de la consulta. La
lista AttributeValueList
contiene un solo valor
de atributo, a no ser
que se especifique una
comparacin BETWEEN. Para la
comparacin BETWEEN, la lista
AttributeValueList contiene
dos valores de atributos.

Tipo: Map, mapa de


AttributeValue a un
ComparisonOperator.

API Version 2012-08-10


880
Amazon DynamoDB Developer Guide
Consulta

Nombre Descripcin Obligatorio

RangeKeyCondition: Criterios para evaluar los No


ComparisonOperator atributos proporcionados, tales
como igual que, mayor que, etc.
A continuacin se muestran los
operadores de comparacin
vlidos para una operacin
Query.
Note

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.

Tipo: String o Binary

EQ: igual que.

Para EQ, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco es igual que {"NS":
["6", "2", "1"]}.

API Version 2012-08-10


881
Amazon DynamoDB Developer Guide
Consulta

Nombre Descripcin Obligatorio

LE: menor o igual que.

Para LE, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco se compara con
{"NS":["6", "2", "1"]}.

LT : Menor que.

Para LT, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco se compara con
{"NS":["6", "2", "1"]}.

GE: mayor o igual que.

Para GE, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco se compara con
{"NS":["6", "2", "1"]}.

API Version 2012-08-10


882
Amazon DynamoDB Developer Guide
Consulta

Nombre Descripcin Obligatorio

GT : Mayor que.

Para GT, AttributeValueList


puede contener un solo
AttributeValue 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. 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.

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).

BETWEEN: mayor o igual que el


primer valor y menor o igual que
el segundo valor.

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"]}.

API Version 2012-08-10


883
Amazon DynamoDB Developer Guide
Consulta

Nombre Descripcin Obligatorio

ScanIndexForward Especifica si el ndice se No


recorrer en sentido ascendente
o descendente. DynamoDB
devuelve los resultados segn
el orden solicitado en funcin de
la clave de rango: si el tipo de
datos es Number, los resultados
se devuelven en orden numrico;
de lo contrario, el recorrido se
basa en los valores del cdigo de
caracteres ASCII.

Tipo: booleano

El valor predeterminado es true


(ascendente).

ExclusiveStartKey Clave principal del elemento a No


partir del cual se continuar una
consulta anterior. Una consulta
anterior puede proporcionar este
valor en LastEvaluatedKey
si la operacin se interrumpi
antes de completar la consulta,
ya sea debido al tamao del
conjunto de resultados o al
parmetro Limit. El valor de
LastEvaluatedKey se puede
pasar a una nueva solicitud
de consulta para continuar la
operacin a partir de ese punto.

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"},

API Version 2012-08-10


884
Amazon DynamoDB Developer Guide
Consulta

"AttributeName5":{"B":"dmFsdWU="}
}],
"LastEvaluatedKey":{"HashKeyElement":{"AttributeValue3":"S"},
"RangeKeyElement":{"AttributeValue4":"N"}
},
"ConsumedCapacityUnits":1
}

Nombre Descripcin

Items Atributos de elementos que cumplen los


parmetros de la consulta.

Tipo: Map, mapa de los nombres de atributos y sus


tipos de datos y valores.

Count Nmero de elementos de la respuesta. Para


obtener ms informacin, consulte Recuento de los
elementos de los resultados (p. 430).

Tipo: Number

LastEvaluatedKey Clave principal del elemento en el que se ha


detenido la operacin de consulta, incluido el
conjunto de resultados anterior. Utilice este valor
para iniciar una nueva operacin excluyendo este
valor en la nueva solicitud.

El valor de LastEvaluatedKey es null cuando


se ha completado todo el conjunto de resultados
de la consulta (es decir, cuando la operacin ha
procesado la ltima pgina).

Tipo: HashKeyElement, o bien HashKeyElement


y RangeKeyElement si se trata de una clave
principal compuesta.

ConsumedCapacityUnits Nmero de unidades de capacidad de lectura


consumidas por la operacin. Este valor muestra
el nmero aplicado al desempeo provisionado.
Para obtener ms informacin, consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

Tipo: Number

Errores especiales

Error Descripcin

ResourceNotFoundException No se encontr la tabla especificada.

Ejemplos
Para obtener ejemplos sobre cmo usar el SDK de AWS, consulte Uso de consultas (p. 425).

API Version 2012-08-10


885
Amazon DynamoDB Developer Guide
Consulta

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

API Version 2012-08-10


886
Amazon DynamoDB Developer Guide
Examen

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"}
},

API Version 2012-08-10


887
Amazon DynamoDB Developer Guide
Examen

"AttributesToGet":["AttributeName1", "AttributeName2", "AttributeName3"]},


}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que contiene S


los elementos solicitados.

Tipo: String

AttributesToGet Matriz de nombres de atributo. Si No


no se especifican sus nombres,
se devuelven todos los atributos.
Si algn atributo no se encuentra,
no aparecer en los resultados.

Tipo: Array

Limit Nmero mximo de elementos No


que se van a evaluar, que no
es necesariamente el nmero
de elementos coincidentes. Si
DynamoDB alcanza el lmite
del nmero de elementos
mientras procesa los resultados,
se detiene y devuelve los
valores coincidentes hasta
ese punto, junto con el valor
de LastEvaluatedKey,
que puede aplicarse en una
operacin ulterior para continuar
recuperando elementos.
Adems, si el tamao del
conjunto de datos examinados
supera 1MB antes de que
DynamoDB alcance este lmite,
detiene el examen y devuelve
los valores coincidentes hasta
el lmite, junto con el valor de
LastEvaluatedKey, que puede
aplicarse en una operacin
ulterior para continuar con el
examen.

Tipo: Number

Count Si se establece en true, No


DynamoDB devuelve el nmero
total de elementos de la
operacin Scan, aunque no
encuentre ningn elemento
coincidente para el filtro
asignado. Puede aplicar el
parmetro Limit a los exmenes
que son solo de recuento.

No establezca Count en true


si proporciona una lista de

API Version 2012-08-10


888
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio


AttributesToGet; si lo hiciera,
DynamoDB devolvera un error
de validacin. Para obtener
ms informacin, consulte
Recuento de los elementos de
los resultados (p. 445).

Tipo: booleano

ScanFilter Evala los resultados del examen No


y solo devuelve los valores
deseados. Si se especifican
varias condiciones, se tratan
como operaciones "AND":
debern cumplirse todas las
condiciones para que se incluyan
en los resultados.

Tipo: Un mapa de nombres


de atributos a valores con
operadores de comparacin.

Valores y condiciones que


ScanFilter:AttributeValueList No
se usarn para evaluar los
resultados del examen para el
filtro.

Tipo: Un mapa de
AttributeValue a una
Condition.

API Version 2012-08-10


889
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio

ScanFilter: Criterios para evaluar los No


ComparisonOperator atributos proporcionados, tales
como igual que, mayor que, etc.
A continuacin se muestran los
operadores de comparacin
vlidos para una operacin de
examen.
Note

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.

Tipo: String o Binary

EQ: igual que.

Para EQ, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco es igual que {"NS":
["6", "2", "1"]}.

API Version 2012-08-10


890
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio

NE: distinto de.

Para NE, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco es igual que {"NS":
["6", "2", "1"]}.

LE: menor o igual que.

Para LE, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco se compara con
{"NS":["6", "2", "1"]}.

LT : Menor que.

Para LT, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco se compara con
{"NS":["6", "2", "1"]}.

API Version 2012-08-10


891
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio

GE: mayor o igual que.

Para GE, AttributeValueList


puede contener un solo
AttributeValue 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. Por ejemplo,
{"S":"6"} no es igual que
{"N":"6"}. {"N":"6"}
tampoco se compara con
{"NS":["6", "2", "1"]}.

GT : Mayor que.

Para GT, AttributeValueList


puede contener un solo
AttributeValue 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. 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.

NULL: el atributo no existe.

API Version 2012-08-10


892
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio

CONTAINS: comprueba si hay


una subsecuencia, o un valor en
un conjunto.

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).

API Version 2012-08-10


893
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio

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).

IN: comprueba si hay


coincidencias exactas.

Para IN, AttributeValueList


puede contener ms de un
AttributeValue 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.

BETWEEN: mayor o igual que el


primer valor y menor o igual que
el segundo valor.

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"]}.

API Version 2012-08-10


894
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin Obligatorio

ExclusiveStartKey Clave principal del elemento a No


partir del cual se continuar un
examen anterior. Un examen
anterior puede proporcionar
este valor si la operacin de
examen se interrumpi antes de
examinar toda la tabla, ya sea
debido al tamao del conjunto de
resultados o al parmetro Limit.
El valor de LastEvaluatedKey
se puede pasar a una nueva
solicitud de examen para
continuar la operacin a partir de
ese punto.

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

Items Contenedor de los atributos que coinciden con los


parmetros de la operacin.

Tipo: Map, mapa de los nombres de atributos y sus


tipos de datos y valores.

API Version 2012-08-10


895
Amazon DynamoDB Developer Guide
Examen

Nombre Descripcin

Count Nmero de elementos de la respuesta. Para


obtener ms informacin, consulte Recuento de los
elementos de los resultados (p. 445).

Tipo: Number

ScannedCount Nmero de elementos del anlisis completo


antes de aplicar cualquier filtro. Un valor de
ScannedCount elevado, con pocos resultados
de Count o ninguno indica que la operacin Scan
ha sido ineficiente. Para obtener ms informacin,
consulte Recuento de los elementos de los
resultados (p. 445).

Tipo: Number

LastEvaluatedKey Clave principal del elemento en que se detuvo la


operacin de examen. Proporcione este valor en
una operacin de examen posterior para continuar
la operacin a partir de ese punto.

El valor de LastEvaluatedKey es null cuando


se ha completado todo el conjunto de resultados
de examen (es decir, cuando la operacin ha
procesado la "ltima pgina").

ConsumedCapacityUnits Nmero de unidades de capacidad de lectura


consumidas por la operacin. Este valor muestra
el nmero aplicado al desempeo provisionado.
Para obtener ms informacin, consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

Tipo: Number

Errores especiales

Error Descripcin

ResourceNotFoundException No se encontr la tabla especificada.

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

API Version 2012-08-10


896
Amazon DynamoDB Developer Guide
Examen

{"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":[

API Version 2012-08-10


897
Amazon DynamoDB Developer Guide
Examen

{"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)

API Version 2012-08-10


898
Amazon DynamoDB Developer Guide
UpdateItem

UpdateItem
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
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.

Si un elemento tiene la clave principal especificada:

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.

Si no hay ningn elemento que coincida con la clave principal especificada:

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.

API Version 2012-08-10


899
Amazon DynamoDB Developer Guide
UpdateItem

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

// 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":"Table1",
"Key":
{"HashKeyElement":{"S":"AttributeValue1"},
"RangeKeyElement":{"N":"AttributeValue2"}},
"AttributeUpdates":{"AttributeName3":{"Value":
{"S":"AttributeValue3_New"},"Action":"PUT"}},
"Expected":{"AttributeName3":{"Value":{"S":"AttributeValue3_Current"}}},
"ReturnValues":"ReturnValuesConstant"
}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que contiene S


el elemento que se va a
actualizar.

Tipo: String

Key Clave principal que define S


el elemento. Para obtener
ms informacin sobre claves
principales, consulte Clave
principal (p. 6).

Tipo: Map, mapa de


HashKeyElement a su valor y
RangeKeyElement a su valor.

AttributeUpdates Mapa del nombre de atributo


al nuevo valor y accin de la
actualizacin. Los nombres de
los atributos especifican los
atributos que hay que modificar y
no pueden contener atributos de
clave principal.

API Version 2012-08-10


900
Amazon DynamoDB Developer Guide
UpdateItem

Nombre Descripcin Obligatorio


Tipo: Map, mapa de nombre
de atributo, valor y accin de la
actualizacin del atributo.

AttributeUpdates:Action Especifica cmo realizar la No


actualizacin. Valores posibles:
PUT (valor predeterminado),
ADD o DELETE. La semntica
se explica en la descripcin de
UpdateItem.

Tipo: String

Valor predeterminado: PUT

Expected Designa un atributo para una No


actualizacin condicional. El
parmetro Expected permite
proporcionar un nombre de
atributo e indicar si DynamoDB
debe comprobar si el valor del
atributo ya existe; o bien si el
valor del atributo existe y tiene
un valor determinado antes de
cambiarlo.

Tipo: Map, mapa de nombres de


atributos.

Expected:AttributeName Nombre del atributo para la No


operacin Put condicional.

Tipo: String

API Version 2012-08-10


901
Amazon DynamoDB Developer Guide
UpdateItem

Nombre Descripcin Obligatorio

Expected:AttributeName: Use este parmetro para No


ExpectedAttributeValue especificar si ya existe un valor
del par de nombre-valor del
atributo.

En la siguiente notacin JSON,


se actualiza el elemento si
todava no existe el atributo
"Color" para ese elemento:

"Expected" :
{"Color":{"Exists":false}}

En la siguiente notacin JSON


se comprueba si el atributo
denominado "Color" tiene el valor
"Yellow" antes de actualizar el
elemento:

"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.

API Version 2012-08-10


902
Amazon DynamoDB Developer Guide
UpdateItem

Nombre Descripcin Obligatorio

ReturnValues Use este parmetro si desea No


obtener los pares de nombre-
valor de los atributos antes de
actualizarlos mediante la solicitud
UpdateItem. Los valores
posibles de los parmetros
son NONE (predeterminado)
o ALL_OLD, UPDATED_OLD,
ALL_NEW o UPDATED_NEW.
Si se especifica ALL_OLD y
UpdateItem ha sobrescrito
un par de nombre-valor del
atributo, se devuelve el contenido
del elemento anterior. Si este
parmetro no se proporciona o si
su valor es NONE, no se devuelve
nada. Si se especifica ALL_NEW,
entonces se devuelven todos
los atributos de la nueva versin
del elemento. Si se especifica
UPDATED_NEW, entonces se
devuelven solamente las nuevas
versiones de los atributos
actualizados.

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

Attributes Mapa de pares de nombre-valor del atributo,


pero solo si el parmetro ReturnValues se ha

API Version 2012-08-10


903
Amazon DynamoDB Developer Guide
UpdateItem

Nombre Descripcin
especificado como algo distinto de NONE en la
solicitud.

Tipo: Map, mapa de pares de nombre-valor del


atributo.

ConsumedCapacityUnits Nmero de unidades de capacidad de escritura


consumidas por la operacin. Este valor muestra
el nmero aplicado al desempeo provisionado.
Para obtener ms informacin, consulte Ajustes de
desempeo de lecturas y escrituras (p. 305).

Tipo: Number

Errores especiales

Error Descripcin

ConditionalCheckFailedException Error en la comprobacin condicional. El valor


del atributo ("+ name +") es ("+ value +") pero se
esperaba ("+ expValue +").

ResourceNotFoundExceptions No se encontr el elemento o atributo especificado.

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

API Version 2012-08-10


904
Amazon DynamoDB Developer Guide
UpdateTable

{"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}
}

Nombre Descripcin Obligatorio

TableName Nombre de la tabla que se va a S


actualizar.

API Version 2012-08-10


905
Amazon DynamoDB Developer Guide
UpdateTable

Nombre Descripcin Obligatorio


Tipo: String

ProvisionedThroughput Nuevo desempeo de la S


tabla especificada, que se
compone de los valores de
ReadCapacityUnits y
WriteCapacityUnits.
Consulte Ajustes de desempeo
de lecturas y escrituras (p. 305).

Tipo: Array

ProvisionedThroughput Establece el nmero mnimo de S


:ReadCapacityUnits unidades ReadCapacityUnits
consistentes consumidas
por segundo para la tabla
especificada antes de
DynamoDB equilibre la carga con
otras operaciones.

Las operaciones de lectura


consistente final requieren menos
esfuerzo que una operacin
de lectura consistente; por lo
tanto, un ajuste de 50unidades
ReadCapacityUnits
consistentes por
segundo proporciona
100unidades de capacidad
ReadCapacityUnits
consistentes finales por segundo.

Tipo: Number

ProvisionedThroughput Establece el nmero S


:WriteCapacityUnits mnimo de unidades
WriteCapacityUnits
consumidas por segundo para
la tabla especificada antes de
DynamoDB equilibre la carga con
otras operaciones.

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,

API Version 2012-08-10


906
Amazon DynamoDB Developer Guide
UpdateTable

"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

CreationDateTime Fecha de creacin de la tabla.

Tipo: Number

KeySchema Estructura de la clave principal (simple o


compuesta) de la tabla. Se requiere un par de
nombre-valor de HashKeyElement, pero el par de
nombre-valor de RangeKeyElement es opcional
(solo es obligatorio para las claves principales
compuestas). El tamao mximo de la clave hash
es de 2048bytes. El tamao mximo de la clave
de rango es de 1024bytes. Ambos lmites se
aplican por separado (es decir, puede disponer
de una clave combinada de rango y hash de
2048+1024). Para obtener ms informacin sobre
claves principales, consulte Clave principal (p. 6).

Tipo: Map, mapa de HashKeyElement, o bien de


HashKeyElement y de RangeKeyElement si se
trata de una clave principal compuesta.

ProvisionedThroughput Ajustes de desempeo actuales de la


tabla especificada, incluidos los valores de
LastIncreaseDateTime (si procede) y
LastDecreaseDateTime (si procede).

Tipo: Array

TableName Nombre de la tabla actualizada.

Tipo: String

TableStatus Estado actual de la tabla (CREATING, ACTIVE,


DELETING o UPDATING), que debe ser UPDATING.

Use la operacin DescribeTables (p. 865) para


comprobar el estado de la tabla.

Tipo: String

API Version 2012-08-10


907
Amazon DynamoDB Developer Guide
UpdateTable

Errores especiales

Error Descripcin

ResourceNotFoundException No se encontr la tabla especificada.

ResourceInUseException La tabla no se encuentra en el estado ACTIVE.

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.UpdateTable
content-type: application/x-amz-json-1.0

{"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)

API Version 2012-08-10


908
Amazon DynamoDB Developer Guide

Historial de revisin de DynamoDB

En la siguiente tabla se describen cambios importantes en la documentacin.

Versin del API: 2012-08-10

Cambio Descripcin Fecha de modificacin

Compatibilidad de Node.js para Los desarrolladores de Node.js 5 de octubre de 2017


DAX pueden aprovechar Amazon
DynamoDB Accelerator (DAX),
utilizando el cliente DAX
para Node.js. Para obtener
ms informacin, consulte
Acceleration en memoria con
DAX (p. 573).

Puntos de conexin de la VPC Los puntos de conexin de 16 de agosto de 2017


para DynamoDB DynamoDB permiten que las
instancias EC2 de Amazon de
su Amazon VPC accedan a
DynamoDB, sin exponerse a
la infraestructura pblica de
Internet. El trfico de red entre
su VPC y DynamoDB no sale de
la red de Amazon. Para obtener
ms informacin, consulte
Puntos de enlace de Amazon
VPC para DynamoDB (p. 718).

Escalado automtico de El escalado automtico 14 de junio de 2017


DynamoDB de DynamoDB elimina la
necesidad de definir o ajustar
manualmente los ajustes de
desempeo provisionado.
En su lugar, el escalado
automtico de DynamoDB ajusta
dinmicamente la capacidad de
lectura y escritura para responder
a los patrones de trfico reales.
Esto permite a una tabla o ndice

API Version 2012-08-10


909
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin


secundario global incrementar su
capacidad de lectura y escritura
aprovisionada para abastecer
incrementos repentinos del
trfico sin limitaciones. Cuando
la carga de trabajo disminuye,
el escalado automtico de
DynamoDB reduce la capacidad
aprovisionada. Para obtener
ms informacin, consulte
Administracin automtica de
la capacidad de desempeo
con la funcin Auto Scaling de
DynamoDB (p. 309).

Amazon DynamoDB Accelerator Amazon DynamoDB Accelerator 19 de abril de 2017


(DAX) (DAX) es una cach en memoria
altamente disponible y totalmente
administrada para DynamoDB
que multiplica el desempeo
hasta por diez (de milisegundos
a microsegundos) incluso
con millones de solicitud
por segundo. Para obtener
ms informacin, consulte
Acceleration en memoria con
DAX (p. 573).

DynamoDB admite ahora el La funcin Time-to-Live (TTL) 27 de febrero de 2017


vencimiento automtico de de Amazon DynamoDB permite
elementos con Time-to-Live eliminar automticamente los
(TTL) elementos de las tablas que
han vencido, sin ningn costo
adicional. Para obtener ms
informacin, consulte Tiempo de
vida (p. 377).

DynamoDB admite el etiquetado A partir de ahora, puede agregar 19 de enero de 2017


de asignacin de costos etiquetas a las tablas de Amazon
DynamoDB para mejorar el
proceso de categorizacin
del uso y generar informes
de costos ms granulares.
Para obtener ms informacin,
consulte Etiquetado para
DynamoDB (p. 327).

API Version 2012-08-10


910
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Nuevo API DescribeLimits de El API DescribeLimits 1 de marzo de 2016


DynamoDB devuelve los lmites de capacidad
provisionada de la cuenta de
AWS en una regin, tanto para
la regin en su conjunto como
para cualquier tabla concreta de
DynamoDB que se cree en ella.
El API permite determinar cules
son los lmites actuales en el
nivel de cuenta, para que pueda
compararlos con la capacidad
provisionada que est utilizando
y disponga de tiempo suficiente
para solicitar un aumento antes
de agotarla. Para obtener
ms informacin, consulte
Lmites en DynamoDB (p. 765)
y DescribeLimits en la Amazon
DynamoDB API Reference.

Actualizacin de la consola de La consola de administracin de 12 de noviembre de 2015


DynamoDB y nueva terminologa DynamoDB se ha rediseado
relativa a los atributos de clave para que resulte ms intuitiva
principal y fcil de usar. Durante esta
actualizacin, hemos introducido
una terminologa nueva para los
atributos de clave principal:

Clave de particin,
denominada tambin atributo
hash.
Clave de ordenacin,
denominada tambin atributo
de intervalo.

Solo se han modificado los


nombres; la funcionalidad sigue
siendo la misma.

Al crear una tabla o un ndice


secundario, puede elegir entre
una clave principal simple (que
solo tiene una clave de particin)
o compuesta (que consta de
clave de particin y clave de
ordenacin). La documentacin
de DynamoDB se ha actualizado
para reflejar estos cambios.

API Version 2012-08-10


911
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Amazon DynamoDB Storage DynamoDB Storage Backend 20 de agosto de 2015


Backend for Titan for Titan es un paquete de
almacenamiento backend para la
base de datos de grficos Titan
que se implementa en Amazon
DynamoDB. Cuando se usa
DynamoDB Storage Backend
for Titan, los datos se benefician
de la proteccin de DynamoDB,
que abarca los centros de
datos de alta disponibilidad
de Amazon. El complemento
est disponible para Titan
versin 0.4.4 (principalmente
con fines de compatibilidad con
las aplicaciones existentes) y
Titan versin 0.5.4 (recomendado
para nuevas aplicaciones). Al
igual que en los dems paquetes
de almacenamiento backend
para Titan, este complemento
es compatible con el stack
Tinkerpop (versiones 2.4 y 2.5),
incluidos el API Blueprints y el
shell Gremlin. Para obtener ms
informacin, consulte Amazon
DynamoDB Storage Backend for
Titan (p. 815).

API Version 2012-08-10


912
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Flujos de DynamoDB, replicacin Flujos de DynamoDB captura 16 de julio de 2015


entre regiones y examen con una secuencia en orden
lecturas de consistencia alta 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 log y ver los
elementos de datos tal y como
se encontraban antes y despus
de la modificacin, prcticamente
en tiempo real. Para obtener ms
informacin, consulte Captura
de la actividad de las tablas con
Flujos de DynamoDB (p. 540)
y la Flujos de DynamoDB API
Reference.

La replicacin entre regiones de


DynamoDB es una solucin del
lado del cliente para mantener
copias idnticas de tablas
de DynamoDB en distintas
regiones de AWS, casi en
tiempo real. Puede utilizar la
replicacin entre regiones para
realizar backups de las tablas de
DynamoDB u ofrecer acceso de
baja latencia a los datos cuando
los usuarios se encuentran
distribuidos geogrficamente.
Para obtener ms informacin,
consulte Replicacin entre
regiones (p. 563).

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.

API Version 2012-08-10


913
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Compatibilidad con Amazon Ahora, DynamoDB est integrado 28 de mayo de 2015


DynamoDB en AWS CloudTrail con CloudTrail. CloudTrail
captura las llamadas al API
realizadas desde la consola
de DynamoDB o desde el API
de DynamoDB y las registra
en archivos log. Para obtener
ms informacin, consulte
Registro de operaciones de
DynamoDB mediante AWS
CloudTrail (p. 688) y la AWS
CloudTrail User Guide.

Compatibilidad mejorada con En esta versin, se agrega 27 de abril de 2015


expresiones de consulta un nuevo parmetro
KeyConditionExpression
al API Query. Una operacin
Query lee los elementos
de una tabla o un ndice
usando los valores de clave
principal. El parmetro
KeyConditionExpression
es una cadena que identifica
los nombres de las claves
principales y las condiciones
que se deben aplicar a los
valores de claves; Query
recupera solamente aquellos
elementos que satisfacen
la expresin. La sintaxis de
KeyConditionExpression es
parecida a la de otros parmetros
de expresin de DynamoDB
y permite definir variables de
sustitucin para los nombres
y valores contenidos en la
expresin. Para obtener ms
informacin, consulte Uso de
consultas (p. 425).

API Version 2012-08-10


914
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Nuevas funciones de En DynamoDB, el parmetro 27 de abril de 2015


comparacin para escrituras ConditionExpression
condicionales determina si una operacin
PutItem, UpdateItem
o DeleteItem se llevar
a cabo correctamente: el
elemento se escribe solamente
si la condicin se evala
en true. En esta versin
se agregan dos funciones
nuevas, attribute_type
y size, para usarlas con
ConditionExpression. Estas
funciones permiten llevar a
cabo escrituras condicionales
segn el tipo o de datos o el
tamao de un atributo de la tabla.
Para obtener ms informacin,
consulte Expresiones de
condicin (p. 360).

API Scan para ndices En DynamoDB, una operacin 10 de febrero de 2015


secundarios Scan lee todos los elementos
de una tabla, aplica criterios
de filtrado definidos por
el usuario y devuelve a la
aplicacin los elementos de
datos seleccionados. Esta misma
funcionalidad se encuentra
ahora disponible para los ndices
secundarios. Para examinar un
ndice secundario local o global,
se especifican los nombres del
ndice y de su tabla principal.
De forma predeterminada, la
operacin Scan aplicada a un
ndice devuelve todos los datos
que este contiene; sin embargo,
puede utilizar una expresin de
filtro para delimitar los resultados
que se devuelven a la aplicacin.
Para obtener ms informacin,
consulte Uso de operaciones de
examen (p. 443).

API Version 2012-08-10


915
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Operaciones online con ndices La indexacin online permite 27 de enero de 2015


secundarios globales agregar o eliminar ndices
secundarios globales de
las tablas existentes. Con
la indexacin online, no es
necesario definir todos los
ndices de una tabla al crearla,
sino que puede agregar un ndice
nuevo en cualquier momento.
Del mismo modo, si decide
que ya no necesita un ndice,
puede eliminarlo cuando lo
desee. Las operaciones de
indexacin online no aplican
bloqueos, de modo que la tabla
permanece disponible para la
actividad de lectura y escritura
mientras se agregan o eliminan
los ndices. Para obtener
ms informacin, consulte
Administracin de ndices
secundarios globales (p. 474).

Compatibilidad del modelo de DynamoDB permite almacenar y 7 de octubre de 2014


documento con JSON recuperar documentos con plena
compatibilidad con los modelos
de documentos. Los tipos de
datos nuevos son totalmente
compatibles con el estndar
JSON y permiten anidar los
componentes de documentos
unos en otros. Puede utilizar los
operadores de desreferenciacin
de rutas de documentos para
leer y escribir componentes
individuales, sin tener que
recuperar todo el documento.
En esta versin tambin se
incorporan nuevos parmetros
de expresin para especificar
proyecciones, condiciones y
acciones de actualizacin al leer
o escribir elementos de datos.
Para obtener ms informacin
sobre la compatibilidad de
los modelos de documentos
con JSON, consulteTipos
de datos (p. 13)yUso
de expresiones en
DynamoDB (p. 352).

API Version 2012-08-10


916
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Escalado flexible Para las tablas y los ndices 7 de octubre de 2014


secundarios globales, puede
aumentar la capacidad de
desempeo provisionada de
lectura y escritura en cualquier
cantidad, siempre y cuando
no rebase los lmites de cada
cuenta o tabla. Para obtener ms
informacin, consulteLmites en
DynamoDB (p. 765).

Tamaos de elementos mayores El tamao mximo de 7 de octubre de 2014


elemento en DynamoDB
se ha aumentado de 64 a
400KB. Para obtener ms
informacin, consulteLmites en
DynamoDB (p. 765).

Expresiones condicionales En DynamoDB se han ampliado 24 de abril de 2014


mejoradas los operadores que estn
disponibles para las expresiones
condicionales, lo que aporta ms
flexibilidad en las operaciones
de colocacin, actualizacin y
eliminacin condicionales. Los
nuevos operadores disponibles
permiten comprobar si un atributo
existe o no, si es mayor o igual
que un valor determinado, si
est comprendido entre dos
valores o comienza por unos
caracteres en concreto, entre
otras condiciones. DynamoDB
tambin proporciona un operador
OR opcional para evaluar
condiciones mltiples. De forma
predeterminada, se utiliza AND
entre las condiciones de una
expresin, de tal forma que esta
solo ser true si lo son todas
las condiciones que contiene.
Si especifica OR en su lugar,
la expresin ser true si una
o varias condiciones lo son.
Para obtener ms informacin,
consulte Uso de elementos en
DynamoDB (p. 340).

API Version 2012-08-10


917
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Filtro de consulta El API Query de DynamoDB 24 de abril de 2014


admite una nueva opcin
QueryFilter. De forma
predeterminada, la operacin
Query busca los elementos que
coinciden con un determinado
valor de clave de particin y una
condicin de clave de ordenacin
opcional. Un filtro de Query
aplica expresiones condicionales
a otros atributos sin clave; si
hay un filtro Query presente,
los elementos que no coinciden
con las condiciones del filtro se
descartan antes de devolver
los resultados de Query a la
aplicacin. Para obtener ms
informacin, consulte Uso de
consultas (p. 425).

Exportacin e importacin de La consola de DynamoDB se 6 de marzo de 2014


datos mediante la consola de ha mejorado para simplificar la
administracin de AWS exportacin e importacin de
datos de tablas de DynamoDB.
Con tan solo unos clics, puede
configurar una AWS Data
Pipeline para organizar el
flujo de trabajo y un clster de
Amazon Elastic MapReduce para
copiar los datos de las tablas
de DynamoDB en un bucket
de Amazon S3, o viceversa.
Puede realizar la importacin
o exportacin una sola vez
o configurar un trabajo de
exportacin diario. Incluso
puede realizar importaciones y
exportaciones entre regiones
copiando los datos de
DynamoDB de una tabla de
una regin a una tabla de otra
regin de AWS. Para obtener
ms informacin, consulte
Exportacin e importacin de
datos de DynamoDB mediante
AWS Data Pipeline (p. 755).

API Version 2012-08-10


918
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Reorganizacin de la Ahora resulta ms fcil encontrar 20 de enero de 2014


documentacin del API de nivel informacin sobre los API
superior siguientes:

Java: DynamoDBMappper
.NET: modelo de documento
y modelo de persistencia de
objetos

Estos API de nivel superior se


documentan aqu: Interfaces de
programacin de nivel superior
para DynamoDB (p. 201).

ndices secundarios globales DynamoDB agrega 12 de diciembre de 2013


compatibilidad con los ndices
secundarios globales. Al igual
que sucede con un ndice
secundario local, un ndice
secundario global se define
mediante una clave alternativa
de una tabla y, a continuacin,
se emiten solicitudes Query para
consultarlo. A diferencia de un
ndice secundario local, la clave
de particin del ndice secundario
global no tiene que ser la
misma que la clave de particin
de la tabla, sino que puede
ser cualquier atributo escalar
de esta ltima. La clave de
ordenacin es opcional y tambin
puede ser cualquier atributo
escalar de la tabla. Adems,
un ndice secundario global
presenta sus propios ajustes de
desempeo provisionado, que
son independientes de los de
su tabla principal. Para obtener
ms informacin, consulte
Uso de ndices secundarios
para mejorar el acceso a
los datos (p. 463) y ndices
secundarios globales (p. 466).

API Version 2012-08-10


919
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Control de acceso preciso DynamoDB incorpora 29 de octubre de 2013


compatibilidad con el control
de acceso preciso. Esta
caracterstica permite a los
clientes especificar qu
entidades principales (usuarios,
grupos o roles) pueden obtener
acceso a los elementos y
atributos individuales de una
tabla o un ndice secundario de
DynamoDB. Las aplicaciones
tambin pueden sacar partido de
las identidades web federadas
para delegar la tarea de
autenticar a los usuarios en
un proveedor de identidades
tercero, como Facebook, Google
o Login with Amazon. De esta
forma, las aplicaciones (incluidas
las aplicaciones para mviles)
pueden administrar grandes
cantidades de usuarios y, al
mismo tiempo, asegurarse
de que nadie pueda obtener
acceso a los elementos de datos
de DynamoDB a menos que
estn autorizados para ello.
Para obtener ms informacin,
consulte Uso de condiciones de
polticas de IAM para control de
acceso preciso (p. 652).

Unidades de capacidad de El tamao de la unidad de 14 de mayo de 2013


lectura de 4KB capacidad de lectura ha
aumentado de 1a4KB. Esta
mejora permite reducir el nmero
de unidades de capacidad
de lectura provisionadas que
se requieren para muchas
aplicaciones. Por ejemplo,
antes de esta versin, para
leer un elemento de 10KB se
consuman 10unidades de
capacidad de lectura; ahora,
la misma lectura de 10KB
solo consumira 3unidades
(10KB/4KB, redondeados al
mltiplo de 4KB inmediatamente
superior). Para obtener ms
informacin, consulte Capacidad
de desempeo para lecturas y
escrituras (p. 17).

API Version 2012-08-10


920
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Exmenes en paralelo DynamoDB incorpora 14 de mayo de 2013


compatibilidad con las
operaciones Scan en paralelo.
Ahora, las aplicaciones pueden
dividir una tabla en segmentos
lgicos y examinar todos
ellos simultneamente. Esta
caracterstica reduce el tiempo
necesario para que se complete
una operacin Scan y utiliza
plenamente la capacidad de
lectura provisionada de la tabla.
Para obtener ms informacin,
consulte Uso de operaciones de
examen (p. 443).

ndices secundarios locales DynamoDB agrega 18 de abril de 2013


compatibilidad con los ndices
secundarios locales. Se pueden
definir ndices de clave de
ordenacin basados en atributos
sin clave y, a continuacin,
utilizarlos en solicitudes Query.
Los ndices secundarios locales
permiten que las aplicaciones
recuperen de manera eficiente
elementos de datos que abarcan
varias dimensiones. Para
obtener ms informacin,
consulte ndices secundarios
locales (p. 505).

Nueva versin de API En esta versin, DynamoDB 18 de abril de 2013


introduce una nueva versin del
API (2012-08-10). La versin
del API anterior (2011-12-05)
se admite todava con fines de
compatibilidad retroactiva con
las aplicaciones existentes.
Las nuevas aplicaciones deben
utilizar la nueva versin del API,
2012-08-10. Recomendamos
migrar las aplicaciones existentes
a la versin 2012-08-10
del API, porque las nuevas
caractersticas de DynamoDB
(como los ndices secundarios
locales) no se podrn aplicar
retroactivamente en la versin
anterior del API. Para obtener
ms informacin acerca del API
versin 2012-08-10, consulte
la Amazon DynamoDB API
Reference.

API Version 2012-08-10


921
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Compatibilidad con variables de El lenguaje de la poltica de 4 de abril de 2013


polticas de IAM acceso de IAM ya es compatible
con variables. Cuando se evala
una poltica, las variables de la
poltica se sustituyen por valores
facilitados por informacin
basada en contexto desde la
sesin del usuario autenticado.
Puede utilizar las variables de
polticas para definir polticas con
un propsito general sin mostrar
un listado explcito con todos los
componentes de la poltica. Para
obtener ms informacin sobre
las variables de polticas, visite
Policy Variables en la gua AWS
Identity and Access Management
Using IAM.

Para obtener algunos ejemplos


de variables de polticas
de DynamoDB, consulte
Autenticacin y control de acceso
de Amazon DynamoDB (p. 635).

Actualizacin de los ejemplos de Ya est disponible la versin2 23 de enero de 2013


cdigo PHP para la versin2 de del AWS SDK para PHP. Los
AWS SDK para PHP ejemplos de cdigo PHP de la
Gua para desarrolladores de
Amazon DynamoDB se han
actualizado para utilizar este
nuevo SDK. Para obtener ms
informacin sobre la versin2 del
SDK, consulte AWS SDK para
PHP.

Nuevo punto de enlace DynamoDB se expande a la 3 de diciembre de 2012


regin AWS GovCloud (EE.UU.).
Para obtener la lista actualizada
de puntos de enlace de servicio y
protocolos, consulte Regiones y
puntos de conexin de AWS.

Nuevo punto de enlace DynamoDB se expande a la 3 de diciembre de 2012


regin Amrica del Sur (So
Paulo). Para obtener la lista
actualizada de puntos de enlace
admitidos, consulte Regiones y
puntos de conexin de AWS.

API Version 2012-08-10


922
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Nuevo punto de enlace DynamoDB se expande a la 13 de noviembre de 2012


regin Asia Pacfico (Sdney).
Para obtener la lista actualizada
de puntos de enlace admitidos,
consulte Regiones y puntos de
conexin de AWS.

En DynamoDB se implementa DynamoDB calcula una 2 de noviembre de 2012


la compatibilidad con las suma de comprobacin
sumas de comprobacin CRC32 de la carga de HTTP y
CRC32, se admiten las devuelve su valor en un nuevo
operaciones de obtencin por encabezado, x-amz-crc32.
lotes de consistencia alta y se Para obtener ms informacin,
eliminan las restricciones a las consulte API de bajo nivel de
actualizaciones simultneas de DynamoDB (p. 192).
tablas. De forma predeterminada,
las operaciones de lectura
realizadas mediante el
API BatchGetItem son
consistentes finales. Un nuevo
parmetro ConsistentRead
de BatchGetItem permite
elegir lecturas de consistencia
alta en su lugar para las tablas
incluidas en la solicitud. Para
obtener ms informacin,
consulte Descripcin (p. 843).
En esta versin se eliminan
algunas restricciones que se
aplicaban a la actualizacin
simultnea de varias tablas.
El nmero total de tablas
que se pueden actualizar
a la vez sigue siendo 10;
sin embargo, ahora pueden
encontrarse en cualquier
combinacin de estados
CREATING, UPDATING o
DELETING. Tampoco se aplica
ya ninguna cantidad mnima
para aumentar o reducir los
valores de ReadCapacityUnits
o WriteCapacityUnits de
una tabla. Para obtener ms
informacin, consulte Lmites
en DynamoDB (p. 765).

API Version 2012-08-10


923
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Documentacin de prcticas En la Gua para desarrolladores 28 de septiembre de 2012


recomendadas de Amazon DynamoDB
se identifican las prcticas
recomendadas para usar
tablas y elementos, as como
recomendaciones sobre las
operaciones de consulta y
examen.

API Version 2012-08-10


924
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Compatibilidad con el tipo de Adems de los tipos Number 21 de agosto de 2012


datos Binary y String, a partir de ahora
DynamoDB admite el tipo de
datos Binary.

Antes de esta versin, para


almacenar datos binarios
haba que convertirlos en
cadenas antes de almacenarlos
en DynamoDB. Adems del
trabajo de conversin en el
lado del cliente, este proceso
sola aumentar el tamao del
elemento de datos, con lo que
se requera ms espacio de
almacenamiento y, posiblemente,
mayor capacidad de desempeo
provisionada.

Ahora, los atributos de tipo


Binary permiten almacenar
datos binarios de cualquier
ndole, tales como datos
comprimidos, datos cifrados o
imgenes. Para obtener ms
informacin, consulte Tipos
de datos (p. 13). Para obtener
ejemplos funcionales de cmo
utilizar datos de tipo Binary en
los SDK de AWS, consulte las
siguientes secciones:

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)

Para disfrutar de esta


compatibilidad adicional con el
tipo de datos Binary en los SDK
de AWS, es preciso descargar
los SDK ms recientes y puede
que tambin tenga que actualizar
las aplicaciones existentes. Para
obtener ms informacin sobre
la descarga de los SDK de AWS,
consulte Ejemplos de cdigo
de .NET (p. 298).

API Version 2012-08-10


925
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Los elementos de las tablas de Adems de agregar y eliminar 14 de agosto de 2012


DynamoDB se pueden actualizar elementos de tablas, ahora
y copiar desde la consola de usuarios de DynamoDB tambin
DynamoDB pueden actualizarlos y copiarlos
desde la consola de DynamoDB.
Esta nueva funcionalidad
simplifica la modificacin de
elementos individuales en la
consola.

DynamoDB reduce los requisitos Ahora, DynamoDB admite 9 de agosto de 2012


mnimos de desempeo por tabla requisitos ms bajos de
desempeo de cada tabla; en
concreto, 1unidad de capacidad
de escritura y 1unidad de
capacidad de lectura. Para
obtener ms informacin,
consulte el tema Lmites en
DynamoDB (p. 765) en la Gua
para desarrolladores de Amazon
DynamoDB.

Compatibilidad con Signature DynamoDB ya es compatible 5 de julio de 2012


Version4 con Signature Version4 para
autenticar solicitudes.

Compatibilidad con el explorador La consola de DynamoDB ya es 22 de mayo de 2012


de tablas en la consola de compatible con un explorador de
DynamoDB tablas que permite consultar y
examinar los datos contenidos
en ellas. Tambin puede insertar
nuevos elementos o eliminar
los existentes. Las secciones
Creacin de tablas y carga de
ejemplos de datos (p. 291) y
Uso de la consola (p. 51) se han
actualizado para incluir estas
nuevas caractersticas.

Nuevos puntos de enlace Se ampla la disponibilidad 24 de abril de 2012


de DynamoDB con nuevos
puntos de enlace en las
regiones EE.UU. Oeste (Norte
de California), EE.UU. Oeste
(Oregn) y Asia Pacfico
(Singapur).

Para obtener la lista actualizada


de puntos de enlace admitidos,
visite Regiones y puntos de
conexin de AWS.

API Version 2012-08-10


926
Amazon DynamoDB Developer Guide

Cambio Descripcin Fecha de modificacin

Compatibilidad con el API DynamoDB admite ahora un 19 de abril de 2012


BatchWriteItem API de escritura por lotes que
permite colocar y eliminar varios
elementos de una o varias tablas
en una nica llamada al API.
Para obtener ms informacin
acerca del API de escritura por
lotes de DynamoDB, consulte
BatchWriteItem (p. 848).

Para obtener ms informacin


sobre cmo usar elementos
y aplicar la caracterstica de
escritura por lotes en los SDK de
AWS, consulte Uso de elementos
en DynamoDB (p. 340)Ejemplos
de cdigo de .NET (p. 298).

Ms cdigos de error Para obtener ms informacin, 5 de abril de 2012


documentados consulte Control de
errores (p. 196).

Nuevo punto de enlace DynamoDB se expande a la 29 de febrero de 2012


regin Asia Pacfico (Tokio).
Para obtener la lista actualizada
de puntos de enlace admitidos,
consulte Regiones y puntos de
conexin de AWS.

Se agrega la mtrica Una nueva mtrica, 24 de febrero de 2012


ReturnedItemCount ReturnedItemCount, que
proporciona el nmero de
elementos devueltos en la
respuesta a una operacin Query
o Scan para DynamoDB, est
disponible para monitorizarla
en CloudWatch. Para
obtener ms informacin,
consulte Monitorizacin de
DynamoDB (p. 669).

Se agregan ejemplos sobre el DynamoDB permite incrementar 25 de enero de 2012


incremento de valores y disminuir los valores numricos
existentes. Se incluyen ejemplos
de cmo agregar valores a otros
existentes en los apartados
"Actualizacin de un elemento"
de las secciones:

Uso de elementos: Java (p. 382).

Uso de elementos: .NET (p. 402).

Lanzamiento del producto inicial Se presenta la versin Beta de 18 de enero de 2012


DynamoDB como nuevo servicio.

API Version 2012-08-10


927

S-ar putea să vă placă și