Crear una aplicación web básica

TUTORIAL

Módulo 4: creación de una tabla de datos

En este módulo creará una tabla de Amazon DynamoDB y habilitará la función de Lambda para almacenar datos en ella.

Información general

En este módulo crearemos una tabla para conservar los datos utilizando Amazon DynamoDB. DynamoDB es un servicio de base de datos clave-valor, por lo que no es necesario crear un esquema para los datos. Su rendimiento es uniforme en todas las escalas y, cuando se lo utiliza, no hay servidores para administrar.

Además, usaremos el servicio AWS Identity and Access Management (IAM) para concederles a los servicios los permisos necesarios para interactuar entre sí, de forma segura. Específicamente, permitiremos que la función de Lambda creada en el módulo dos escriba en la tabla de DynamoDB que creamos recientemente mediante una política de IAM. Para hacerlo, utilizaremos SDK de AWS (Python, JavaScript o Java) de la función de Lambda.

Qué logrará

En este módulo, podrá:
  • Crear una tabla de DynamoDB con la Consola de administración de AWS.
  • crear un rol y administrar permisos con IAM.
  • Escribir en la tabla de DynamoDB con SDK de AWS (Python, JavaScript o Java).

Conceptos clave

Datos persistentes: almacenamiento de datos para que podamos acceder a ellos en el futuro, independientemente de la ejecución de un programa.

Base de datos no relacional: las bases de datos no relacionales no usan un esquema tabular de filas y columnas. En lugar de ello, utilizan un modelo de almacenamiento optimizado para los requisitos específicos de los tipos de datos que se almacenan.

Base de datos de clave-valor: es un tipo de base de datos no relacional que almacena datos como un conjunto de pares clave-valor en los que la clave sirve como identificador único.

Clave principal: se trata del valor que identificará cada elemento de los datos en una tabla de DynamoDB. Este valor también servirá para dividir la tabla de modo que sea más escalable.

Esquema: es la organización de los datos que sirve como plano para ver el modo en que se deben construir los datos.

SDK AWS: los SDK (kits de desarrollo de software) de AWS brindan un conjunto de herramientas, bibliotecas, documentación, muestras de código, procesos y guías que les permiten a los desarrolladores crear aplicaciones de software en una plataforma específica.

Política de IAM: se trata de un documento que define a qué recursos de AWS puede acceder una entidad, como un servicio, usuario o grupo.

 Tiempo mínimo de realización

10 minutos

 Servicios utilizados

 Última actualización

4 de abril de 2023

Implementación

    1. Inicie sesión en la consola de Amazon DynamoDB.
    2. Asegúrese de crear la tabla en la misma región en la que creó la aplicación web en el módulo anterior. Podrá ver esa información en la parte superior de la página, junto al nombre de la cuenta.
    3. Seleccione el botón naranja Crear tabla.
    4. En Nombre de tabla, ingrese HelloWorldDatabase.
    5. En el campo Clave de partición, ingrese ID. La clave de partición forma parte de la clave principal de la tabla.
    6. Deje el resto de los valores predeterminados sin cambios y seleccione el botón naranja Crear tabla.
    7. En la lista de tablas, seleccione el nombre de la tabla, HelloWorldDatabase.
    8. En la sección Información general, seleccione la flecha hacia abajo para mostrar Información adicional.

    9. Copie el nombre de recurso de Amazon (ARN). Lo necesitará más adelante en este módulo.

    1. Ahora que ya tenemos la tabla, debemos editar la función de Lambda para que pueda escribir datos en ella. En una nueva ventana del navegador, abra la consola de AWS Lambda.
    2. Seleccione la función que creamos en el módulo dos (si utilizó nuestros ejemplos, se llamará HelloWorldFunction). Si no la ve, consulte el menú desplegable Región en la esquina superior derecha junto a su nombre para asegurarse de que está en la misma región en la que creó la función.
    3. Agregaremos permisos a la función para que pueda utilizar el servicio DynamoDB y, para hacerlo, usaremos AWS Identity and Access Management (IAM).
    4. Seleccione la pestaña Configuración y seleccione Permisos en el menú de la derecha.
    5. En el cuadro Rol de ejecución, en Nombre del rol, elija el enlace. Se abrirá una nueva pestaña del navegador.
    6. En el cuadro Políticas de permisos, abra el menú desplegable Agregar permisos y seleccione Crear política integrada.
    7. Seleccione la pestaña JSON.
    8. Pegue la siguiente política en el área de texto; asegúrese de reemplazar el ARN de la tabla en el campo Recurso en la línea 15:
    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "YOUR-TABLE-ARN"
        }
        ]
    }

    9. Esta política le permitirá a la función de Lambda leer, editar o eliminar elementos, pero solo podrá hacerlo en la tabla que creamos.

    10. Seleccione el botón azul Revisar política.

    11. Junto a Nombre, escriba HelloWorldDynamoPolicy.

    12. Seleccione el botón azul Crear política.

    13. Ahora puede cerrar esta pestaña del navegador y volver a la pestaña de la función de Lambda.

    • Python
      1. Seleccione la pestaña Código y seleccione su función en el panel de navegación situado en la parte izquierda del editor de código.
      2. Reemplace el código de la función por lo siguiente:
      # import the json utility package since we will be working with a JSON object
      import json
      # import the AWS SDK (for Python the package name is boto3)
      import boto3
      # import time 
      import time
      # import two packages to help us with dates and date formatting
      
      # create a DynamoDB object using the AWS SDK
      dynamodb = boto3.resource('dynamodb')
      # use the DynamoDB object to select our table
      table = dynamodb.Table('HelloWorldDatabase')
      
      # define the handler function that the Lambda service will use as an entry point
      def lambda_handler(event, context):
       # Get the current GMT time
          gmt_time = time.gmtime()
      
          # store the current time in a human readable format in a variable
          # Format the GMT time string
          now = time.strftime('%a, %d %b %Y %H:%M:%S +0000', gmt_time)
      
      
      # extract values from the event object we got from the Lambda service and store in a variable
          name = event['firstName'] +' '+ event['lastName']
      # write name and time to the DynamoDB table using the object we instantiated and save response in a variable
          response = table.put_item(
              Item={
                  'ID': name,
                  'LatestGreetingTime':now
                  })
      # return a properly formatted JSON object
          return {
              'statusCode': 200,
              'body': json.dumps('Hello from Lambda, ' + name)
          }

      3. Seleccione el botón Implementar en la parte superior del editor de código.

    • JavaScript
      1. Seleccione la pestaña Código y seleccione su función en el panel de navegación situado en la parte izquierda del editor de código.
      2. Reemplace el código de la función por lo siguiente:
      // Include the AWS SDK module
      const AWS = require('aws-sdk');
      // Instantiate a DynamoDB document client with the SDK
      let dynamodb = new AWS.DynamoDB.DocumentClient();
      // Use built-in module to get current date & time
      let date = new Date();
      // Store date and time in human-readable format in a variable
      let now = date.toISOString();
      // Define handler function, the entry point to our code for the Lambda service
      // We receive the object that triggers the function as a parameter
      exports.handler = async (event) => {
          // Extract values from event and format as strings
          let name = JSON.stringify(`Hello from Lambda, ${event.firstName} ${event.lastName}`);
          // Create JSON object with parameters for DynamoDB and store in a variable
          let params = {
              TableName:'HelloWorldDatabase',
              Item: {
                  'ID': name,
                  'LatestGreetingTime': now
              }
          };
          // Using await, make sure object writes to DynamoDB table before continuing execution
          await dynamodb.put(params).promise();
          // Create a JSON object with our response and store it in a constant
          const response = {
              statusCode: 200,
              body: name
          };
          // Return the response constant
          return response;
      };

      3. Seleccione el botón Implementar en la parte superior del editor de código.

    • Java
      1. Seleccione la pestaña Configuración.
      2. Diríjase a Código de la función y cargue el siguiente archivo JAR. (Para este tutorial omitiremos la creación del paquete de implementación).
      3. Actualice el Gestor a com.example.app.SavePersonHandler::handleRequest.
    1. Seleccione el botón naranja Probar.
    2. Verá el mensaje Resultado de la ejecución: correcta con fondo verde.
    3. En una nueva pestaña del navegador, abra la consola de DynamoDB.
    4. En el panel de navegación de la izquierda, seleccione Tablas > Explorar elementos.
    5. Seleccione HelloWorldDatabase, que creamos al comienzo de este módulo.
    6. Seleccione la pestaña Elementos a la derecha.
    7. Los elementos que coincidan con el evento de prueba aparecen en Elementos devueltos. Si ha utilizado nuestros ejemplos, el ID del elemento será Hello from Lambda, Ada Lovelace o Ada Lovelace.
    8. La tabla de DynamoDB se actualizará cada vez que se ejecute la función de Lambda. Si se utiliza el mismo nombre, solamente cambiará la marca temporal.

Arquitectura de aplicaciones

Ahora que terminamos el módulo cuatro, veamos la arquitectura actual:

En el diagrama de arquitectura se muestran los servicios alojados en la nube de AWS, con las conexiones de usuarios externos a los servicios de AWS interconectados.

En este módulo agregamos dos servicios: DynamoDB (para el almacenamiento) y IAM (para administrar los permisos de forma segura). Ambos están conectados con la función de Lambda, lo que les permite escribir en nuestra base de datos. El último paso es agregar el código en el cliente para llamar a API Gateway.

¿Le resultó útil esta página?

Agregar interactividad a la aplicación web