{"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\/ko\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","title":{"rendered":"Node.js \ubc0f Couchbase NoSQL\uacfc \ud568\uaed8 AWS Lambda \ubc0f API \uac8c\uc774\ud2b8\uc6e8\uc774 \uc0ac\uc6a9"},"content":{"rendered":"<p>\uc77c\ubc18\uc801\uc73c\ub85c \uc11c\ubc84\ub9ac\uc2a4\ub77c\uace0 \ubd88\ub9ac\ub294 \uc11c\ube44\uc2a4\ud615 \uae30\ub2a5(FaaS)\uc5d0 \ub300\ud55c \ub9ce\uc740 \ub17c\uc758\uac00 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 \uc778\uae30 \uc788\ub294 \uacf5\uae09\uc5c5\uccb4\ub85c\ub294 Amazon\uc774 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/aws.amazon.com\/lambda\" target=\"_blank\" rel=\"noopener\">AWS \ub78c\ub2e4<\/a> \uc11c\ube44\uc2a4. \uc9c0\uc6d0\ub418\ub294 \ub78c\ub2e4 \uae30\uc220(\uc608: Node.js)\ub85c \ud568\uc218\ub97c \uc0dd\uc131\ud558\uace0, AWS Lambda\uc5d0 \ubc30\ud3ec\ud558\uace0, AWS API \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ud1b5\ud574 \uc561\uc138\uc2a4\ud558\uace0, \uc218\uc694\uc5d0 \ub9de\uac8c \uc790\uccb4\uc801\uc73c\ub85c \ud655\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>AWS Lambda\uc640 \ud568\uaed8 Node.js\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uac19\uc740 \ud50c\ub808\uc774\ubc84\uc5d0\uc11c NoSQL \ubb38\uc11c\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc788\ub294 \ud568\uc218\ub97c \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>\uc55e\uc73c\ub85c\ub294 \ud074\ub77c\uc6b0\ub4dc \uc5b4\ub518\uac00\uc5d0\uc11c \uc2e4\ud589 \uc911\uc778 \ud074\ub7ec\uc2a4\ud130 \ub610\ub294 \ub2e8\uc77c \uc778\uc2a4\ud134\uc2a4\uc758 Couchbase Server\uac00 \uc788\ub2e4\uace0 \uac00\uc815\ud569\ub2c8\ub2e4. \uc989, \ub85c\uceec \ucef4\ud4e8\ud130\uc5d0\uc11c Couchbase\ub97c \uc2e4\ud589\ud558\ub294 \uacbd\uc6b0 \uc774 \ud504\ub85c\uc81d\ud2b8\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc774 \ud504\ub85c\uc81d\ud2b8\ub294 AWS\uc5d0\uc11c \uc2e4\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 Couchbase\uac00 EC2 \uc778\uc2a4\ud134\uc2a4\ub85c \uc874\uc7ac\ud558\ub294 \uac83\uc774 \ud569\ub9ac\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/deploy-couchbase-server-minutes-amazon-web-services\/\" target=\"_blank\" rel=\"noopener\">\uc0ac\uc6a9 \uac00\ub2a5\ud55c AMI \uc0ac\uc6a9<\/a>.<\/p>\n<h2>\uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c\ub85c Lambda \ubc0f API \uac8c\uc774\ud2b8\uc6e8\uc774\uc6a9 FaaS \ud504\ub85c\uc81d\ud2b8 \ub9cc\ub4e4\uae30<\/h2>\n<p>\uc774\uc804\uc5d0 AWS Lambda \ubc0f AWS API Gateway\ub85c \uc791\uc5c5\ud574 \ubcf8 \uc801\uc774 \uc788\ub2e4\uba74, \ucc98\uc74c\ubd80\ud130 \ubb34\uc5b8\uac00\ub97c \uc2dc\uc791\ud55c \ub2e4\uc74c \ubc30\ud3ec\ud558\ub294 \uac83\uc774 \uadf8\ub2e4\uc9c0 \uc990\uac70\uc6b4 \uacbd\ud5d8\uc774 \uc544\ub2c8\ub77c\ub294 \uac83\uc744 \uc54c\uace0 \uacc4\uc2e4 \uac83\uc785\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc744 \uc870\uae08 \ub354 \uc27d\uac8c \ud558\uae30 \uc704\ud574, \uc800\ud76c\ub294 <a href=\"https:\/\/serverless.com\" target=\"_blank\" rel=\"noopener\">\uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c<\/a>\ub97c \uc0ac\uc6a9\ud558\uba74 \ub78c\ub2e4 \uae30\ub2a5\uc744 \uac1c\ubc1c\ud558\ub294 \ubc29\uc2dd\uc744 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0\ub3c4 \ub9ce\uc740 \uc791\uc5c5\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubbf8 Node.js\uac00 \uc124\uce58\ub418\uc5b4 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uace0 \ub2e4\uc74c\uc744 \uc2e4\ud589\ud558\uc5ec \uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c CLI\ub97c \uac00\uc838\uc635\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">npm install -g serverless<\/pre>\n<p>CLI\ub97c \uc0ac\uc6a9\ud558\uba74 AWS\uc5d0 \uad6d\ud55c\ub418\uc9c0 \uc54a\uace0 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ud15c\ud50c\ub9bf\uc744 \uae30\ubc18\uc73c\ub85c \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. CLI\ub85c \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">serverless create --template aws-nodejs --path .\/my-project<\/pre>\n<p>\uc800\ud76c\ub294 \uc55e\uc73c\ub85c\u00a0<strong>\ub0b4 \ud504\ub85c\uc81d\ud2b8<\/strong> \ub514\ub809\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ubd80\ud130 \uc0c1\ud669\uc774 \uc870\uae08 \uc774\uc0c1\ud574\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Node.js \ud504\ub85c\uc81d\ud2b8\uc5d0\ub294 UUID \uac12 \uc0dd\uc131\uc744 \uc704\ud55c \ud328\ud0a4\uc9c0\uc778 Couchbase SDK\uc640 \ub370\uc774\ud130 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \uc704\ud55c \ud328\ud0a4\uc9c0\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ubb38\uc81c\ub294 \uc81c\uac00 Mac\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uace0 Lambda\uac00 \ud2b9\ubcc4\ud55c \ubc84\uc804\uc758 Linux\ub97c \uc0ac\uc6a9\ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. Mac\uc5d0\uc11c \uc885\uc18d \uc694\uc18c\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uace0 \ud558\uba74 Linux\uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub300\uc2e0 \uba87 \uac00\uc9c0 \ub2e8\uacc4\ub97c \uac70\uccd0\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ub77c\ub294 \uc81c\ubaa9\uc758 \uc628\ub77c\uc778 \uae30\uc0ac\uac00 \uc788\uc2b5\ub2c8\ub2e4,\u00a0<a href=\"https:\/\/instil.co\/2017\/08\/07\/using-native-dependencies-with-aws-lambda\/\" target=\"_blank\" rel=\"noopener\">AWS \ub78c\ub2e4\uc5d0\uc11c \ub124\uc774\ud2f0\ube0c \uc885\uc18d\uc131 \uc0ac\uc6a9<\/a>\uc5d0\uc11c Docker\ub97c \uc0ac\uc6a9\ud558\uc5ec Lambda\uc5d0\uc11c \uc791\ub3d9\ud558\ub294 \ub124\uc774\ud2f0\ube0c \ud504\ub85c\uc81d\ud2b8 \uc885\uc18d\uc131 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc694\uc57d\ud558\uba74, \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8 \ub514\ub809\ud1a0\ub9ac\uc5d0 Docker\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uace0 CLI\uac00 \uc788\ub294 \uc0c1\ud0dc\uc5d0\uc11c \ub2e4\uc74c\uc744 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">docker pull amazonlinux\r\ndocker run -v $(pwd):\/lambda-project -it amazonlinux<\/pre>\n<p>\uc704\uc758 \uba85\ub839\uc740 Amazon Linux \uc774\ubbf8\uc9c0\ub97c \uac00\uc838\uc640 \ucee8\ud14c\uc774\ub108\ub97c \ubc30\ud3ec\ud558\uc5ec \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8 \ub514\ub809\ud130\ub9ac\ub97c \ucee8\ud14c\uc774\ub108 \ubcfc\ub968\uc73c\ub85c \ub9e4\ud551\ud569\ub2c8\ub2e4. \ucee8\ud14c\uc774\ub108 \ub0b4\uc5d0\uc11c Node.js\ub97c \uc124\uce58\ud558\uace0 \ud328\ud0a4\uc9c0 \uc885\uc18d\uc131\uc744 \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\ub824\uba74 \uc774\uc804\uc5d0 \uc791\uc131\ud55c \uae00\uc744 \ud655\uc778\ud558\uc138\uc694,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/12\/deploying-native-nodejs-dependencies-aws-lambda\/\" target=\"_blank\" rel=\"noopener\">AWS Lambda\uc5d0 \ub124\uc774\ud2f0\ube0c Node.js \uc885\uc18d\uc131 \ubc30\ud3ec\ud558\uae30<\/a>.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\uc5d0 \ub2e4\uc74c \uc138 \uac00\uc9c0 \uc885\uc18d\uc131\uc744 \uc124\uce58\ud574\uc57c \ud569\ub2c8\ub2e4:<\/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>Amazon Linux \uc694\uad6c \uc0ac\ud56d \ub54c\ubb38\uc5d0 \uacc4\uc18d \uc9c4\ud589\ud558\uc9c0 \ubabb\ud560 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \ucee8\ud14c\uc774\ub108 \ub0b4\uc5d0\uc11c \uc138 \uac00\uc9c0 \uba85\ub839\uc744 \uc2e4\ud589\ud558\uae30\ub9cc \ud558\uba74 \ub418\uace0 \ucee8\ud14c\uc774\ub108\uc5d0\ub294 \ub9e4\ud551\ub41c \ubcfc\ub968\uc774 \uc788\uc73c\ubbc0\ub85c \uc5bb\uc740 \ubaa8\ub4e0 \ud30c\uc77c\uc740 \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc9c1\uc811 \uc800\uc7a5\ub429\ub2c8\ub2e4.<\/p>\n<h2>NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c CRUD \uc791\uc5c5\uc6a9 \ud568\uc218 \uac1c\ubc1c\ud558\uae30<\/h2>\n<p>\uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c \ud504\ub85c\uc81d\ud2b8\uac00 \uc900\ube44\ub418\uc5c8\uc73c\ub2c8 \uc774\uc81c \uc815\ub9d0 \uc911\uc694\ud55c \uac83\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c \ubaa9\ud45c\ub294 Couchbase NoSQL \ubb38\uc11c \uc0dd\uc131, \uac80\uc0c9, \uc5c5\ub370\uc774\ud2b8 \ubc0f \uc0ad\uc81c\uc5d0 \uac01\uac01 \ud558\ub098\uc529 \ub124 \uac00\uc9c0 \ud568\uc218\ub97c \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4. \ubc14\ub85c CRUD \ud568\uc218 \uc9d1\ud569\uc744 \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\uc758\u00a0<strong>handler.js<\/strong> \ud30c\uc77c\uc744 \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\ud574\uc57c \ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4:<\/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>\uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c\ub294 \ud504\ub85c\uc81d\ud2b8 \uc885\uc18d \uc694\uc18c\ub97c \uac00\uc838\uc624\uace0, Couchbase \ud074\ub7ec\uc2a4\ud130\uc5d0 \uc5f0\uacb0\ud558\uace0, \ud574\ub2f9 \ud074\ub7ec\uc2a4\ud130\ub85c \uc778\uc99d\ud558\uace0, \ud2b9\uc815 \ubc84\ud0b7\uc744 \uc5f4\uc5c8\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c \uc815\ubcf4\ub97c \ubc18\uc601\ud558\ub3c4\ub85d Couchbase \uc815\ubcf4\ub97c \ubcc0\uacbd\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc55e\uc11c \uc5b8\uae09\ud55c \ub124 \uac00\uc9c0 \uae30\ub2a5\ub3c4 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ud604\uc7ac\ub85c\uc11c\ub294 \uc774\ub7ec\ud55c \ud568\uc218\ub294 \uc544\ubb34 \uae30\ub2a5\ub3c4 \uc218\ud589\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc5ec\uae30\uc11c \uc8fc\ubaa9\ud574\uc57c \ud560 \uc911\uc694\ud55c \uc0ac\ud56d\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \ub85c\uc9c1\uc740 \ud568\uc218 \uc678\ubd80\uc5d0\uc11c \uc774\ub8e8\uc5b4\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c \ud638\ucd9c\ud560 \ub54c\ub9c8\ub2e4 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud558\ub294 \uac83\uc740 \ube44\uc6a9\uc774 \ub9ce\uc774 \ub4dc\ub294 \uc791\uc5c5\uc785\ub2c8\ub2e4. \uc774 \uc815\ubcf4\ub97c \uc678\ubd80\ub85c \uc62e\uae30\uba74 \ubaa8\ub4e0 \ub78c\ub2e4 \ud568\uc218 \ucee8\ud14c\uc774\ub108\uc5d0\uc11c \uc5ec\uc804\ud788 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubd80\ud130 \uc2dc\uc791\ud558\uc5ec <code>create<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/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>\uc704\uc758 \ucf54\ub4dc\uc5d0\ub294 \ub9ce\uc740 \uc77c\uc774 \uc77c\uc5b4\ub098\uace0 \uc788\uc73c\ubbc0\ub85c \uc774\ub97c \uc138\ubd84\ud654\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 \ub2e4\uc74c \uc904\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">context.callbackWaitsForEmptyEventLoop = false;<\/pre>\n<p>\uc704\uc758 \uc904\uc744 \ucd94\uac00\ud568\uc73c\ub85c\uc368 \ud568\uc218\uac00 \uc751\ub2f5\uc744 \uae30\ub2e4\ub9ac\ub294 \ubc29\uc2dd\uc744 \ubcc0\uacbd\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. false\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \ub4a4\ub530\ub974\ub294 \ube44\ub3d9\uae30 \uc791\uc5c5\uc740 \uc644\ub8cc\ub418\uae30 \uc804\uc5d0 \uc2dc\uac04 \ucd08\uacfc\ub420 \uac00\ub2a5\uc131\uc774 \ub192\uc2b5\ub2c8\ub2e4.<\/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>\uc0ac\uc6a9\uc790 \uc785\ub825\uc744 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc0dd\uc131\ud560 \uac83\uc774\ubbc0\ub85c \ud574\ub2f9 \uc0ac\uc6a9\uc790 \uc785\ub825\uc758 \uc720\ud6a8\uc131\uc744 \uac80\uc0ac\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud558\uc5ec <a href=\"https:\/\/github.com\/hapijs\/joi\" target=\"_blank\" rel=\"noopener\">Joi<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc720\ud6a8\uc131 \uac80\uc0ac \uc2a4\ud0a4\ub9c8\ub97c \uc0dd\uc131\ud558\uace0 \uc774\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\uc640 \ud568\uaed8 \uc804\ub2ec\ub41c \ub370\uc774\ud130 \ubcf8\ubb38\uc758 \uc720\ud6a8\uc131\uc744 \uac80\uc0ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Joi\ub294 \uc774\uc804 \uae00\uc5d0\uc11c \uc0ac\uc6a9\ud588\ub358 \uc720\ud6a8\uc131 \uac80\uc0ac \ud504\ub808\uc784\uc6cc\ud06c\ub77c\ub294 \uac83\uc744 \uc54c\uace0 \uacc4\uc2e4 \uac83\uc785\ub2c8\ub2e4,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/ko\/create-restful-api-node-js-hapi-couchbase-nosql\/\" target=\"_blank\" rel=\"noopener\">Node.js, Hapi \ubc0f Couchbase NoSQL\ub85c RESTful API \ub9cc\ub4e4\uae30<\/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>\uc720\ud6a8\uc131 \uac80\uc0ac \uc624\ub958\uac00 \uc788\ub294 \uacbd\uc6b0 500 \uc624\ub958\ub97c \uc751\ub2f5\uc73c\ub85c \ub2e4\uc2dc \ubcf4\ub0c5\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \uc0c8 \ubb38\uc11c \ud0a4\ub97c \uc0dd\uc131\ud558\uc5ec Couchbase Server\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4:<\/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>\ub78c\ub2e4\uac00 \uc608\uc0c1\ud558\ub294 \uc751\ub2f5 \ud615\uc2dd\uc5d0 \uc720\uc758\ud558\uc138\uc694. \uc751\ub2f5\uc5d0\ub294 <code>statusCode<\/code> \ubc0f <code>body<\/code>.<\/p>\n<p>\uc774\uc81c <code>\uac80\uc0c9<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/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>\uc758 \ubaa9\ud45c\ub294 <code>\uac80\uc0c9<\/code> \ud568\uc218\ub294 N1QL\uc744 \uc0ac\uc6a9\ud558\uc5ec Couchbase\uc758 \ubaa8\ub4e0 \ubb38\uc11c\ub97c \ucffc\ub9ac\ud558\uace0 \ubc18\ud658\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uacb0\uacfc\uc5d0 \ub530\ub77c \ub78c\ub2e4 \uc751\ub2f5\uc758 \ud615\uc2dd\uc744 \uc801\uc808\ud788 \uc9c0\uc815\ud569\ub2c8\ub2e4. \ucc38\uace0\ub85c \uc6b0\ub9ac\ub294\u00a0<code>callbackWaitsForEmptyEventLoop<\/code> \uac12\uc73c\ub85c \uc124\uc815\ud569\ub2c8\ub2e4. \uc774\ub294 \uac01 \ud568\uc218\uc5d0\uc11c \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/p>\n<p>\uad6c\uc870\ud654 \ubc29\ubc95 <code>\uc5c5\ub370\uc774\ud2b8<\/code> \ud568\uc218\ub97c \uad6c\uc131\ud55c \ubc29\uc2dd\uacfc \uc720\uc0ac\ud569\ub2c8\ub2e4. <code>create<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/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>\uc2a4\ud0a4\ub9c8\ub97c \uae30\ubc18\uc73c\ub85c \uba87 \uac00\uc9c0 \ub370\uc774\ud130 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \uc218\ud589\ud558\ub294 \uac83\uc73c\ub85c \uc791\uc5c5\uc744 \uc2dc\uc791\ud55c\ub2e4\ub294 \uc810\uc5d0 \uc8fc\ubaa9\ud558\uc138\uc694. \ub370\uc774\ud130\uac00 \uc720\ud6a8\ud55c \uac83\uc73c\ub85c \uac04\uc8fc\ub418\uba74 Couchbase\uc5d0 \ub300\ud55c \ud558\uc704 \ubb38\uc11c \uc791\uc5c5\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/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>\uae30\ubcf8\uc801\uc73c\ub85c \uc694\uccad\uc5d0\uc11c \ucc3e\uc740 \uc815\ubcf4\ub97c \uae30\ubc18\uc73c\ub85c \ub3cc\uc5f0\ubcc0\uc774 \ube4c\ub354\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \ucd94\uac00\ub41c \ub3cc\uc5f0\ubcc0\uc774\ub294 \uc2e4\ud589\ub420 \ub54c \ud0a4\uc5d0 \ub300\ud574 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uc2e4\ud589 \uacb0\uacfc\ub294 Lambda\uc758 \uc751\ub2f5\uc73c\ub85c \ubc18\ud658\ub429\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \uc0ac\ud56d\uc5d0 \uc720\uc758\ud558\uc138\uc694:<\/p>\n<pre class=\"lang:default decode:true\">event.pathParameters.id<\/pre>\n<p>\uc774\uac83\uc740 \ubcf8\ubb38\uc5d0\uc11c \uc81c\uacf5\ub418\uc9c0 \uc54a\ub294 \ub370\uc774\ud130\uc785\ub2c8\ub2e4. \ub2e4\uc74c \ub2e8\uacc4 \uc911 \ud558\ub098\uc5d0\uc11c \uad6c\uc131\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \ub0a8\uc740 \uac83\uc740 <code>\uc0ad\uc81c<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/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>\uc9c0\uae08\uae4c\uc9c0 \ubaa8\ub4e0 \ub0b4\uc6a9\uc744 \uc798 \ub530\ub77c\uac00\uc168\ub2e4\uba74 <code>\uc0ad\uc81c<\/code> \ud568\uc218\ub294 \uc804\ud600 \uc0c8\ub86d\uc9c0 \uc54a\uac8c \ubcf4\uc77c \uac83\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\uc758 \uc720\ud6a8\uc131\uc744 \uac80\uc0ac\ud558\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud574 \uc2e4\ud589\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud568\uc218\uac00 \uc0dd\uc131\ub418\uc5c8\uc73c\ubbc0\ub85c \uc774\uc81c \uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c \uad6c\uc131 \uc815\ubcf4\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\uc758\u00a0<strong>\uc11c\ubc84\ub9ac\uc2a4.yml<\/strong> \ud30c\uc77c\uc744 \uc5f4\uace0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud558\uc138\uc694:<\/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>\uc704\uc758 YAML \ubb38\uc11c\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \ubd80\ubd84\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. \uac01 \ud568\uc218\uc5d0 \uc774\ub984\uc744 \ubd99\uc774\uace0 \uc801\uc808\ud55c \ud578\ub4e4\ub7ec \ud568\uc218\uc5d0 \uc5f0\uacb0\ud588\uc2b5\ub2c8\ub2e4. \uac01 \ud568\uc218\uc758 <code>\uc774\ubca4\ud2b8<\/code> \ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \uc774\ub7ec\ud55c \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4. \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c <code>\uc774\ubca4\ud2b8<\/code> \ub294 AWS API \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \ub300\ud55c \uad6c\uc131\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <code>\uc774\ubca4\ud2b8<\/code> \uc139\uc158\uc5d0\uc11c\ub294 \uacbd\ub85c \uc815\ubcf4, \uac01 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\ub294 \ubc29\ubc95(GET \uc694\uccad\uc774\ub4e0 POST \uc694\uccad\uc774\ub4e0 \ub2e4\ub978 \uac83\uc774\ub4e0), \ubaa8\ub4e0 \uc885\ub958\uc758 \uacbd\ub85c \ubcc0\uc218\ub97c \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc81c\uac00 \uae30\uc5b5\ud558\ub77c\uace0 \ud588\ub358 \ub300\uc0ac \uae30\uc5b5\ud558\uc2dc\uc8e0?<\/p>\n<pre class=\"lang:default decode:true\">event.pathParameters.id<\/pre>\n<p>\uc774\uac83\uc740 <code>id<\/code> \uac12\uc758 <code>update\/{id}<\/code> \uacbd\ub85c.<\/p>\n<p>\uc774 \uc2dc\uc810\uc5d0\uc11c \ud504\ub85c\uc81d\ud2b8\ub294 Amazon Web Services\uc5d0 \ubc30\ud3ec\ud560 \uc900\ube44\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>API \uac8c\uc774\ud2b8\uc6e8\uc774 \uc9c0\uc6d0\uc744 \ud1b5\ud574 AWS Lambda\uc5d0 \ud568\uc218 \ubc30\ud3ec\ud558\uae30<\/h2>\n<p>Amazon \uacf5\uac1c \ud0a4 \ubc0f \uac1c\uc778 \ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uad6c\uc131\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c\ub294 \uc790\uc138\ud788 \ub2e4\ub8e8\uc9c0 \uc54a\uaca0\uc9c0\ub9cc, \uad6c\uc131\uc774 \uc644\ub8cc\ub418\uc5c8\ub2e4\ub294 \uac00\uc815 \ud558\uc5d0 \ubc30\ud3ec\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c CLI\uc5d0\uc11c \ub2e4\uc74c\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">serverless deploy<\/pre>\n<p>\uc704\uc758 \uba85\ub839\uc740 \ud568\uc218 \ucf54\ub4dc\uc640 \ud568\uaed8 <strong>node_modules<\/strong> \ub97c \uc0dd\uc131\ud558\uc5ec AWS \ud074\ub77c\uc6b0\ub4dc\ub85c \ud478\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc11c\ubc84\ub9ac\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c\ub294 AWS \ub78c\ub2e4 \ubc0f API \uac8c\uc774\ud2b8\uc6e8\uc774\uc758 \uad6c\uc131\uc5d0 \ub300\ud574 \uac71\uc815\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.\u00a0<strong>\uc11c\ubc84\ub9ac\uc2a4.yml<\/strong> \ud30c\uc77c\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.<\/p>\n<h2>\uacb0\ub860<\/h2>\n<p>\ubc29\uae08 \ucee4\ubba4\ub2c8\ucf00\uc774\uc158\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc168\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84<\/a> \ub97c AWS Lambda \ubc0f AWS API \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0\uc11c \uc81c\uc5b4\ud558\ub294 \ud568\uc218 \uc9d1\ud569\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ud65c\uc131\ud654\ub41c \uc2dc\uac04\uc774 \uc544\ub2c8\ub77c \uc0ac\uc6a9\ub41c \uc2dc\uac04\uc5d0 \ub300\ud574 \uc694\uae08\uc774 \uccad\uad6c\ub418\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4\uace0\uc790 \ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4. \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub97c \ud3ec\ud568\ud558\ub294 \uac83\uc740 \ub124\uc774\ud2f0\ube0c Node.js \uc885\uc18d\uc131\uc744 \uc81c\uc678\ud558\uba74 \ub2e4\ub978 Node.js \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ud3ec\ud568\ud558\ub294 \uac83\uacfc \ud06c\uac8c \ub2e4\ub974\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c Couchbase\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4\uba74 Lambda\uc5d0 \uc62c\ubc14\ub978 \ud3ec\ud2b8\uac00 \uc5f4\ub824 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uc138\uc694. \uc800\ub294 SDK\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 \ud3ec\ud2b8\ub97c \uc5ec\ub294 \uac83\uc744 \uc78a\uc5b4\ubc84\ub9ac\ub294 \uc2e4\uc218\ub97c \uc800\uc9c8\ub800\uace0, \uc774\ub85c \uc778\ud574 \uc57d\uac04\uc758 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 \uc0ac\uc6a9\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/developers\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uac1c\ubc1c\uc790 \ud3ec\ud138<\/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 v25.7.1 (Yoast SEO v25.7) - 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\/ko\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\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\/ko\/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\ubd84\" \/>\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\":\"ko-KR\",\"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\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\",\"@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\/ko\/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":"Learn how to use AWS Lambda and API Gateway with Couchbase Server to create an affordable and scalable API powered by Amazon functions.","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\/ko\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/","og_locale":"ko_KR","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\/ko\/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\ubd84"},"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":"ko-KR","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":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/use-aws-lambda-api-gateway-node-js-couchbase-nosql\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","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":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@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, \uac1c\ubc1c\uc790 \uc639\ud638\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/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","first_name":"Nic","last_name":"Raboy","user_url":"https:\/\/www.thepolyglotdeveloper.com","author_category":"","description":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/4345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=4345"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/4345\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=4345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=4345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=4345"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=4345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}