{"id":4345,"date":"2018-01-09T07:00:14","date_gmt":"2018-01-09T15:00:14","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4345"},"modified":"2025-06-13T20:40:47","modified_gmt":"2025-06-14T03:40:47","slug":"use-aws-lambda-api-gateway-node-js-couchbase-nosql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","title":{"rendered":"Utilizar AWS Lambda y API Gateway con Node.js y Couchbase NoSQL"},"content":{"rendered":"<p>Ha habido un gran revuelo en torno a las funciones como servicio (FaaS), com\u00fanmente denominadas sin servidor. Un proveedor popular para estas funciones es Amazon con su <a href=\"https:\/\/aws.amazon.com\/lambda\" target=\"_blank\" rel=\"noopener\">AWS Lambda<\/a> servicio. Se puede crear una funci\u00f3n en cualquiera de las tecnolog\u00edas de Lambda compatibles, por ejemplo Node.js, implementarla en AWS Lambda, obtener acceso a ella a trav\u00e9s de AWS API Gateway y escalarla por s\u00ed sola para satisfacer la demanda.<\/p>\n<p>Vamos a ver c\u00f3mo utilizar Node.js con AWS Lambda para crear funciones que puedan comunicarse con documentos NoSQL del estilo de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>Se asume que tienes un cl\u00faster o una instancia \u00fanica de Couchbase Server ejecut\u00e1ndose en alg\u00fan lugar de la nube. En otras palabras, este proyecto no funcionar\u00e1 si est\u00e1s ejecutando Couchbase en tu m\u00e1quina local. Debido a que estamos ejecutando esto en AWS, puede tener sentido que Couchbase exista como una instancia EC2. Esto se puede hacer por <a href=\"https:\/\/www.couchbase.com\/blog\/es\/deploy-couchbase-server-minutes-amazon-web-services\/\" target=\"_blank\" rel=\"noopener\">utilizando una AMI disponible<\/a>.<\/p>\n<h2>Creaci\u00f3n de un proyecto FaaS para Lambda y API Gateway con Serverless Framework<\/h2>\n<p>Si alguna vez has trabajado con AWS Lambda y AWS API Gateway antes, sabr\u00e1s que no es la experiencia m\u00e1s agradable cuando se empieza algo desde cero y luego se despliega. Para hacernos la vida un poco m\u00e1s f\u00e1cil, vamos a utilizar la herramienta <a href=\"https:\/\/serverless.com\" target=\"_blank\" rel=\"noopener\">Framework sin servidor<\/a>que se encargar\u00e1 de gran parte del trabajo pesado, sin cambiar la forma en que desarrollamos las funciones Lambda.<\/p>\n<p>Asumiendo que ya tienes Node.js instalado, ejecuta lo siguiente para obtener la CLI de Serverless Framework:<\/p>\n<pre class=\"lang:default decode:true\">npm install -g serverless<\/pre>\n<p>Con la CLI, podemos generar nuevos proyectos basados en plantillas disponibles, no limitadas a AWS. Para crear un nuevo proyecto con la CLI, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">serverless create --template aws-nodejs --path .\/my-project<\/pre>\n<p>Vamos a crear una serie de funciones dentro de la funci\u00f3n\u00a0<strong>mi-proyecto<\/strong> que se ha creado. Aqu\u00ed es donde las cosas pueden ponerse un poco raras.<\/p>\n<p>Nuestro proyecto Node.js va a requerir el SDK de Couchbase, un paquete para generar valores UUID, y un paquete para validaci\u00f3n de datos. El problema es que estoy usando un Mac y Lambda est\u00e1 usando un sabor especial de Linux. Si intento descargar las dependencias en mi Mac, no ser\u00e1n compatibles con Linux. En su lugar, tenemos que saltar a trav\u00e9s de algunos aros.<\/p>\n<p>Hay un art\u00edculo en Internet titulado,\u00a0<a href=\"https:\/\/instil.co\/2017\/08\/07\/using-native-dependencies-with-aws-lambda\/\" target=\"_blank\" rel=\"noopener\">Uso de dependencias nativas con AWS Lambda<\/a>que explica c\u00f3mo se puede utilizar Docker para llevar a cabo la tarea de las dependencias nativas del proyecto que funcionan para Lambda.<\/p>\n<p>En resumen, querr\u00e1s ejecutar lo siguiente con Docker instalado y con el CLI en el directorio actual de tu proyecto:<\/p>\n<pre class=\"lang:default decode:true\">docker pull amazonlinux\r\ndocker run -v $(pwd):\/lambda-project -it amazonlinux<\/pre>\n<p>Los comandos anteriores extraer\u00edan la imagen de Amazon Linux y desplegar\u00edan un contenedor, mapeando el directorio actual del proyecto como un volumen contenedor. Dentro del contenedor, Node.js puede ser instalado y nuestras dependencias de paquetes pueden ser obtenidas. Para ver c\u00f3mo hacer esto, echa un vistazo a un art\u00edculo anterior que escrib\u00ed titulado,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/12\/deploying-native-nodejs-dependencies-aws-lambda\/\" target=\"_blank\" rel=\"noopener\">Implementaci\u00f3n de dependencias de Node.js nativo en AWS Lambda<\/a>.<\/p>\n<p>Necesitar\u00e1s instalar las siguientes tres dependencias para el proyecto:<\/p>\n<pre class=\"lang:default decode:true\">npm install couchbase --save\r\nnpm install joi --save\r\nnpm install uuid --save<\/pre>\n<p>No te desanimes de continuar por el requisito de Amazon Linux. Esencialmente solo est\u00e1s ejecutando los tres comandos desde dentro del contenedor y como el contenedor tiene un volumen mapeado, cualquier archivo obtenido terminar\u00e1 directamente en tu proyecto.<\/p>\n<h2>Desarrollo de funciones para operaciones CRUD contra la base de datos NoSQL<\/h2>\n<p>Con el proyecto Serverless Framework listo, podemos centrarnos en lo que realmente cuenta. El objetivo aqu\u00ed es crear cuatro funciones diferentes, una para cada creaci\u00f3n, recuperaci\u00f3n, actualizaci\u00f3n y eliminaci\u00f3n de documentos NoSQL de Couchbase. As\u00ed es, estamos haciendo un conjunto de funciones CRUD.<\/p>\n<p>Abra el archivo\u00a0<strong>handler.js<\/strong> porque necesitamos arrancarlo:<\/p>\n<pre class=\"lang:default decode:true\">'use strict';\r\n\r\nconst Couchbase = require(\"couchbase\");\r\nconst UUID = require(\"uuid\");\r\nconst Joi = require(\"joi\");\r\n\r\nvar cluster = new Couchbase.Cluster(\"couchbase:\/\/your-server-here\");\r\ncluster.authenticate(\"demo\", \"123456\");\r\nvar bucket = cluster.openBucket(\"example\");\r\n\r\nbucket.on(\"error\", error =&gt; {\r\n    console.dir(error);\r\n});\r\n\r\nmodule.exports.create = (event, context, callback) =&gt; { };\r\n\r\nmodule.exports.retrieve = (event, context, callback) =&gt; { };\r\n\r\nmodule.exports.update = (event, context, callback) =&gt; { };\r\n\r\nmodule.exports.delete = (event, context, callback) =&gt; { };<\/pre>\n<p>En el c\u00f3digo anterior hemos importado las dependencias de nuestro proyecto, conectado a un cluster de Couchbase, autenticado con dicho cluster, y abierto un Bucket en particular. Aseg\u00farate de cambiar la informaci\u00f3n de Couchbase para reflejar tu informaci\u00f3n real.<\/p>\n<p>Tambi\u00e9n hemos creado las cuatro funciones que se mencionaron anteriormente. Sin embargo, por ahora estas funciones no hacen nada.<\/p>\n<p>Algo importante a tener en cuenta aqu\u00ed. Nuestra l\u00f3gica de conexi\u00f3n a la base de datos est\u00e1 ocurriendo fuera de nuestras funciones. Es una tarea costosa conectarse a la base de datos con cada invocaci\u00f3n de una funci\u00f3n. Al mover esta informaci\u00f3n fuera, sigue siendo accesible por cualquier contenedor de funciones Lambda.<\/p>\n<p>Empezando por el <code>crear<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">module.exports.create = (event, context, callback) =&gt; {\r\n    context.callbackWaitsForEmptyEventLoop = false;\r\n    var schema = Joi.object().keys({\r\n        firstname: Joi.string().required(),\r\n        lastname: Joi.string().required(),\r\n        type: Joi.string().forbidden().default(\"person\")\r\n    });\r\n    var data = JSON.parse(event.body);\r\n    var response = {};\r\n    var validation = Joi.validate(data, schema);\r\n    if(validation.error) {\r\n        response = {\r\n            statusCode: 500,\r\n            body: JSON.stringify(validation.error.details)\r\n        };\r\n        return callback(null, response);\r\n    }\r\n    var id = UUID.v4();\r\n    bucket.insert(id, validation.value, (error, result) =&gt; {\r\n        if(error) {\r\n            response = {\r\n                statusCode: 500,\r\n                body: JSON.stringify({\r\n                    code: error.code,\r\n                    message: error.message\r\n                })\r\n            };\r\n            return callback(null, response);\r\n        }\r\n        data.id = id;\r\n        response = {\r\n            statusCode: 200,\r\n            body: JSON.stringify(data)\r\n        };\r\n        callback(null, response);\r\n    });\r\n};<\/pre>\n<p>En el c\u00f3digo anterior ocurren muchas cosas, as\u00ed que tenemos que desglosarlo.<\/p>\n<p>Primero a\u00f1adiremos la siguiente l\u00ednea:<\/p>\n<pre class=\"lang:default decode:true\">context.callbackWaitsForEmptyEventLoop = false;<\/pre>\n<p>Al a\u00f1adir la l\u00ednea anterior, estamos cambiando la forma en que la funci\u00f3n espera para responder. Si no lo establecemos en false, las cosas as\u00edncronas a seguir probablemente agotar\u00e1n el tiempo de espera antes de completarse.<\/p>\n<pre class=\"lang:default decode:true\">var schema = Joi.object().keys({\r\n    firstname: Joi.string().required(),\r\n    lastname: Joi.string().required(),\r\n    type: Joi.string().forbidden().default(\"person\")\r\n});\r\nvar data = JSON.parse(event.body);\r\nvar response = {};\r\nvar validation = Joi.validate(data, schema);<\/pre>\n<p>Dado que vamos a crear datos basados en la entrada del usuario, es una buena idea validar dicha entrada del usuario. Utilizando <a href=\"https:\/\/github.com\/hapijs\/joi\" target=\"_blank\" rel=\"noopener\">Joi<\/a>podemos crear un esquema de validaci\u00f3n y usarlo para validar el cuerpo de datos pasado con el evento. Usted puede reconocer que Joi es un marco de validaci\u00f3n que he utilizado en art\u00edculos anteriores, tales como,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/create-restful-api-node-js-hapi-couchbase-nosql\/\" target=\"_blank\" rel=\"noopener\">Crear una API RESTful con Node.js, Hapi y Couchbase NoSQL<\/a>.<\/p>\n<pre class=\"lang:default decode:true\">if(validation.error) {\r\n    response = {\r\n        statusCode: 500,\r\n        body: JSON.stringify(validation.error.details)\r\n    };\r\n    return callback(null, response);\r\n}<\/pre>\n<p>Si hay un error de validaci\u00f3n, enviaremos un error 500 como respuesta. Si no, procederemos a generar una nueva clave de documento, y guardarla en Couchbase Server:<\/p>\n<pre class=\"lang:default decode:true\">var id = UUID.v4();\r\nbucket.insert(id, validation.value, (error, result) =&gt; {\r\n    if(error) {\r\n        response = {\r\n            statusCode: 500,\r\n            body: JSON.stringify({\r\n                code: error.code,\r\n                message: error.message\r\n            })\r\n        };\r\n        return callback(null, response);\r\n    }\r\n    data.id = id;\r\n    response = {\r\n        statusCode: 200,\r\n        body: JSON.stringify(data)\r\n    };\r\n    callback(null, response);\r\n});<\/pre>\n<p>Tenga en cuenta c\u00f3mo espera Lambda que se formateen las respuestas. Las respuestas deben tener un <code>statusCode<\/code> y un <code>cuerpo<\/code>.<\/p>\n<p>Ahora echemos un vistazo al <code>recuperar<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">module.exports.retrieve = (event, context, callback) =&gt; {\r\n    context.callbackWaitsForEmptyEventLoop = false;\r\n    var response = {};\r\n    var statement = \"SELECT META().id, `\" + bucket._name + \"`.* FROM `\" + bucket._name + \"` WHERE type = 'person'\";\r\n    var query = Couchbase.N1qlQuery.fromString(statement);\r\n    bucket.query(query, (error, result) =&gt; {\r\n        if(error) {\r\n            response = {\r\n                statusCode: 500,\r\n                body: JSON.stringify({\r\n                    code: error.code,\r\n                    message: error.message\r\n                })\r\n            };\r\n            return callback(null, response);\r\n        }\r\n        response = {\r\n            statusCode: 200,\r\n            body: JSON.stringify(result)\r\n        };\r\n        callback(null, response);\r\n    });\r\n};<\/pre>\n<p>El objetivo con el <code>recuperar<\/code> es usar N1QL para consultar todos los documentos en Couchbase y devolverlos. Dependiendo del resultado, formateamos la respuesta Lambda apropiadamente. Ten en cuenta que estamos alterando el\u00a0<code>callbackWaitsForEmptyEventLoop<\/code> valor. Esto ocurrir\u00e1 en cada una de nuestras funciones.<\/p>\n<p>C\u00f3mo estructuramos el <code>actualizaci\u00f3n<\/code> ser\u00e1 similar a c\u00f3mo estructuramos la funci\u00f3n <code>crear<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">module.exports.update = (event, context, callback) =&gt; {\r\n    context.callbackWaitsForEmptyEventLoop = false;\r\n    var schema = Joi.object().keys({\r\n        firstname: Joi.string().optional(),\r\n        lastname: Joi.string().optional()\r\n    });\r\n    var data = JSON.parse(event.body);\r\n    var response = {};\r\n    var validation = Joi.validate(data, schema);\r\n    if(validation.error) {\r\n        response = {\r\n            statusCode: 500,\r\n            body: JSON.stringify(validation.error.details)\r\n        };\r\n        return callback(null, response);\r\n    }\r\n    var builder = bucket.mutateIn(event.pathParameters.id);\r\n    if(data.firstname) {\r\n        builder.replace(\"firstname\", data.firstname);\r\n    }\r\n    if(data.lastname) {\r\n        builder.replace(\"lastname\", data.lastname);\r\n    }\r\n    builder.execute((error, result) =&gt; {\r\n        if(error) {\r\n            response = {\r\n                statusCode: 500,\r\n                body: JSON.stringify({\r\n                    code: error.code,\r\n                    message: error.message\r\n                })\r\n            };\r\n            return callback(null, response);\r\n        }\r\n        response = {\r\n            statusCode: 200,\r\n            body: JSON.stringify(data)\r\n        };\r\n        callback(null, response);\r\n    });\r\n};<\/pre>\n<p>F\u00edjate que empezamos haciendo una validaci\u00f3n de datos basada en nuestro esquema. Si los datos se consideran v\u00e1lidos, podemos proceder a realizar operaciones de subdocumento contra Couchbase:<\/p>\n<pre class=\"lang:default decode:true\">var builder = bucket.mutateIn(event.pathParameters.id);\r\nif(data.firstname) {\r\n    builder.replace(\"firstname\", data.firstname);\r\n}\r\nif(data.lastname) {\r\n    builder.replace(\"lastname\", data.lastname);\r\n}\r\nbuilder.execute((error, result) =&gt; {\r\n    if(error) {\r\n        response = {\r\n            statusCode: 500,\r\n            body: JSON.stringify({\r\n                code: error.code,\r\n                message: error.message\r\n            })\r\n        };\r\n        return callback(null, response);\r\n    }\r\n    response = {\r\n        statusCode: 200,\r\n        body: JSON.stringify(data)\r\n    };\r\n    callback(null, response);\r\n});<\/pre>\n<p>Esencialmente estamos creando un constructor de mutaciones basado en la informaci\u00f3n encontrada en la solicitud. Las mutaciones a\u00f1adidas ocurrir\u00e1n contra una clave cuando se ejecuten. El resultado de la ejecuci\u00f3n ser\u00e1 devuelto como una respuesta de Lambda.<\/p>\n<p>Toma nota de lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">event.pathParameters.id<\/pre>\n<p>Estos datos no proceden del cuerpo. Se configurar\u00e1 en uno de los pr\u00f3ximos pasos.<\/p>\n<p>Ahora nos queda <code>borrar<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">module.exports.delete = (event, context, callback) =&gt; {\r\n    context.callbackWaitsForEmptyEventLoop = false;\r\n    var schema = Joi.object().keys({\r\n        id: Joi.string().required()\r\n    });\r\n    var data = JSON.parse(event.body);\r\n    var response = {};\r\n    var validation = Joi.validate(data, schema);\r\n    if(validation.error) {\r\n        response = {\r\n            statusCode: 500,\r\n            body: JSON.stringify(validation.error.details)\r\n        };\r\n        return callback(null, response);\r\n    }\r\n    bucket.remove(data.id, (error, result) =&gt; {\r\n        if(error) {\r\n            response = {\r\n                statusCode: 500,\r\n                body: JSON.stringify({\r\n                    code: error.code,\r\n                    message: error.message\r\n                })\r\n            };\r\n            return callback(null, response);\r\n        }\r\n        response = {\r\n            statusCode: 200,\r\n            body: JSON.stringify(data)\r\n        };\r\n        callback(null, response);\r\n    });\r\n};<\/pre>\n<p>Si te has mantenido al tanto de todo hasta ahora, el <code>borrar<\/code> no le parecer\u00e1 nada nuevo. Estamos validando datos y ejecut\u00e1ndolos contra la base de datos.<\/p>\n<p>Con las funciones creadas, podemos centrarnos en la informaci\u00f3n de configuraci\u00f3n del Serverless Framework. Abre el archivo\u00a0<strong>serverless.yml<\/strong> e incluya lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">service: couchbase-lambda\r\n\r\nprovider:\r\n  name: aws\r\n  runtime: nodejs6.10\r\n\r\nfunctions:\r\n  create:\r\n    handler: handler.create\r\n    events:\r\n        - http:\r\n            path: create\r\n            method: post\r\n  retrieve:\r\n    handler: handler.retrieve\r\n    events:\r\n        - http:\r\n            path: retrieve\r\n            method: get\r\n  update:\r\n    handler: handler.update\r\n    events:\r\n        - http:\r\n            path: update\/{id}\r\n            method: put\r\n  delete:\r\n    handler: handler.delete\r\n    events:\r\n        - http:\r\n            path: delete\r\n            method: delete<\/pre>\n<p>La parte m\u00e1s importante del documento YAML anterior son las funciones. Hemos nombrado cada funci\u00f3n y las hemos vinculado a la funci\u00f3n manejadora apropiada. La direcci\u00f3n <code>eventos<\/code> son la forma en que se invocar\u00e1n estas funciones desde un navegador. La direcci\u00f3n <code>eventos<\/code> son configuraciones para AWS API Gateway.<\/p>\n<p>En el <code>eventos<\/code> definimos la informaci\u00f3n de la ruta, c\u00f3mo se puede acceder a cada endpoint, si es desde una petici\u00f3n GET o una petici\u00f3n POST o algo m\u00e1s, y cualquier tipo de variables de ruta.<\/p>\n<p>\u00bfRecuerdas la frase que te dije que recordaras?:<\/p>\n<pre class=\"lang:default decode:true\">event.pathParameters.id<\/pre>\n<p>Esto se asigna al <code>id<\/code> valor en el <code>actualizar\/{id}<\/code> camino.<\/p>\n<p>En este momento el proyecto est\u00e1 listo para ser desplegado en Amazon Web Services.<\/p>\n<h2>Implementaci\u00f3n de las funciones en AWS Lambda con soporte de API Gateway<\/h2>\n<p>No vamos a entrar en el meollo de la cuesti\u00f3n cuando se trata de configurar Serverless Framework con sus claves p\u00fablicas y privadas de Amazon, pero nos preocuparemos por el despliegue, suponiendo que est\u00e9n configuradas.<\/p>\n<p>Desde la CLI de Serverless Framework, ejecute lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">serverless deploy<\/pre>\n<p>El comando anterior tomar\u00e1 el c\u00f3digo de las funciones as\u00ed como el <strong>node_modules<\/strong> que se generaron a partir del contenedor Docker de Amazon Linux, y empujarlos a la nube de AWS. Serverless Framework se preocupar\u00e1 de configurar AWS Lambda y API Gateway bas\u00e1ndose en lo que hab\u00eda en el archivo\u00a0<strong>serverless.yml<\/strong> archivo.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Acaba de ver c\u00f3mo comunicarse con <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a> a partir de un conjunto de funciones controladas por AWS Lambda y AWS API Gateway. Esto es \u00fatil si quieres crear aplicaciones que se facturen por el tiempo que se utilizan en lugar de por el tiempo que est\u00e1n activas. Incluir Couchbase no fue muy diferente a incluirlo en cualquier otra aplicaci\u00f3n Node.js, con la excepci\u00f3n de las dependencias nativas de Node.js.<\/p>\n<p>Si decides usar Couchbase en la nube, aseg\u00farate de que los puertos correctos est\u00e1n abiertos para Lambda. Yo comet\u00ed el error de olvidarme de abrir todos los puertos que requer\u00eda el SDK y me retras\u00f3 un poco.<\/p>\n<p>Para obtener m\u00e1s informaci\u00f3n sobre el uso de Couchbase Server, consulte la p\u00e1gina <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener\">Portal para desarrolladores de Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>There has been a lot of buzz around functions as a service (FaaS), commonly referred to as serverless. A popular provider for these functions is Amazon with its AWS Lambda service. One could create a function in any of the [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1816,9327,1822],"tags":[10124,2115,1543,2100,2099],"ppma_author":[9032],"class_list":["post-4345","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-javascript","category-node-js","tag-amazon-web-services-aws","tag-faas","tag-javascript","tag-lambda","tag-serverless"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Use AWS Lambda &amp; API Gateway with Node.js, Couchbase NoSQL<\/title>\n<meta name=\"description\" content=\"Learn how to use AWS Lambda and API Gateway with Couchbase Server to create an affordable and scalable API powered by Amazon functions.\" \/>\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\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Use AWS Lambda and API Gateway with Node.js and Couchbase NoSQL\" \/>\n<meta property=\"og:description\" content=\"Learn how to use AWS Lambda and API Gateway with Couchbase Server to create an affordable and scalable API powered by Amazon functions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-09T15:00:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:40:47+00:00\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Use AWS Lambda and API Gateway with Node.js and Couchbase NoSQL\",\"datePublished\":\"2018-01-09T15:00:14+00:00\",\"dateModified\":\"2025-06-14T03:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\"},\"wordCount\":1453,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Amazon Web Services (AWS)\",\"faas\",\"javascript\",\"lambda\",\"serverless\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"JavaScript\",\"Node.js\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\",\"name\":\"Use AWS Lambda & API Gateway with Node.js, Couchbase NoSQL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-01-09T15:00:14+00:00\",\"dateModified\":\"2025-06-14T03:40:47+00:00\",\"description\":\"Learn how to use AWS Lambda and API Gateway with Couchbase Server to create an affordable and scalable API powered by Amazon functions.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Use AWS Lambda and API Gateway with Node.js and Couchbase NoSQL\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Use AWS Lambda & API Gateway with Node.js, Couchbase NoSQL","description":"Aprenda a utilizar AWS Lambda y API Gateway con Couchbase Server para crear una API asequible y escalable impulsada por funciones de Amazon.","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\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","og_locale":"es_MX","og_type":"article","og_title":"Use AWS Lambda and API Gateway with Node.js and Couchbase NoSQL","og_description":"Learn how to use AWS Lambda and API Gateway with Couchbase Server to create an affordable and scalable API powered by Amazon functions.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-01-09T15:00:14+00:00","article_modified_time":"2025-06-14T03:40:47+00:00","author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Use AWS Lambda and API Gateway with Node.js and Couchbase NoSQL","datePublished":"2018-01-09T15:00:14+00:00","dateModified":"2025-06-14T03:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/"},"wordCount":1453,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Amazon Web Services (AWS)","faas","javascript","lambda","serverless"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","JavaScript","Node.js"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","url":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","name":"Use AWS Lambda & API Gateway with Node.js, Couchbase NoSQL","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-01-09T15:00:14+00:00","dateModified":"2025-06-14T03:40:47+00:00","description":"Aprenda a utilizar AWS Lambda y API Gateway con Couchbase Server para crear una API asequible y escalable impulsada por funciones de Amazon.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Use AWS Lambda and API Gateway with Node.js and Couchbase NoSQL"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4345","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4345"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4345\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4345"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}