{"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\/pt\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","title":{"rendered":"Projetando um pipeline de arquivamento de dados sem servidor do Couchbase para o armazenamento em nuvem"},"content":{"rendered":"<p>Nos aplicativos modernos orientados por dados, a reten\u00e7\u00e3o de documentos hist\u00f3ricos \u00e9 essencial para a conformidade, a auditoria e a otimiza\u00e7\u00e3o de custos. No entanto, manter todos os dados indefinidamente em seu banco de dados operacional principal geralmente \u00e9 insustent\u00e1vel e caro.<\/p>\n<p>Nesta postagem do blog, vou orient\u00e1-lo na cria\u00e7\u00e3o de um <strong>Pipeline de arquivamento totalmente sem servidor<\/strong> que move automaticamente documentos de <strong>Couchbase<\/strong> para <strong>Amazon S3<\/strong>, usando <strong>Eventos do Couchbase<\/strong>, <strong>Gateway de API da Amazon<\/strong>, <strong>SNS<\/strong>e <strong>AWS Lambda<\/strong>. A arquitetura demonstra como aproveitar <strong>desacoplamento ass\u00edncrono<\/strong> para melhorar a resili\u00eancia, a escalabilidade e o desempenho.<\/p>\n<p>Ao final deste tutorial, voc\u00ea ter\u00e1 uma solu\u00e7\u00e3o robusta e completa que reage a muta\u00e7\u00f5es de documentos ou expira\u00e7\u00f5es baseadas em TTL no Couchbase e as arquiva com efici\u00eancia no S3, sem nenhuma interven\u00e7\u00e3o manual.<\/p>\n<h2 style=\"font-weight: 400;\">Vis\u00e3o geral da arquitetura<\/h2>\n<p>Esta \u00e9 a apar\u00eancia da arquitetura:<\/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>Fluxo:<\/strong><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li>O Couchbase detecta uma condi\u00e7\u00e3o de documento (como expira\u00e7\u00e3o de TTL ou um <code>arquivo: true<\/code> bandeira).<\/li>\n<li>Uma fun\u00e7\u00e3o Eventing do Couchbase \u00e9 acionada e envia o documento para um API Gateway.<\/li>\n<li>O API Gateway encaminha o documento para um t\u00f3pico do SNS.<\/li>\n<li>O SNS invoca uma fun\u00e7\u00e3o Lambda inscrita no t\u00f3pico.<\/li>\n<li>O Lambda grava o documento JSON completo em um bucket S3 usando uma estrutura de pastas baseada em data.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Essa configura\u00e7\u00e3o \u00e9 desacoplada, dimension\u00e1vel e n\u00e3o requer polling.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Por que o Couchbase Eventing para arquivamento?<\/h2>\n<p><strong>Eventos do Couchbase<\/strong> fornece uma maneira nativa de acionar a l\u00f3gica comercial em resposta a muta\u00e7\u00f5es de documentos (cria\u00e7\u00f5es, atualiza\u00e7\u00f5es, exclus\u00f5es) ou expira\u00e7\u00f5es.<\/p>\n<p>Com o Eventing, podemos:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Monitorar tipos ou campos de documentos espec\u00edficos (como <code>archive === true<\/code> e\/ou <code>tipo === registros<\/code>)<\/li>\n<li>Reagir em tempo real \u00e0s expira\u00e7\u00f5es de TTL<\/li>\n<li>Envie dados para servi\u00e7os externos (como o AWS) por meio de chamadas HTTP<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 style=\"font-weight: 400;\">Escrevendo a fun\u00e7\u00e3o Eventing do Couchbase<\/h2>\n<p>Aqui est\u00e1 um exemplo simplificado da fun\u00e7\u00e3o Eventing do Couchbase que usamos para arquivar documentos. A fun\u00e7\u00e3o implementa a l\u00f3gica para lidar com dois cen\u00e1rios principais:<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li><strong>Arquivamento baseado em TTL<\/strong>: Quando um documento tem um <code>expira\u00e7\u00e3o<\/code> registramos um timer que dispara 60 segundos antes do TTL. Quando o cron\u00f4metro expira, o <code>DocTimerCallback<\/code> \u00e9 invocada, que ent\u00e3o chama a fun\u00e7\u00e3o <code>publish(doc, meta)<\/code> para arquivar o documento.<\/li>\n<li><strong>Arquivamento baseado em bandeira<\/strong>: Como alternativa, se um documento incluir o campo <code>arquivo: true<\/code>a fun\u00e7\u00e3o chama imediatamente <code>publish(doc, meta)<\/code> para arquivar o documento.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Em ambos os casos, o documento \u00e9 enviado a um API Gateway externo para arquivamento. Se o status da resposta da API for <code>200<\/code> ou <code>302<\/code>o documento \u00e9 explicitamente exclu\u00eddo do bucket de origem, concluindo o fluxo de trabalho de arquivamento. Isso oferece um mecanismo flex\u00edvel para arquivar documentos sob demanda ou por meio de automa\u00e7\u00e3o baseada em 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>Observa\u00e7\u00e3o:<\/strong> Por motivos de desempenho, recomendamos comentar todos os <code>log()<\/code> mostradas acima. Esses registros foram inclu\u00eddos principalmente para fins de depura\u00e7\u00e3o e desenvolvimento. O excesso de registros em ambientes de produ\u00e7\u00e3o pode afetar o desempenho e aumentar os custos de armazenamento de registros.<\/p><\/blockquote>\n<p>Veja como definimos as configura\u00e7\u00f5es e os v\u00ednculos ao criar a fun\u00e7\u00e3o 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>Acertar <code>Pr\u00f3ximo<\/code> para criar associa\u00e7\u00f5es. \u00c9 aqui que vincularemos o endpoint do nosso API Gateway a um alias <code>arquivo2S3<\/code> e tamb\u00e9m usa o bucket de origem como alias <code>src<\/code>. Observe que usamos a permiss\u00e3o de leitura\/grava\u00e7\u00e3o para o nosso bucket de origem, pois gostar\u00edamos que os dados fossem removidos de l\u00e1.<\/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>Acertar <code>Pr\u00f3ximo<\/code> novamente e copie\/cole a fun\u00e7\u00e3o JS acima na janela e <code>Salvar<\/code>. Nesse ponto, sua fun\u00e7\u00e3o est\u00e1 salva, mas n\u00e3o implantada. Pressione tr\u00eas pontos e selecione <code>Implementar<\/code> para executar a fun\u00e7\u00e3o de eventos. Esta \u00e9 a apar\u00eancia quando a fun\u00e7\u00e3o estiver em execu\u00e7\u00e3o.<\/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;\">Cria\u00e7\u00e3o da fun\u00e7\u00e3o Lambda para arquivar no S3<\/h2>\n<p>A fun\u00e7\u00e3o Lambda consome a mensagem do SNS e arquiva o JSON completo em um bucket do S3, organizado por data.<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Exemplo 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>Isso resulta em um 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;\">Uso do SNS para desacoplar o acionador de arquivamento<\/h2>\n<p><strong>SNS (Servi\u00e7o de Notifica\u00e7\u00e3o Simples)<\/strong> permite que v\u00e1rios servi\u00e7os recebam a mesma mensagem. Aqui, ele passa a solicita\u00e7\u00e3o de arquivamento para uma fun\u00e7\u00e3o Lambda.<\/p>\n<p><strong>Passos:<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Crie um t\u00f3pico, por exemplo, <code>ArchiveTriggerTopic<\/code><\/li>\n<li>Permitir que o API Gateway publique nele por meio do IAM<\/li>\n<li>Assinar a fun\u00e7\u00e3o 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>Corre\u00e7\u00e3o de permiss\u00f5es<\/strong><\/p>\n<p>Certifique-se de que o API Gateway tenha permiss\u00e3o para publicar no t\u00f3pico do SNS por meio de uma pol\u00edtica de confian\u00e7a e acesso:<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Pol\u00edtica de confian\u00e7a para <code>snsAccess<\/code> Fun\u00e7\u00e3o:<\/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 acesso para a fun\u00e7\u00e3o:<\/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;\">Configura\u00e7\u00e3o do API Gateway para aceitar solicita\u00e7\u00f5es de arquivamento<\/h2>\n<p>O API Gateway atua como nosso ponto de extremidade p\u00fablico que recebe as solicita\u00e7\u00f5es de arquivo e as encaminha para o SNS.<\/p>\n<p><strong>Principais etapas:<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Criar um <strong>API REST<\/strong> no API Gateway.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Entre as op\u00e7\u00f5es fornecidas, selecione <code>API REST<\/code> pois oferece integra\u00e7\u00e3o com o <code>SNS<\/code>\u00a0servi\u00e7o.<\/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>D\u00ea um <code>Nome da API<\/code> e selecione <code>Tipo de ponto de extremidade da API<\/code> como <code>Regional<\/code>. Acertar <code>Criar API<\/code> bot\u00e3o.<\/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>Configurar um <code>POST \/archive<\/code> rota.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Na pr\u00f3xima <code>Recursos<\/code> crie um recurso pressionando <code>Criar recurso<\/code> no painel esquerdo.<\/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>D\u00ea a <code>Nome do recurso<\/code>. Estou chamando meu nome de recurso para ser <code>arquivo<\/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>Acertar <code>Criar recurso<\/code> bot\u00e3o. Na p\u00e1gina seguinte, na se\u00e7\u00e3o <code>M\u00e9todos<\/code> painel atingido <code>Criar m\u00e9todo<\/code> button. Isso nos permitir\u00e1 mapear v\u00e1rias configura\u00e7\u00f5es para nosso m\u00e9todo POST e detalhes sobre nosso <strong>SNS<\/strong> servi\u00e7o como o que <code>Regi\u00e3o AWS<\/code> que est\u00e1 sendo executado, ARN do <code>Fun\u00e7\u00e3o de IAM<\/code> que tenha a permiss\u00e3o necess\u00e1ria para publicar no t\u00f3pico do 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>Se voc\u00ea rolar a p\u00e1gina para baixo, encontrar\u00e1 o <strong data-start=\"141\" data-end=\"172\">Par\u00e2metros da cadeia de consulta de URL<\/strong> se\u00e7\u00e3o. Aqui, mapearemos o ARN do nosso t\u00f3pico do SNS usando o nome do par\u00e2metro <strong data-start=\"248\" data-end=\"262\"><code data-start=\"250\" data-end=\"260\">TopicArn<\/code><\/strong>. Al\u00e9m disso, mapearemos <strong data-start=\"288\" data-end=\"301\"><code data-start=\"290\" data-end=\"299\">Mensagem<\/code><\/strong> para <strong data-start=\"305\" data-end=\"330\"><code data-start=\"307\" data-end=\"328\">method.request.body<\/code><\/strong>que conter\u00e1 a carga \u00fatil completa do nosso 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 fim, pressione o bot\u00e3o <code>Salvar<\/code> bot\u00e3o.<\/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>Parab\u00e9ns, voc\u00ea acabou de implantar um <strong>Gateway de API<\/strong> que pode fazer o POST de seu documento JSON para o <strong>T\u00f3pico do SNS<\/strong>que, por fim, aciona o <strong>Lambda<\/strong> para escrev\u00ea-lo em <strong>S3<\/strong>.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Teste do fluxo de ponta a ponta<\/h2>\n<p>Voc\u00ea pode testar seu pipeline de duas maneiras:<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">Primeiro, teste o m\u00e9todo POST da API<\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Pressione o bot\u00e3o <code>Teste<\/code> e enviar um JSON simples, com <code>id<\/code> como obrigat\u00f3rio.<\/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>Quando voc\u00ea atinge o <code>Teste<\/code> certifique-se de que o rastreamento do registro n\u00e3o mostre nenhum erro e que o status da resposta seja 200. Neste ponto, nosso endpoint de API est\u00e1 funcionando bem. Em seguida, testaremos esse servi\u00e7o com o curl.<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\">De curl ou 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>Ap\u00f3s o acionamento, verifique se um objeto correspondente foi criado em seu bucket 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;\">Do Capella usando o Query Workbench<\/h3>\n<p>Para testar a configura\u00e7\u00e3o do <strong>Capela<\/strong>inserir um documento com um <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>Execute o comando SQL acima a partir do query workbench e aguarde at\u00e9 que o documento apare\u00e7a na janela configurada <strong>Balde S3<\/strong> aproximadamente <strong>60 segundos antes de sua expira\u00e7\u00e3o<\/strong>A fun\u00e7\u00e3o Eventing define um cron\u00f4metro para acionar <strong>um minuto antes do 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;\">Solu\u00e7\u00e3o de problemas<\/h2>\n<p>Aqui est\u00e3o alguns problemas comuns e como corrigi-los:<\/p>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>ValidationError<\/strong>: <strong>a mensagem n\u00e3o deve ser nula<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Isso geralmente significa que o <code>Mensagem<\/code> enviado ao SNS est\u00e1 vazio.<\/li>\n<li>Garanta que seu <strong>Modelo de mapeamento do API Gateway<\/strong> est\u00e1 extraindo corretamente o corpo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>O API Gateway n\u00e3o tem permiss\u00e3o para assumir a fun\u00e7\u00e3o<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Confirme se a sua fun\u00e7\u00e3o de IAM tem o c\u00f3digo correto <strong>pol\u00edtica de confian\u00e7a<\/strong>.<\/li>\n<li>A fun\u00e7\u00e3o deve permitir que o <code>apigateway.amazonaws.com<\/code> servi\u00e7o para assumi-lo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>Content-Type incorreto na solicita\u00e7\u00e3o de API<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>O API Gateway s\u00f3 aplica modelos de mapeamento quando o tipo de conte\u00fado \u00e9 <code>aplicativo\/json<\/code>.<\/li>\n<li>Certifique-se de que a fun\u00e7\u00e3o Eventing do Couchbase (ou Postman) defina esse cabe\u00e7alho.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>O SNS recebe JSON com escape ou malformado<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Verifique novamente o uso de <code>$util.escapeJavaScript($input.body)<\/code> no modelo de mapeamento.<\/li>\n<li>O escape incorreto pode causar problemas na an\u00e1lise do Lambda downstream.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 200; font-size: 14px;\"><strong>Registros do CloudWatch para inspecionar o Lambda<\/strong><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Monitorar o rastreamento da execu\u00e7\u00e3o da fun\u00e7\u00e3o Lambda para confirmar que tudo foi executado conforme o esperado<\/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;\">Aprimoramentos e pr\u00e1ticas recomendadas<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Uso <strong>vari\u00e1veis de ambiente<\/strong> no Lambda para o nome e a regi\u00e3o do bucket S3.<\/li>\n<li>Ativar <strong>Criptografia no lado do servidor S3<\/strong> (SSE-S3 ou SSE-KMS) para fins de conformidade.<\/li>\n<li>Ligar <strong>Controle de vers\u00e3o S3<\/strong> para preservar c\u00f3pias hist\u00f3ricas.<\/li>\n<li>Adicionar <strong>Alarmes do CloudWatch<\/strong> para erros do Lambda ou API Gateway 5XXs.<\/li>\n<li>Uso <strong>Expans\u00e3o do SNS<\/strong> para notificar consumidores adicionais (por exemplo, Kinesis, outros Lambdas).<\/li>\n<li>Considere a possibilidade de substituir o SNS por <strong>integra\u00e7\u00e3o direta com o Lambda<\/strong> se voc\u00ea tiver apenas um consumidor e quiser permiss\u00f5es simplificadas.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Conclus\u00e3o<\/h2>\n<p>Nesta postagem do blog, criamos um pipeline de arquivamento de documentos robusto e em tempo real usando:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Couchbase Eventing para detectar documentos arquiv\u00e1veis<\/li>\n<li>API Gateway para expor um ponto de extremidade p\u00fablico<\/li>\n<li>SNS para separar produtores de consumidores<\/li>\n<li>Lambda para processar e salvar documentos no S3<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Essa arquitetura \u00e9 totalmente sem servidor, \u00e9 dimensionada sem esfor\u00e7o e \u00e9 uma maneira econ\u00f4mica de descarregar dados hist\u00f3ricos para reten\u00e7\u00e3o, conformidade ou an\u00e1lise.<\/p>\n<h2 style=\"font-weight: 400;\">Recursos<\/h2>\n<p>Para ajud\u00e1-lo a se aprofundar e expandir seu conhecimento sobre as tecnologias usadas nesse pipeline, aqui est\u00e3o alguns 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\">Vis\u00e3o geral dos eventos do Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/apigateway\/latest\/developerguide\/integrating-api-with-aws-services.html\" target=\"_blank\" rel=\"noopener\">Gateway de API para integra\u00e7\u00e3o com SNS<\/a><\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/with-s3-example.html\" target=\"_blank\" rel=\"noopener\">Exemplo de Lambda para 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\/pt\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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":"Saiba como criar um pipeline de arquivamento de dados sem estado e totalmente sem servidor do Couchbase para o Amazon S3 usando Eventing, API Gateway, SNS e 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\/pt\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"Saiba como criar um pipeline de arquivamento de dados sem estado e totalmente sem servidor do Couchbase para o Amazon S3 usando Eventing, API Gateway, SNS e AWS Lambda.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/designing-a-serverless-data-archiving-pipeline-from-couchbase-to-cloud-storage\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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, L\u00edder de Arquitetura de Nuvem e Solu\u00e7\u00f5es, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/pt\/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> 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 <strong>Capella team at Couchbase<\/strong>, he helps organizations modernize their applications and navigate cloud migration using cloud-native technologies.<\/p>\r\n<p data-start=\"231\" data-end=\"963\">Prior to Couchbase, Anuj was <strong>Principal Product Manager at Oracle<\/strong>, where he led strategic initiatives for Oracle NoSQL Database and Oracle Service Cloud, focusing on distributed, always-available data platforms. He holds a <strong>Master\u2019s in Electrical and Computer Engineering<\/strong> do <strong>University of Florida<\/strong>\u00a0and is an active thought leader in the data architecture space.<\/p>"}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/17248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/33279"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=17248"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/17248\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/17296"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=17248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=17248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=17248"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=17248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}