Archivar automáticamente los elementos en Amazon S3 con DynamoDB TTL - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Archivar automáticamente los elementos en Amazon S3 con DynamoDB TTL

Creado por Tabby Ward (AWS)

Repositorio de código: archiva elementos en S3 mediante DynamoDB TLL

Entorno: PoC o piloto

Tecnologías: Modernización; bases de datos; modelo sin servidor; almacenamiento y copia de seguridad; administración de costos

Carga de trabajo: código abierto

Servicios de AWS: Amazon S3; Amazon DynamoDB; Amazon Kinesis; AWS Lambda

Resumen

Este patrón proporciona los pasos para eliminar datos antiguos de una tabla de Amazon DynamoDB y archivarlos en un bucket de Amazon Simple Storage Service (Amazon S3) en Amazon Web Services (AWS) sin tener que gestionar una flota de servidores. 

Este patrón utiliza el Tiempo de vida (TTL) de Amazon DynamoDB para eliminar automáticamente los elementos antiguos y Amazon DynamoDB Streams para capturar los elementos de TTL que han vencido. A continuación, conecta DynamoDB Streams a AWS Lambda, que ejecuta el código sin aprovisionar ni administrar ningún servidor. 

Cuando se añaden nuevos elementos a la transmisión de DynamoDB, se inicia la función Lambda y escribe los datos en una transmisión de entrega de Amazon Data Firehose. Firehose proporciona una solución sencilla y totalmente gestionada para cargar los datos como un archivo en Amazon S3.

DynamoDB se utiliza a menudo para almacenar datos de serie temporal, como datos de secuencias de clics de páginas web o datos de Internet de las cosas (IoT) procedentes de sensores y dispositivos conectados. En lugar de eliminar los elementos a los que se accede con menos frecuencia, muchos clientes prefieren archivarlos con fines de auditoría. TTL simplifica este archivado, ya que elimina automáticamente los elementos en función del atributo de marca de tiempo. 

Los elementos que TTL ha eliminado pueden identificarse en DynamoDB Streams, que captura una secuencia en orden cronológico de las modificaciones de los elementos y almacena la secuencia en un registro durante 24 horas como máximo. Una función de Lambda puede consumir estos datos y archivarlos en un bucket de Amazon S3 para reducir el costo de almacenamiento. Para reducir aun más los costos, se pueden crear Reglas del ciclo de vida de Amazon S3 para realizar la transición automática de los datos (tan pronto como se creen) a las clases de almacenamiento de menor costo, como S3 Glacier Instant Retrieval o S3 Glacier Flexible Retrieval, o Amazon S3 Glacier Deep Archive para el almacenamiento a largo plazo.

Requisitos previos y limitaciones

Requisitos previos

Arquitectura

Pila de tecnología

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • Amazon Data Firehose

  • AWS Lambda

  • Amazon S3

  1. TTL elimina los elementos.

  2. El activador de flujos de DynamoDB invoca la función de procesador de flujos Lambda.

  3. La función Lambda coloca los registros en el flujo de entrega de Firehose en formato de lote.

  4. Los registros de datos se archivan en el bucket de S3.

Herramientas

  • AWS CLI: la interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta unificada para administrar los servicios de AWS.

  • Amazon DynamoDB: Amazon DynamoDB es una base de datos de documentos y valores clave que ofrece un rendimiento de milisegundos de un solo dígito a cualquier escala.

  • Tiempo de vida (TTL) de Amazon DynamoDB: TTL de Amazon DynamoDB le permite definir una marca temporal por elemento para determinar cuándo ya no se necesita un elemento.

  • Amazon DynamoDB Streams: Amazon DynamoDB Streams captura una secuencia en orden cronológico de las modificaciones de los elementos en una tabla de DynamoDB y almacena esta información en un registro durante 24 horas como máximo.

  • Amazon Data Firehose: Amazon Data Firehose es la forma más sencilla de cargar de forma fiable datos de streaming en lagos de datos, almacenes de datos y servicios de análisis.

  • AWS Lambda: AWS Lambda ejecuta código sin necesidad de aprovisionar ni administrar servidores. Solo paga por el tiempo de computación que consume.

  • Amazon S3: Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos que ofrece escalabilidad, disponibilidad de datos, seguridad y rendimiento líderes del sector.

Código

El código de este patrón está disponible en los elementos de GitHub Archivar en S3 mediante el repositorio TTL de DynamoDB.

Epics

TareaDescripciónHabilidades requeridas

Crear una tabla de DynamoDB.

Utilice la CLI de AWS para crear una tabla en DynamoDB llamada Reservation. Seleccione una unidad de capacidad de lectura (RCU) y una unidad de capacidad de escritura (WCU) al azar, y asigne a su tabla dos atributos: ReservationID y ReservationDate

aws dynamodb create-table \ --table-name Reservation \ --attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \ --key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100

ReservationDate es una marca de tiempo epoch que se utilizará para activar el TTL.

Arquitecto de la nube, desarrollador de aplicaciones

Active el TTL de DynamoDB.

Utilice la CLI de AWS para activar el TTL de DynamoDB para el atributo ReservationDate.

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
Arquitecto de la nube, desarrollador de aplicaciones

Active un flujo de DynamoDB.

Utilice la CLI de AWS para activar un flujo de DynamoDB para la tabla Reservation mediante el tipo de flujo NEW_AND_OLD_IMAGES

aws dynamodb update-table \ --table-name Reservation \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

Este flujo contendrá registros de los elementos nuevos, los elementos actualizados, los elementos eliminados y los elementos eliminados por TTL. Los registros de los elementos que se eliminan mediante TTL incluyen un atributo de metadatos adicional para distinguirlos de los elementos que se eliminaron manualmente. El campo userIdentity para eliminaciones de TTL indica que el servicio DynamoDB realizó la acción de eliminación. 

En este patrón, solo se archivan los elementos eliminados por TTL, pero solo puede archivar los registros donde eventName sea REMOVE y userIdentity incluya principalId igual a dynamodb.amazonaws.com.

Arquitecto de la nube, desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Cree un bucket de S3.

Utilice la CLI de AWS para crear un bucket de S3 de destino en su región de AWS y sustituya us-east-1 por su región. 

aws s3api create-bucket \ --bucket reservationfirehosedestinationbucket \ --region us-east-1

Asegúrese de que el nombre del bucket de S3 sea único a nivel mundial, ya que todas las cuentas de AWS comparten el espacio de nombres.

Arquitecto de la nube, desarrollador de aplicaciones

Cree una política de ciclo de vida de 30 días para el bucket de S3.

  1. Inicie sesión en la consola de administración de AWS y abra la consola de Amazon S3. 

  2. Elige el depósito S3 que contiene los datos de Firehose. 

  3. En el bucket de S3, seleccione la pestaña Administración y, luego,Agregar regla de ciclo de vida

  4. Escriba un nombre para la regla en el cuadro de diálogo Regla de ciclo de vida y configure una regla del ciclo de vida de 30 días para su bucket.

Arquitecto de la nube, desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Cree y configure un flujo de entrega de Firehose.

Descarga y edita el ejemplo de CreateFireHoseToS3.py código del GitHub repositorio. 

Este código está escrito en Python y muestra cómo crear una transmisión de entrega de Firehose y un rol de AWS Identity and Access Management (IAM). El rol de IAM tendrá una política que Firehose podrá usar para escribir en el bucket S3 de destino.

Para ejecutar el script, utilice los siguientes comandos y argumentos de línea de comando:

Argumento 1 = <Your_S3_bucket_ARN>, que es el nombre de recurso de Amazon (ARN) del bucket que creó con anterioridad.

Argumento 2= Tu nombre de Firehose (lo está firehose_to_s3_stream usando este piloto)

Argumento 3 = su nombre de rol de IAM (Este piloto utiliza firehose_to_s3).

python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3

Si el rol de IAM especificado no existe, el script creará un rol de asunción con una política de relaciones de confianza, así como una política que conceda suficientes permisos de Amazon S3. Para ver ejemplos de estas políticas, consulte la sección Información adicional.

Arquitecto de la nube, desarrollador de aplicaciones

Verifica el flujo de entrega de Firehose.

Describa la transmisión de entrega de Firehose mediante la AWS CLI para comprobar que la transmisión de entrega se creó correctamente.

aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream
Arquitecto de la nube, desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Cree una política de confianza para la función de Lambda.

Cree un archivo de política de confianza con la siguiente información.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Esto le concederá a su función permiso para acceder a los recursos de AWS.

Arquitecto de la nube, desarrollador de aplicaciones

Cree un rol de ejecución para la función de Lambda.

Para crear el rol de ejecución, ejecute el siguiente código.

aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json
Arquitecto de la nube, desarrollador de aplicaciones

Agregue permisos al rol.

Para agregar permisos al rol, use el comando attach-policy-to-role.

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess
Arquitecto de la nube, desarrollador de aplicaciones

Creación de una función de Lambda.

Ejecute el siguiente comando para comprimir el archivo LambdaStreamProcessor.py del repositorio de código.

zip function.zip LambdaStreamProcessor.py

Cuando cree la función de Lambda, necesitará el ARN del rol de ejecución de Lambda. Para obtener el ARN, ejecute el siguiente código.

aws iam get-role \ --role-name lambda-ex

Para crear la función de Lambda, ejecute el siguiente código.

aws lambda create-function --function-name LambdaStreamProcessor \ --zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \ --role {Your Lamda Execution Role ARN}\ --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = arn:aws:s3:::reservationfirehosedestinationbucket,iam_role_name = firehose_to_s3, batch_size=400}"
Arquitecto de la nube, desarrollador de aplicaciones

Configure el desencadenador de la función de Lambda.

Utilice la CLI de AWS para configurar el desencadenador (DynamoDB Streams), que invoca la función de Lambda. El tamaño del lote de 400 es para evitar problemas de simultaneidad de Lambda.

aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \ --batch-size 400 --starting-position LATEST \ --event-source-arn <Your Latest Stream ARN From DynamoDB Console>
Arquitecto de la nube, desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Añada elementos con marcas de tiempo vencidas a la tabla de Reserva.

Para probar la funcionalidad, añada a la tabla Reservation los elementos con marcas de tiempo epoch vencidos. El TTL eliminará automáticamente los elementos en función de la marca de tiempo. 

La función de Lambda se inicia con las actividades de DynamoDB Stream y filtra el evento para identificar la actividad REMOVE o los elementos eliminados. A continuación, coloca los registros en el flujo de entrega de Firehose en formato de lote.

El flujo de entrega de Firehose transfiere los artículos a un depósito S3 de destino con el firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/ prefijo.

Importante: Para optimizar la recuperación de datos, configure Amazon S3 con Prefix y ErrorOutputPrefix que se detallan en la sección Información adicional.

Arquitecto de la nube
TareaDescripciónHabilidades requeridas

Elimine todos los recursos.

Elimine todos los recursos para asegurarse de que no se le cobre por ningún servicio que no utilice.  

Arquitecto de la nube, desarrollador de aplicaciones

Recursos relacionados

Información adicional

Creación y configuración de un flujo de entrega de Firehose: ejemplos de políticas

Documento de ejemplo de política de relaciones de confianza de Firehose

firehose_assume_role = { 'Version': '2012-10-17', 'Statement': [ { 'Sid': '', 'Effect': 'Allow', 'Principal': { 'Service': 'firehose.amazonaws.com' }, 'Action': 'sts:AssumeRole' } ] }

Ejemplos de políticas de permisos de S3

s3_access = { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "{your s3_bucket ARN}/*", "{Your s3 bucket ARN}" ] } ] }

Probar la funcionalidad: configuración de Amazon S3

Se elige la configuración de Amazon S3 con el siguiente Prefix y ErrorOutputPrefix para optimizar la recuperación de datos. 

prefix

firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/

Firehose crea primero una carpeta base llamada firehosetos3example directamente debajo del depósito S3. A continuación, evalúa las expresiones!{timestamp:yyyy}, !{timestamp:MM}!{timestamp:dd}, y !{timestamp:HH} para año, mes, día y hora utilizando el formato Java DateTimeFormatter.

Por ejemplo, una marca de tiempo de llegada aproximada de 1604683577 en tiempo de época de Unix se evalúa como year=2020, month=11, day=06 y hour=05. Por lo tanto, se evalúa en firehosetos3example/year=2020/month=11/day=06/hour=05/ la ubicación de Amazon S3 en la que se entregan los registros de datos.

ErrorOutputPrefix

firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/

Los ErrorOutputPrefix generan una carpeta base llamada firehosetos3erroroutputbase directamente debajo del bucket de S3. La expresión !{firehose:random-string} se evalúa como una cadena aleatoria de 11 caracteres, como ztWxkdg3Thg. Se podría evaluar como firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/ la ubicación de un objeto de Amazon S3 en la que se entregan los registros fallidos.