박태성 IDEASAM
AWS Lambda Layer 로컬테스트부터
배포까지
EC2 후기
● 마치 새로운 PC에 처음부터 세팅하는 느낌
○ Mac과 Linux계열 운영체제를잘 몰랐던 초심자인
상태에서AWS를 접했던 지라,
○ EC2를 터미널로접근하는것도어려웠었고,
○ EC2는 아무것도안 들어있는새로운 PC에 처음부터
세팅하는느낌이라, 하면서 시행착오도겪으며 괜한
에너지를소비하는듯한, 개인적으론(초심자 입장에선)
좋지 않은 느낌을 갖고 있음
○ Auto Scaling과 Bootstrapping 세팅이 어려웠던기억
Lambda 후기
● 웬만한 대규모 트래픽이 아니면 Auto Scaling을
신경 안써도 됨
● 유지보수의 편리함
○ EC2에선 구현된 서버에 에러가 발생하면어디가
문제인지파악하는데에 시간이 조금 걸렸다면,
Lambda에서는 function단위로 CloudWatch에서
직관적인문제파악이가능했던개인적인경험
● 사용한 만큼만 요금 과금
● 개인적으로는Lambda로 모든 서버를 구현
하려 노력함
I luv Lambda
Lambda 제한사항
메모리 할당
● 최대 3008MB
Timeout
● 최대 15분 (900seconds)
호출 페이로드 제한(req and res)
● Sync: 6MB
● Async: 256KB
한도
● 동시요청 제한: 1000건
● 한 region내의 모든 용량의 합: 최대 75Gb
● 한도 증가를 요청하려면 AWS 지원 센터 콘솔을
이용
용량
● Lambda Layer포함 압축 해제되었을 때 총
용량: 250MB
● AWS Console에 Lambda Function을 압축해서
바로 업로드용량 제한: 50MB
● AWS Console에 직접 코딩 시 용량제한: 3MB AWS Documentation: AWS Lambda 제한
○ 함수당 다섯개의 Layer사용 가능
○ 외부 Layer도 import 가 가능함
○ Layer적재 순서대로
overwrite개념으로 동작됨
■ A Layer가 aa.js,
■ B Layer가 aa.js를 동시에 갖고
있다면,
■ Lambda Layer 적재순서가 A ->
B일 경우,
■ B Layer의 aa.js내용으로
덮어씌여짐
○ 버저닝이 가능
■ 버전 삭제 / 권한 회수 이후에도
함수는 계속 동작
Lambda Layer
● Serverless Framework 설치 및 실습 (node.js 기준)
○ https://www.youtube.com/watch?v=jmQClDI0RWI
● Lambda Layer Tutorials
○ https://www.youtube.com/watch?v=aKD9Vftr6i4&t=602s
■ https://github.com/mavi888/layers-test
serverless framework로 Lambda Layer 배포하기
serverless framework으로 Layer만들 때 주의
error in handler.js { Error: Cannot find module 'safe-buffer'
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/opt/node_modules/content-disposition/index.js:23:14)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3) code: 'MODULE_NOT_FOUND' }
- 로컬 테스트 시엔 문제가 없이 돌아가겠지만, AWS 배포환경에서는 아래 타입의 에러가 뜰 것임
const exec = util.promisify(require('child_process').exec);
let { error, stdout, stderr } = await exec('cd /opt && npm ls')
serverless framework으로 Layer만들 때 주의
- 로컬 테스트 시엔 문제가 없이 돌아가겠지만, AWS 배포환경에서는 아래 타입의 에러가 뜰 것임
stderr: 'npm ERR! missing: ms@2.1.1, required by layer_packages@1.0.0
npm ERR! missing: safe-buffer@5.1.2, required by layer_packages@1.0.0
npm ERR! missing: semver@5.6.0, required by aws-xray-sdk-core@2.2.0
npm ERR! missing: semver@5.6.0, required by async-listener@0.6.10
npm ERR! missing: mime-db@1.38.0, required by mime-types@2.1.22
npm ERR! missing: safe-buffer@5.1.2, required by content-disposition@0.5.3
npm ERR! peer dep missing: preact@*, required by unistore@3.2.1
npm ERR! missing: semver@5.6.0, required by @babel/core@7.1.2
npm ERR! missing: safe-buffer@5.1.2, required by
convert-source-map@1.6.0
npm ERR! missing: semver@5.6.0, required by
@babel/plugin-transform-runtime@7.1.0
...
# issue found this link ->
https://github.com/serverless/serverless/issues/3
915
package:
excludeDevDependencies: false
serverless framework으로 Layer만들 때 주의
serverless.yml
- package: excludeDevDependencies: false 옵션을 추가해 주어야 모듈을 제대로 찾을 수 있음
layers:
Utils:
path: layers/utils # required, path to layer contents on disk
name: Layer-${self:provider.stage}-Utils # optional, Deployed
Lambda layer name
description: this is on the /opt directory, you can inject
'{layername}LambdaLayer' in Ref in functions in serverless.yml
compatibleRuntimes:
- nodejs8.10
serverless framework으로 Layer만들 때 주의
$ diff -rq /Users/.../Packages_withoption/node_modules /Users/.../Packages_withoutoption/node_modules
Files /Users/geoseong/.../Packages_withoption/node_modules/.DS_Store and
/Users/geoseong/.../Packages_withoutoption/node_modules/.DS_Store differ
Only in /Users/geoseong/.../Packages_withoption/node_modules/.bin: semver
Only in /Users/geoseong/.../Packages_withoption/node_modules: mime-db
Only in /Users/geoseong/.../Packages_withoption/node_modules: ms
Only in /Users/geoseong/.../Packages_withoption/node_modules: safe-buffer
Only in /Users/geoseong/.../Packages_withoption/node_modules: semver
- excludeDevDependencies 옵션을 주었을 때의 패키지와 주지 않았을 때 패키지의
node_modules구조 비교
● AWS - 이제 AWS Lambda가 사용자 지정 런타임 지원 및 함수 간 공통 코드
공유 가능
● AWS Community Day - Lambda layer로 함수 다이어트 해보기
● AWS Documentation - AWS Lambda 제한
● AWS Documentation - AWS Lambda 계층(Lambda Layer)
● Serverless Framework: AWS - Layers
관련 및 참고 링크
‘Question’ || return ‘Thank you.’;

[AWSKRUG] AWS Lambda Layer 로컬테스트부터 배포까지

  • 1.
    박태성 IDEASAM AWS LambdaLayer 로컬테스트부터 배포까지
  • 2.
    EC2 후기 ● 마치새로운 PC에 처음부터 세팅하는 느낌 ○ Mac과 Linux계열 운영체제를잘 몰랐던 초심자인 상태에서AWS를 접했던 지라, ○ EC2를 터미널로접근하는것도어려웠었고, ○ EC2는 아무것도안 들어있는새로운 PC에 처음부터 세팅하는느낌이라, 하면서 시행착오도겪으며 괜한 에너지를소비하는듯한, 개인적으론(초심자 입장에선) 좋지 않은 느낌을 갖고 있음 ○ Auto Scaling과 Bootstrapping 세팅이 어려웠던기억 Lambda 후기 ● 웬만한 대규모 트래픽이 아니면 Auto Scaling을 신경 안써도 됨 ● 유지보수의 편리함 ○ EC2에선 구현된 서버에 에러가 발생하면어디가 문제인지파악하는데에 시간이 조금 걸렸다면, Lambda에서는 function단위로 CloudWatch에서 직관적인문제파악이가능했던개인적인경험 ● 사용한 만큼만 요금 과금 ● 개인적으로는Lambda로 모든 서버를 구현 하려 노력함 I luv Lambda
  • 3.
    Lambda 제한사항 메모리 할당 ●최대 3008MB Timeout ● 최대 15분 (900seconds) 호출 페이로드 제한(req and res) ● Sync: 6MB ● Async: 256KB 한도 ● 동시요청 제한: 1000건 ● 한 region내의 모든 용량의 합: 최대 75Gb ● 한도 증가를 요청하려면 AWS 지원 센터 콘솔을 이용 용량 ● Lambda Layer포함 압축 해제되었을 때 총 용량: 250MB ● AWS Console에 Lambda Function을 압축해서 바로 업로드용량 제한: 50MB ● AWS Console에 직접 코딩 시 용량제한: 3MB AWS Documentation: AWS Lambda 제한
  • 4.
    ○ 함수당 다섯개의Layer사용 가능 ○ 외부 Layer도 import 가 가능함 ○ Layer적재 순서대로 overwrite개념으로 동작됨 ■ A Layer가 aa.js, ■ B Layer가 aa.js를 동시에 갖고 있다면, ■ Lambda Layer 적재순서가 A -> B일 경우, ■ B Layer의 aa.js내용으로 덮어씌여짐 ○ 버저닝이 가능 ■ 버전 삭제 / 권한 회수 이후에도 함수는 계속 동작 Lambda Layer
  • 5.
    ● Serverless Framework설치 및 실습 (node.js 기준) ○ https://www.youtube.com/watch?v=jmQClDI0RWI ● Lambda Layer Tutorials ○ https://www.youtube.com/watch?v=aKD9Vftr6i4&t=602s ■ https://github.com/mavi888/layers-test serverless framework로 Lambda Layer 배포하기
  • 6.
    serverless framework으로 Layer만들때 주의 error in handler.js { Error: Cannot find module 'safe-buffer' at Function.Module._resolveFilename (module.js:547:15) at Function.Module._load (module.js:474:25) at Module.require (module.js:596:17) at require (internal/module.js:11:18) at Object.<anonymous> (/opt/node_modules/content-disposition/index.js:23:14) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) code: 'MODULE_NOT_FOUND' } - 로컬 테스트 시엔 문제가 없이 돌아가겠지만, AWS 배포환경에서는 아래 타입의 에러가 뜰 것임
  • 7.
    const exec =util.promisify(require('child_process').exec); let { error, stdout, stderr } = await exec('cd /opt && npm ls') serverless framework으로 Layer만들 때 주의 - 로컬 테스트 시엔 문제가 없이 돌아가겠지만, AWS 배포환경에서는 아래 타입의 에러가 뜰 것임 stderr: 'npm ERR! missing: ms@2.1.1, required by layer_packages@1.0.0 npm ERR! missing: safe-buffer@5.1.2, required by layer_packages@1.0.0 npm ERR! missing: semver@5.6.0, required by aws-xray-sdk-core@2.2.0 npm ERR! missing: semver@5.6.0, required by async-listener@0.6.10 npm ERR! missing: mime-db@1.38.0, required by mime-types@2.1.22 npm ERR! missing: safe-buffer@5.1.2, required by content-disposition@0.5.3 npm ERR! peer dep missing: preact@*, required by unistore@3.2.1 npm ERR! missing: semver@5.6.0, required by @babel/core@7.1.2 npm ERR! missing: safe-buffer@5.1.2, required by convert-source-map@1.6.0 npm ERR! missing: semver@5.6.0, required by @babel/plugin-transform-runtime@7.1.0 ...
  • 8.
    # issue foundthis link -> https://github.com/serverless/serverless/issues/3 915 package: excludeDevDependencies: false serverless framework으로 Layer만들 때 주의 serverless.yml - package: excludeDevDependencies: false 옵션을 추가해 주어야 모듈을 제대로 찾을 수 있음 layers: Utils: path: layers/utils # required, path to layer contents on disk name: Layer-${self:provider.stage}-Utils # optional, Deployed Lambda layer name description: this is on the /opt directory, you can inject '{layername}LambdaLayer' in Ref in functions in serverless.yml compatibleRuntimes: - nodejs8.10
  • 9.
    serverless framework으로 Layer만들때 주의 $ diff -rq /Users/.../Packages_withoption/node_modules /Users/.../Packages_withoutoption/node_modules Files /Users/geoseong/.../Packages_withoption/node_modules/.DS_Store and /Users/geoseong/.../Packages_withoutoption/node_modules/.DS_Store differ Only in /Users/geoseong/.../Packages_withoption/node_modules/.bin: semver Only in /Users/geoseong/.../Packages_withoption/node_modules: mime-db Only in /Users/geoseong/.../Packages_withoption/node_modules: ms Only in /Users/geoseong/.../Packages_withoption/node_modules: safe-buffer Only in /Users/geoseong/.../Packages_withoption/node_modules: semver - excludeDevDependencies 옵션을 주었을 때의 패키지와 주지 않았을 때 패키지의 node_modules구조 비교
  • 10.
    ● AWS -이제 AWS Lambda가 사용자 지정 런타임 지원 및 함수 간 공통 코드 공유 가능 ● AWS Community Day - Lambda layer로 함수 다이어트 해보기 ● AWS Documentation - AWS Lambda 제한 ● AWS Documentation - AWS Lambda 계층(Lambda Layer) ● Serverless Framework: AWS - Layers 관련 및 참고 링크
  • 11.
    ‘Question’ || return‘Thank you.’;