Skip to content

Latest commit

ย 

History

History
245 lines (166 loc) ยท 7.97 KB

6-lambda.md

File metadata and controls

245 lines (166 loc) ยท 7.97 KB

์กฐ์œจ์ž Lambda

AWS ๊ธฐ๋ฐ˜ ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜ (p149)

  • Lambda์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , Lambda๋Š” ์š”๊ตฌ์— ๋”ฐ๋ผ ๊ทธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ์–ด๋””์„œ ์‹คํ–‰๋˜๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค. (serverless)


์‹ค์Šต : S3 ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ, ๋ฐฐํฌ (P166)

CLI ํ™˜๊ฒฝ์—์„œ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฐฐํฌ โ‡’ CreateFunction ๊ถŒํ•œ์ด ํ•„์š”

1. Lambda-DevOps ๊ทธ๋ฃน์— CreateFunction ๊ถŒํ•œ์„ ์ถ”๊ฐ€

  • IAM -> ๊ทธ๋ฃน -> ๊ถŒํ•œ -> ์ •์ฑ… ํŽธ์ง‘

    img

    img

2. ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

  • ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ ๋ฐ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”

    • cd C:\serverless
    • mkdir get-video-list
    • d get-video-list
    • npm init -y
  • ํ•„์š” ๋ชจ๋“ˆ ์ถ”๊ฐ€

    • npm install aws-sdk
    • npm install async
      • async๋Š” ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์ง€์›ํ•ด์ฃผ๋Š” javascript ๋ชจ๋“ˆ
  • package.json ํŒŒ์ผ์— create, precreate ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€

    • package.json

      {
        "name": "get-video-list",
        "version": "1.0.0",
        "description": "",
        "main": "index.js",
        "scripts": {
          "create": "aws lambda create-function --function-name get-vide-list --handler index.handler --memory-size 128 --runtime nodejs4.3 --role ๋ณธ์ธ์˜_lambda-s3-execution-role-ARN --timeout 3 --publish --zip-file fileb://Lambda-Deployment.zip",
          "precreate": "zip -r Lambda-Deployment.zip * -x *.zip *.log node_modules/aws-sdk/*"
        },
        "keywords": [],
        "author": "",
        "license": "ISC"
      }

3. ๋žŒ๋‹ค ํ•จ์ˆ˜ ์ƒ์„ฑ

  • async ๋ชจ๋“ˆ์˜ watefall() ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•

    • `async_test.js

      // https://caolan.github.io/async/v3/docs.html#waterfall
       
      var async = require("async");
       
      async.waterfall([
          function(firstcallbackfunc) {
              console.log(`์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜`);
              firstcallbackfunc(null, "Peter", "Sam");
          }, 
          function(a1, a2, secondcallbackfunc) {
              console.log(`๋‘๋ฒˆ์งธ ํ•จ์ˆ˜ ${a1}, ${a2}`);
              secondcallbackfunc(null, "Serverless");
          }, 
          function(a3, thirdcallbackfunc) {
              console.log(`์„ธ๋ฒˆ์งธ ํ•จ์ˆ˜ ${a3}`);
              thirdcallbackfunc(null, "Done")
          }
      ], function(err, result) {
          console.log(`์ตœ์ข… ์ฝœ๋ฐฑ ${err}, ${result}`);
      });
  • ๋žŒ๋‹ค ํ•จ์ˆ˜ ์ž‘์„ฑ

    • index.js

      // P172
      'use strict';
       
      // ํ•„์š” ๋ชจ๋“ˆ ์ถ”๊ฐ€ ๋ฐ S3 ๊ฐ์ฒด ์ƒ์„ฑ
      var AWS = require('aws-sdk');
      var async = require('async');
      var s3 = new AWS.S3();
       
      // next : callback ํ•จ์ˆ˜
      // next(ERROR, DATAS, ...)
      // next(null, ...) ==> ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜ํ™˜
      // next(์–ด๋–ค๊ฐ’)    ==> callback ํ•จ์ˆ˜๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜
       
      // S3.listObjects ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์‚ฌ์šฉํ•  ์ž…๋ ฅ ํฌ๋งท์„ ์ƒ์„ฑ
      function createBucketParams(next) {
          var params = {
              Bucket: process.env.BUCKET,
              EncodingType: 'url'
          };
          next(null, params); // #1 ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ
      }
       
      // #1 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด(ํŒŒ์ผ) ๋ชฉ๋ก์„ ์กฐํšŒ
      function getVideosFromBucket(params, next) {
          // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property
          s3.listObjects(params, function(err, data) {
              if (err) {
                  next(err);
              } else {
                  next(null, data); // #2 ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ
              }
          });
      }
       
      // #2 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด ๋ชฉ๋ก ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ ํ˜•์‹์— ๋งž์ถฐ์„œ ๋ณ€ํ˜•
      function createList(data, next) {
          console.log(data); 
       
          // ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด ์ด๋ฆ„(ํด๋”๋ช…๊ณผ ํ™•์žฅ์ž๋ฅผ ํฌํ•จ)์„ ์ €์žฅํ•  ๋ฐฐ์—ด
          var urls = [];
          for (var i = 0; i < data.Contents.length; i ++) {
              var file = data.Contents[i];
              // https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/substr
              // ํ‚ค(๊ฐ์ฒด ์ด๋ฆ„)์˜ ๋งˆ์ง€๋ง‰ ์„ธ๊ธ€์ž๊ฐ€ mp4์ธ ๊ฒฝ์šฐ 
              if (file.Key && file.Key.substr(-3, 3) === 'mp4') {
                  urls.push(file);
              }
          }
       
          var result = {
              baseUrl: process.env.BASE_URL,  // ๋ฒ„ํ‚ท ์ ‘๊ทผ URL
              bucket: process.env.BUCKET,
              urls: urls
          };
       
          next(null, result); // #3 ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
      }
       
      exports.handler = function(event, context, callback) {
          async.waterfall([ 
              createBucketParams, 
              getVideosFromBucket, 
              createList
          ], 
          // #3 ํ•จ์ˆ˜ : [ ... ]์— ์ •์˜๋œ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์ •์ƒ ์ˆ˜ํ–‰ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ํ˜ธ์ถœ
          function(err, result) {
              if (err) {
                  callback(err);
              } else {
                  callback(null, result); // ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ ๊ฐ์ฒด ๋ชฉ๋ก์„ ๋ฒ„ํ‚ท ์ ‘์† ์ฃผ์†Œ, ๋ฒ„ํ‚ท ARN๊ณผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜
              }
          });
      };
  • ๋žŒ๋‹ค ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐ ๋ฐฐํฌ

    • npm run create

      			:
      An error occurred (InvalidParameterValueException) when calling the CreateFunction operation: The runtime parameter of nodejs4.3 is no longer supported for creating or updating AWS Lambda functions. We recommend you use the new runtime (nodejs12.x) while creating or updating functions. โ‡’ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์ด ๋‚ฎ์•„์„œ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ
      npm ERR! code ELIFECYCLE
      npm ERR! errno 254
      npm ERR! get-video-list@1.0.0 create: `aws lambda create-function --function-name get-video-list --handler index.handler --memory-size 128 --runtime nodejs4.3 --role arn:aws:iam::199503606661:role/lambda-s3-execution-role --timeout 3 --publish --zip-file fileb://Lambda-Deployment.zip`
      npm ERR! Exit status 254
      npm ERR!
      npm ERR! Failed at the get-video-list@1.0.0 create script.
      npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
      
      npm ERR! A complete log of this run can be found in:
      npm ERR!     C:\Users\i\AppData\Roaming\npm-cache\_logs\2021-03-17T06_42_58_746Z-debug.log
      
  • ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „ ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ๋žŒ๋‹ค ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐ ๋ฐฐํฌ

    • package.json

      "create": "aws lambda create-function --function-name get-video-list --handler index.handler --memory-size 128 --runtime nodejs12.x --role arn:aws:iam::199503606661:role/lambda-s3-execution-role --timeout 3 --publish --zip-file fileb://Lambda-Deployment.zip",
    • ๋‹ค์‹œ npm run create

      img

8. ํ•จ์ˆ˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

  • ํ•ด๋‹น Lambda์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŽธ์ง‘

    image-20210317161135582

    • BUCKET ํ™˜๊ฒฝ ๋ณ€์ˆ˜ โ‡’ ํŠธ๋žœ์Šค ์ฝ”๋”ฉ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋œ ๋ฒ„ํ‚ท ์ด๋ฆ„
    • BASE_URL ํ™˜๊ฒฝ ๋ณ€์ˆ˜ โ‡’ ํŠธ๋žœ์Šค ์ฝ”๋”ฉ๋œ ๊ฐ์ฒด์— ๊ฐ์ฒด URL์—์„œ ํ‚ค๋ฅผ ์ œ์™ธํ•œ ๋ถ€๋ถ„ โ‡’ https://๋ฒ„ํ‚ท์ด๋ฆ„.s3.amazonaws.com

9. ๋žŒ๋‹ค ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€(ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ)์—์„œ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†์Œ โ‡’ event ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†์Œโ‡’ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ณ„๋„์˜ ๊ฐ’ ์„ค์ •์ด ํ•„์š” ์—†์Œ

img

image-20210317162711991

์š”์•ฝ:

waterfall์™€ ๊ฐ™์€ ํŒจํ„ด ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ

๋กœ์ปฌ ๋ฐ AWS์—์„œ ํ•˜๋Š” Lambda ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ