{"id":17248,"date":"2025-07-10T13:03:56","date_gmt":"2025-07-10T20:03:56","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17248"},"modified":"2025-07-10T13:49:34","modified_gmt":"2025-07-10T20:49:34","slug":"designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","title":{"rendered":"Dise\u00f1o de una canalizaci\u00f3n de archivo de datos sin servidor desde Couchbase al almacenamiento en la nube"},"content":{"rendered":"<p>En las aplicaciones modernas basadas en datos, la conservaci\u00f3n de documentos hist\u00f3ricos es esencial para el cumplimiento de normativas, la auditor\u00eda y la optimizaci\u00f3n de costes. Sin embargo, conservar todos los datos indefinidamente en su base de datos operativa principal suele ser insostenible y caro.<\/p>\n<p>En esta entrada del blog, te guiar\u00e9 a trav\u00e9s de la construcci\u00f3n de un <strong>canal de archivo totalmente sin servidor<\/strong> que traslada autom\u00e1ticamente documentos de <strong>Couchbase<\/strong> a <strong>Amazon S3<\/strong>utilizando <strong>Eventos de Couchbase<\/strong>, <strong>Puerta de enlace API de Amazon<\/strong>, <strong>SNS<\/strong>y <strong>AWS Lambda<\/strong>. La arquitectura demuestra c\u00f3mo aprovechar <strong>desacoplamiento as\u00edncrono<\/strong> para mejorar la resistencia, la escalabilidad y el rendimiento.<\/p>\n<p>Al final de este tutorial, tendr\u00e1s una soluci\u00f3n robusta, de extremo a extremo, que reacciona a las mutaciones de documentos o vencimientos basados en TTL en Couchbase y los archiva de manera eficiente en S3-sin ninguna intervenci\u00f3n manual.<\/p>\n<h2 style=\"font-weight: 400;\">Arquitectura general<\/h2>\n<p>Este es el aspecto de la arquitectura:<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-17249\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/arch.jpg\" alt=\"Architecture\" width=\"831\" height=\"401\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/arch.jpg 831w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/arch-300x145.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/arch-768x371.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/arch-18x9.jpg 18w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/center>&nbsp;<\/p>\n<p><strong>Flujo:<\/strong><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li>Couchbase detecta una condici\u00f3n en un documento (como la expiraci\u00f3n del TTL o un <code>archivo: true<\/code> bandera).<\/li>\n<li>Una funci\u00f3n de Couchbase Eventing dispara y env\u00eda el documento a una API Gateway.<\/li>\n<li>API Gateway reenv\u00eda el documento a un tema SNS.<\/li>\n<li>SNS invoca una funci\u00f3n Lambda suscrita al tema.<\/li>\n<li>Lambda escribe el documento JSON completo en un bucket de S3 utilizando una estructura de carpetas basada en fechas.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Esta configuraci\u00f3n est\u00e1 desacoplada, es escalable y no requiere ning\u00fan sondeo.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">\u00bfPor qu\u00e9 Couchbase Eventing para archivo?<\/h2>\n<p><strong>Eventos de Couchbase<\/strong> proporciona una forma nativa de activar la l\u00f3gica de negocio en respuesta a las mutaciones de documentos (creaciones, actualizaciones, eliminaciones) o expiraciones.<\/p>\n<p>Con Eventing, podemos:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Supervisar tipos de documentos o campos espec\u00edficos (como <code>archivo === true<\/code> y\/o <code>tipo === registros<\/code>)<\/li>\n<li>Reaccione en tiempo real a los vencimientos de TTL<\/li>\n<li>Env\u00edo de datos a servicios externos (como AWS) mediante llamadas HTTP<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 style=\"font-weight: 400;\">Escribiendo la funci\u00f3n Couchbase Eventing<\/h2>\n<p>Este es un ejemplo simplificado de la funci\u00f3n Couchbase Eventing que usamos para archivar documentos. La funci\u00f3n implementa l\u00f3gica para manejar dos escenarios principales:<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li><strong>Archivo basado en TTL<\/strong>: Cuando un documento tiene un <code>caducidad<\/code> establecido, registramos un temporizador que se dispara 60 segundos antes del TTL. Una vez que el temporizador expira, el <code>DocTimerCallback<\/code> que, a su vez, llama a la funci\u00f3n <code>publicar(doc, meta)<\/code> para archivar el documento.<\/li>\n<li><strong>Archivo basado en indicadores<\/strong>: Alternativamente, si un documento incluye el campo <code>archivo: true<\/code>la funci\u00f3n llama inmediatamente a <code>publicar(doc, meta)<\/code> para archivar el documento.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>En ambos casos, el documento se env\u00eda a una pasarela de API externa para su archivo. Si el estado de la respuesta de la API es <code>200<\/code> o <code>302<\/code>el documento se elimina expl\u00edcitamente del bucket de origen, completando as\u00ed el flujo de trabajo de archivado. Esto proporciona un mecanismo flexible para archivar documentos bajo demanda o mediante la automatizaci\u00f3n basada en TTL.<\/p>\n<pre class=\"nums:false lang:default decode:true\">function OnUpdate(doc, meta) {\r\n    if (doc.archive &amp;&amp; doc.archive === true){\r\n        log('Archiving document with ID:', meta.id);\r\n        var status = publish(doc, meta);\r\n        if (status === true) {\r\n            delete src[meta.id];\r\n        } else {\r\n            log('Publish failed, document will not be deleted:', meta.id);\r\n        }\r\n    } else if (meta.expiration &gt; 0){\r\n        var nMinsPrior = new Date((meta.expiration - 60) * 1000);\r\n        var currentTime = new Date().getTime();\r\n        log('Time difference (ms): ', currentTime - nMinsPrior);\r\n        if (currentTime &gt; nMinsPrior) {\r\n            log('Within 1 minute of TTL expiry, archiving:', meta.id);\r\n            var publishStatus = publish(doc, meta);\r\n        } else {\r\n            log('Timer set for future archiving:', meta.id);\r\n            createTimer(DocTimerCallback, nMinsPrior, meta.id, meta.id);\r\n        }\r\n    } else {\r\n        log('No archiving conditions met for:', meta.id);\r\n        return;\r\n    }\r\n}\r\n\r\nfunction DocTimerCallback(context) {\r\n    var doc = src[context];\r\n    if (doc) {\r\n        var meta = { id: context };\r\n        var publishStatus = publish(doc, meta);\r\n    } else {\r\n        log('Timer callback failed: document not found for:', context);\r\n    }\r\n}\r\n\r\nfunction publish(doc, meta) {\r\n    try {\r\n        var request = {\r\n            path: 'archive',\r\n            headers: {\r\n                'Content-Type': 'application\/json'\r\n            },\r\n            body: { ...doc, id: meta.id }\r\n        };\r\n        log(\"Sending request:\", request);\r\n        var response = curl('POST', archive2S3, request);\r\n        if (response.status === 200 || response.status === 302) {\r\n            log(\"Publish success for:\", meta.id, \" Response body:\", response.body);\r\n            return true;\r\n        } else {\r\n            log(\"Publish failed with status:\", response.status, \" Request body:\", request);\r\n            return false;\r\n        }\r\n    } catch (e) {\r\n        log(\"Exception during publish:\", e);\r\n        return false;\r\n    }\r\n}\r\n<\/pre>\n<blockquote><p><strong>Nota:<\/strong> Por razones de rendimiento, recomendamos comentar todos los caracteres <code>log()<\/code> que se muestran arriba. Estos registros se incluyeron principalmente con fines de depuraci\u00f3n y desarrollo. El exceso de registros en entornos de producci\u00f3n puede afectar al rendimiento y aumentar los costes de almacenamiento de registros.<\/p><\/blockquote>\n<p>As\u00ed es como definimos la configuraci\u00f3n y los enlaces, mientras cre\u00e1bamos la funci\u00f3n de eventos.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17256\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/settings.png\" alt=\"\" width=\"983\" height=\"709\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/settings.png 983w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/settings-300x216.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/settings-768x554.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/settings-18x12.png 18w\" sizes=\"auto, (max-width: 983px) 100vw, 983px\" \/><\/p>\n<p>Hit <code>Siguiente<\/code> para crear enlaces. Aqu\u00ed es donde enlazaremos el endpoint de nuestra API Gateway, a un alias <code>archivo2S3<\/code> y tambi\u00e9n utiliza el cubo de origen como alias <code>src<\/code>. Tenga en cuenta que hemos utilizado el permiso de Lectura\/Escritura para nuestro cubo de origen, ya que queremos que los datos sean purgados de all\u00ed.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17250\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/bindings-new.png\" alt=\"\" width=\"983\" height=\"672\" \/><\/p>\n<p>Hit <code>Siguiente<\/code> de nuevo y copiar\/pegar la funci\u00f3n JS de arriba en la ventana y <code>Guardar<\/code>. En este punto su funci\u00f3n est\u00e1 guardada pero no desplegada. Pulse tres puntos y seleccione <code>Despliegue<\/code> para ejecutar la funci\u00f3n eventing. As\u00ed es como se ver\u00eda una vez que la funci\u00f3n se est\u00e1 ejecutando.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17252\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/deployed.png\" alt=\"\" width=\"962\" height=\"335\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/deployed.png 962w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/deployed-300x104.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/deployed-768x267.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/deployed-18x6.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/deployed-800x280.png 800w\" sizes=\"auto, (max-width: 962px) 100vw, 962px\" \/><\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Creaci\u00f3n de la funci\u00f3n lambda para archivar en S3<\/h2>\n<p>La funci\u00f3n Lambda consume el mensaje SNS y archiva el JSON completo en un bucket de S3, organizado por fecha.<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Ejemplo de c\u00f3digo Lambda<\/h3>\n<pre><code class=\"language-python\">import boto3\r\nimport json\r\nfrom datetime import datetime\r\n\r\ns3 = boto3.client('s3')\r\nbucket_name = 'your-s3-archive-bucket'\r\n\r\ndef lambda_handler(event, context):\r\n    for record in event['Records']:\r\n        msg = json.loads(record['Sns']['Message'])\r\n        doc_id = msg['id']\r\n        content = msg\r\n        now = datetime.utcnow()\r\n        folder = f\"{now.year}\/{now.month}\/{now.day}\"\r\n        key = f\"{folder}\/{doc_id}.json\"\r\n        s3.put_object(\r\n            Bucket=bucket_name,\r\n            Key=key,\r\n            Body=json.dumps(content),\r\n            ContentType='application\/json'\r\n        )\r\n\r\n    return {\r\n        'statusCode': 200,\r\n        'body': 'Archived successfully.'\r\n    }\r\n<\/code><\/pre>\n<p>Esto resulta en un objeto S3 como:<\/p>\n<pre><code>s3:\/\/your-s3-archive-bucket\/2025\/6\/29\/log123.json<\/code><\/pre>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Utilizar el SNS para desacoplar la activaci\u00f3n del archivo<\/h2>\n<p><strong>SNS (Servicio simple de notificaci\u00f3n)<\/strong> permite que varios servicios reciban el mismo mensaje. Aqu\u00ed, pasa la solicitud de archivo a una funci\u00f3n Lambda.<\/p>\n<p><strong>Pasos:<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Crear un tema, por ejemplo <code>ArchivoTriggerTopic<\/code><\/li>\n<li>Permitir que API Gateway publique en \u00e9l a trav\u00e9s de IAM<\/li>\n<li>Suscribir la funci\u00f3n Lambda<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-17257\" style=\"border: 1px solid Gainsboro; padding: 10px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/SNS-Lambda.png\" alt=\"\" width=\"621\" height=\"175\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/SNS-Lambda.png 621w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/SNS-Lambda-300x85.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/SNS-Lambda-18x5.png 18w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><\/center><br \/>\n<strong>Fijaci\u00f3n de permisos<\/strong><\/p>\n<p>Aseg\u00farese de que se permite a API Gateway publicar en el tema SNS mediante una pol\u00edtica de confianza y acceso:<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Pol\u00edtica de confianza para <code>snsAccess<\/code> Papel:<\/h3>\n<pre><code class=\"language-json\">{\r\n  \"Effect\": \"Allow\",\r\n  \"Principal\": {\r\n    \"Service\": \"apigateway.amazonaws.com\"\r\n  },\r\n  \"Action\": \"sts:AssumeRole\"\r\n}\r\n<\/code><\/pre>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Pol\u00edtica de acceso para el rol:<\/h3>\n<pre><code class=\"language-json\">{\r\n  \"Effect\": \"Allow\",\r\n  \"Action\": \"sns:Publish\",\r\n  \"Resource\": \"arn:aws:sns:us-east-1:account-id:ArchiveTriggerTopic\"\r\n}\r\n<\/code><\/pre>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Configuraci\u00f3n de API Gateway para aceptar solicitudes de archivo<\/h2>\n<p>API Gateway act\u00faa como nuestro punto final p\u00fablico que recibe las solicitudes de archivo y las reenv\u00eda a SNS.<\/p>\n<p><strong>Pasos clave:<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Crear un <strong>API REST<\/strong> en API Gateway.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Seleccione una de las siguientes opciones <code>API REST<\/code> ya que proporciona integraci\u00f3n con el <code>SNS<\/code>\u00a0servicio.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17264\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-1.png\" alt=\"\" width=\"973\" height=\"253\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-1.png 973w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-1-300x78.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-1-768x200.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-1-18x5.png 18w\" sizes=\"auto, (max-width: 973px) 100vw, 973px\" \/><\/p>\n<p>Dar un <code>Nombre API<\/code> y seleccione <code>Tipo de punto final de la API<\/code> como <code>Regional<\/code>. Hit <code>Crear API<\/code> bot\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17265\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-2.png\" alt=\"\" width=\"980\" height=\"752\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-2.png 980w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-2-300x230.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-2-768x589.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-2-16x12.png 16w\" sizes=\"auto, (max-width: 980px) 100vw, 980px\" \/><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Establezca un <code>POST \/archivo<\/code> ruta.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>En la pr\u00f3xima <code>Recursos<\/code> cree un recurso pulsando <code>Crear recurso<\/code> del panel izquierdo.<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17266\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-3.png\" alt=\"\" width=\"721\" height=\"594\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-3.png 721w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-3-300x247.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-3-15x12.png 15w\" sizes=\"auto, (max-width: 721px) 100vw, 721px\" \/><\/center>Dar el <code>Nombre del recurso<\/code>. Estoy llamando a mi nombre de recursos para ser <code>archivo<\/code>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17267\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-4.png\" alt=\"\" width=\"994\" height=\"391\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-4.png 994w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-4-300x118.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-4-768x302.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-4-18x7.png 18w\" sizes=\"auto, (max-width: 994px) 100vw, 994px\" \/><\/p>\n<p>Hit <code>Crear recurso<\/code> bot\u00f3n . En la p\u00e1gina siguiente, en la secci\u00f3n <code>M\u00e9todos<\/code> golpe de panel <code>Crear m\u00e9todo<\/code> . Esto nos permitir\u00e1 asignar un mont\u00f3n de configuraciones a nuestro m\u00e9todo POST y detalles sobre nuestra <strong>SNS<\/strong> servicio como lo que <code>Regi\u00f3n AWS<\/code> se est\u00e1 ejecutando, ARN del <code>Funci\u00f3n IAM<\/code> que tiene el permiso necesario para publicar en el tema SNS.<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17269\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-6.png\" alt=\"\" width=\"648\" height=\"828\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-6.png 648w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-6-235x300.png 235w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-6-9x12.png 9w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-6-300x383.png 300w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/center>Si se desplaza hacia abajo en la p\u00e1gina, encontrar\u00e1 la p\u00e1gina <strong data-start=\"141\" data-end=\"172\">Par\u00e1metros de la cadena de consulta URL<\/strong> secci\u00f3n. Aqu\u00ed, asignaremos el ARN de nuestro tema SNS utilizando el nombre del par\u00e1metro <strong data-start=\"248\" data-end=\"262\"><code data-start=\"250\" data-end=\"260\">TemaArn<\/code><\/strong>. Adem\u00e1s, mapearemos <strong data-start=\"288\" data-end=\"301\"><code data-start=\"290\" data-end=\"299\">Mensaje<\/code><\/strong> a <strong data-start=\"305\" data-end=\"330\"><code data-start=\"307\" data-end=\"328\">method.request.body<\/code><\/strong>que contendr\u00e1 la carga \u00fatil completa de nuestro documento JSON.<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-17272\" style=\"border: 1px solid Gainsboro; text-align: center;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9.png\" alt=\"\" width=\"655\" height=\"316\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9.png 1462w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9-300x145.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9-1024x494.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9-768x371.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9-18x9.png 18w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-GW-9-1320x637.png 1320w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/center>Por \u00faltimo, pulsa el bot\u00f3n <code>Guardar<\/code> bot\u00f3n.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17291\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Method-redacted.png\" alt=\"\" width=\"1021\" height=\"395\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Method-redacted.png 1021w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Method-redacted-300x116.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Method-redacted-768x297.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Method-redacted-18x7.png 18w\" sizes=\"auto, (max-width: 1021px) 100vw, 1021px\" \/><\/p>\n<p>Enhorabuena, acaba de desplegar un <strong>Pasarela API<\/strong> que puede enviar su documento JSON a la base de datos <strong>SNS Tema<\/strong>que, en \u00faltima instancia, desencadena el <strong>Lambda<\/strong> para escribirlo en <strong>S3<\/strong>.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Probar el flujo de extremo a extremo<\/h2>\n<p>Puede probar su canalizaci\u00f3n de dos maneras:<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Pruebe primero el m\u00e9todo POST de la API<\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Pulsa el bot\u00f3n <code>Prueba<\/code> y enviar un simple JSON, con <code>id<\/code> campo como debe.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17292\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Test-button-redacted.png\" alt=\"\" width=\"827\" height=\"671\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Test-button-redacted.png 827w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Test-button-redacted-300x243.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Test-button-redacted-768x623.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/API-Test-button-redacted-15x12.png 15w\" sizes=\"auto, (max-width: 827px) 100vw, 827px\" \/><\/p>\n<p>Cuando pulse el bot\u00f3n <code>Prueba<\/code> aseg\u00farese de que la traza del registro no muestra ning\u00fan error y el estado de la respuesta es 200. En este punto tenemos nuestro endpoint API funcionando correctamente. A continuaci\u00f3n probaremos este servicio desde curl.<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Desde curl o Postman<\/h3>\n<pre><code class=\"language-bash\">curl -X POST https:\/\/your-api-gateway-url\/archive \\\r\n  -H \"Content-Type: application\/json\" \\\r\n  -d '{\r\n        \"id\": \"hotel::10025\",\r\n        \"type\": \"Hotel\",\r\n        \"message\": \"Archiving via curl\",\r\n        \"archive\": true\r\n      }'\r\n<\/code><\/pre>\n<p>Tras la activaci\u00f3n, compruebe que se ha creado el objeto correspondiente en su bucket de S3.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17254\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-bucket.png\" alt=\"\" width=\"1027\" height=\"453\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-bucket.png 1027w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-bucket-300x132.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-bucket-1024x452.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-bucket-768x339.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-bucket-18x8.png 18w\" sizes=\"auto, (max-width: 1027px) 100vw, 1027px\" \/><\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Desde Capella utilizando Query Workbench<\/h3>\n<p>Para probar la configuraci\u00f3n desde el <strong>Capella<\/strong>inserte un documento con un <strong>Valor TTL de 120 segundos<\/strong>.<\/p>\n<pre><code class=\"language-sql\">UPSERT INTO bulk.data.source (KEY, VALUE)\r\nVALUES (\"test::001\", {\"type\": \"test\", \"field\": \"value\"}, {\"expiration\": 2*60});\r\n<\/code><\/pre>\n<p>Ejecute el comando SQL anterior desde el query workbench y espere a que aparezca el documento en el configurado <strong>Cubo S3<\/strong> aproximadamente <strong>60 segundos antes de su expiraci\u00f3n<\/strong>ya que la funci\u00f3n Eventing establece un temporizador para activar <strong>un minuto antes del TTL<\/strong>.<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-17255 aligncenter\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-eventing.png\" alt=\"\" width=\"617\" height=\"579\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-eventing.png 617w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-eventing-300x282.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/s3-eventing-13x12.png 13w\" sizes=\"auto, (max-width: 617px) 100vw, 617px\" \/><\/center><\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Soluci\u00f3n de problemas<\/h2>\n<p>He aqu\u00ed algunos problemas comunes y c\u00f3mo solucionarlos:<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>ValidationError<\/strong>: <strong>el mensaje no debe ser nulo<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Esto suele significar que el <code>Mensaje<\/code> enviado al SNS est\u00e1 vac\u00edo.<\/li>\n<li>Aseg\u00farese de que su <strong>Plantilla de asignaci\u00f3n de API Gateway<\/strong> est\u00e1 extrayendo correctamente el cuerpo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>API Gateway no tiene permiso para asumir el rol<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Confirme que su rol IAM tiene el <strong>pol\u00edtica de confianza<\/strong>.<\/li>\n<li>El papel debe permitir <code>apigateway.amazonaws.com<\/code> servicio para asumirlo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>Content-Type incorrecto en la solicitud API<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>API Gateway s\u00f3lo aplica plantillas de asignaci\u00f3n cuando el tipo de contenido es <code>application\/json<\/code>.<\/li>\n<li>Aseg\u00farese de que la funci\u00f3n Couchbase Eventing (o Postman) establece esta cabecera.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>SNS recibe JSON escapado o malformado<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Compruebe el uso de <code>$util.escapeJavaScript($input.body)<\/code> en la plantilla de asignaci\u00f3n.<\/li>\n<li>Un escape incorrecto puede causar problemas en el an\u00e1lisis posterior de Lambda.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>Registros de CloudWatch para inspeccionar Lambda<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Supervisar la traza de ejecuci\u00f3n de la funci\u00f3n Lambda para confirmar que todo se ha ejecutado como se esperaba.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17251\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/cloudwatch.png\" alt=\"\" width=\"1012\" height=\"583\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/cloudwatch.png 1012w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/cloudwatch-300x173.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/cloudwatch-768x442.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/cloudwatch-18x10.png 18w\" sizes=\"auto, (max-width: 1012px) 100vw, 1012px\" \/><\/p>\n<h2 style=\"font-weight: 400;\">Mejoras y buenas pr\u00e1cticas<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Utilice <strong>variables de entorno<\/strong> en Lambda para el nombre del bucket de S3 y la regi\u00f3n.<\/li>\n<li>Activar <strong>Cifrado del servidor S3<\/strong> (SSE-S3 o SSE-KMS) para su cumplimiento.<\/li>\n<li>Encender <strong>Versionado S3<\/strong> para conservar copias hist\u00f3ricas.<\/li>\n<li>A\u00f1adir <strong>Alarmas de CloudWatch<\/strong> para errores de Lambda o API Gateway 5XX.<\/li>\n<li>Utilice <strong>Abanico SNS<\/strong> para notificar a consumidores adicionales (por ejemplo, Kinesis, otras Lambdas).<\/li>\n<li>Considere la posibilidad de sustituir SNS por <strong>integraci\u00f3n directa de Lambda<\/strong> si s\u00f3lo tienes un consumidor y quieres permisos simplificados.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Conclusi\u00f3n<\/h2>\n<p>En esta entrada de blog, construimos una robusta canalizaci\u00f3n de archivo de documentos en tiempo real utilizando:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Couchbase Eventing para detectar documentos archivables<\/li>\n<li>API Gateway para exponer un punto final p\u00fablico<\/li>\n<li>SNS para desvincular a productores y consumidores<\/li>\n<li>Lambda para procesar y guardar documentos en S3<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Esta arquitectura no requiere ning\u00fan servidor, se escala sin esfuerzo y es una forma rentable de descargar datos hist\u00f3ricos para su conservaci\u00f3n, cumplimiento o an\u00e1lisis.<\/p>\n<h2 style=\"font-weight: 400;\">Recursos<\/h2>\n<p>Para ayudarle a profundizar y ampliar sus conocimientos sobre las tecnolog\u00edas utilizadas en esta canalizaci\u00f3n, he aqu\u00ed algunos recursos valiosos:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-overview.html\" target=\"_blank\" rel=\"noopener\">Visi\u00f3n general de Couchbase Eventing<\/a><\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/apigateway\/latest\/developerguide\/integrating-api-with-aws-services.html\" target=\"_blank\" rel=\"noopener\">Pasarela API a la integraci\u00f3n SNS<\/a><\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/with-s3-example.html\" target=\"_blank\" rel=\"noopener\">Ejemplo de Lambda a S3<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>In modern data-driven applications, retaining historical documents is essential for compliance, auditing, and cost optimization. However, keeping all data indefinitely in your primary operational database is often unsustainable and expensive. In this blog post, I\u2019ll walk you through building a [&hellip;]<\/p>","protected":false},"author":33279,"featured_media":17296,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1821,2225,1816],"tags":[],"ppma_author":[9090],"class_list":["post-17248","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-architecture","category-cloud","category-couchbase-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn how to build a fully serverless, stateless data archiving pipeline from Couchbase to Amazon S3 using Eventing, API Gateway, SNS, and AWS Lambda.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage\" \/>\n<meta property=\"og:description\" content=\"Learn how to build a fully serverless, stateless data archiving pipeline from Couchbase to Amazon S3 using Eventing, API Gateway, SNS, and AWS Lambda.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-10T20:03:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-10T20:49:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline-1024x536.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\"},\"author\":{\"name\":\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c\"},\"headline\":\"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage\",\"datePublished\":\"2025-07-10T20:03:56+00:00\",\"dateModified\":\"2025-07-10T20:49:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\"},\"wordCount\":1297,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png\",\"articleSection\":[\"Couchbase Architecture\",\"Couchbase Capella\",\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\",\"name\":\"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png\",\"datePublished\":\"2025-07-10T20:03:56+00:00\",\"dateModified\":\"2025-07-10T20:49:34+00:00\",\"description\":\"Learn how to build a fully serverless, stateless data archiving pipeline from Couchbase to Amazon S3 using Eventing, API Gateway, SNS, and AWS Lambda.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c\",\"name\":\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5e9708314822fac560c43a5fbdc9b74f\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g\",\"caption\":\"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase\"},\"description\":\"Anuj Sahni is a seasoned cloud and solutions architecture leader with over two decades of experience designing scalable, high-performance enterprise applications across AWS, Azure, and GCP. Currently part of the Capella team at Couchbase, he helps organizations modernize their applications and navigate cloud migration using cloud-native technologies. Prior to Couchbase, Anuj was Principal Product Manager at Oracle, where he led strategic initiatives for Oracle NoSQL Database and Oracle Service Cloud, focusing on distributed, always-available data platforms. He holds a Master\u2019s in Electrical and Computer Engineering from the University of Florida\u00a0and is an active thought leader in the data architecture space.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/anuj-sahni-6a80b617\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/anujsahni\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage - The Couchbase Blog","description":"Obtenga informaci\u00f3n sobre c\u00f3mo crear una canalizaci\u00f3n de archivado de datos sin servidor ni estado desde Couchbase a Amazon S3 con Eventing, API Gateway, SNS y AWS Lambda.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","og_locale":"es_MX","og_type":"article","og_title":"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage","og_description":"Learn how to build a fully serverless, stateless data archiving pipeline from Couchbase to Amazon S3 using Eventing, API Gateway, SNS, and AWS Lambda.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-07-10T20:03:56+00:00","article_modified_time":"2025-07-10T20:49:34+00:00","og_image":[{"width":1024,"height":536,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline-1024x536.png","type":"image\/png"}],"author":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/"},"author":{"name":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c"},"headline":"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage","datePublished":"2025-07-10T20:03:56+00:00","dateModified":"2025-07-10T20:49:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/"},"wordCount":1297,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png","articleSection":["Couchbase Architecture","Couchbase Capella","Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","url":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","name":"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png","datePublished":"2025-07-10T20:03:56+00:00","dateModified":"2025-07-10T20:49:34+00:00","description":"Obtenga informaci\u00f3n sobre c\u00f3mo crear una canalizaci\u00f3n de archivado de datos sin servidor ni estado desde Couchbase a Amazon S3 con Eventing, API Gateway, SNS y AWS Lambda.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-data-pipeline.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Designing a Serverless Data Archiving Pipeline from Couchbase to Cloud Storage"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/21c735da109667147c580bb2cb351c1c","name":"Anuj Sahni, Jefe de Arquitectura de Soluciones y Nube, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5e9708314822fac560c43a5fbdc9b74f","url":"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g","caption":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase"},"description":"Anuj Sahni is a seasoned cloud and solutions architecture leader with over two decades of experience designing scalable, high-performance enterprise applications across AWS, Azure, and GCP. Currently part of the Capella team at Couchbase, he helps organizations modernize their applications and navigate cloud migration using cloud-native technologies. Prior to Couchbase, Anuj was Principal Product Manager at Oracle, where he led strategic initiatives for Oracle NoSQL Database and Oracle Service Cloud, focusing on distributed, always-available data platforms. He holds a Master\u2019s in Electrical and Computer Engineering from the University of Florida\u00a0and is an active thought leader in the data architecture space.","sameAs":["https:\/\/www.linkedin.com\/in\/anuj-sahni-6a80b617"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/anujsahni\/"}]}},"authors":[{"term_id":9090,"user_id":33279,"is_guest":0,"slug":"anujsahni","display_name":"Anuj Sahni, Cloud and Solutions Architecture Leader, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/cb8391905c8ac6ff579c79c90aeaa4e9cf773b87a25e710ee107104c5659deb6?s=96&d=mm&r=g","author_category":"1","last_name":"Sahni, Cloud and Solutions Architecture Leader, Couchbase","first_name":"Anuj","job_title":"","user_url":"https:\/\/www.linkedin.com\/in\/anuj-sahni-6a80b617","description":"<p data-start=\"231\" data-end=\"963\"><strong>Anuj Sahni<\/strong> es un experimentado l\u00edder en arquitectura de soluciones y en la nube con m\u00e1s de dos d\u00e9cadas de experiencia en el dise\u00f1o de aplicaciones empresariales escalables y de alto rendimiento en AWS, Azure y GCP. Actualmente forma parte del <strong>Equipo Capella en Couchbase<\/strong>Ayuda a las organizaciones a modernizar sus aplicaciones y a migrar a la nube utilizando tecnolog\u00edas nativas de la nube.<\/p>\r\n<p data-start=\"231\" data-end=\"963\">Antes de Couchbase, Anuj fue <strong>Director de Producto en Oracle<\/strong>donde dirigi\u00f3 iniciativas estrat\u00e9gicas para Oracle NoSQL Database y Oracle Service Cloud, centr\u00e1ndose en plataformas de datos distribuidas y siempre disponibles. Posee un <strong>M\u00e1ster en Ingenier\u00eda El\u00e9ctrica e Inform\u00e1tica<\/strong> del <strong>Universidad de Florida<\/strong>\u00a0y es un activo l\u00edder de opini\u00f3n en el \u00e1mbito de la arquitectura de datos.<\/p>"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/17248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/33279"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=17248"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/17248\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/17296"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=17248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=17248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=17248"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=17248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}