aws sam, lambda 정리

  • nodejs 람다 기준

sam

  • sam cli로 로컬에서 람다를 작성하고 배포할 수 있다

실행환경

  • /var/task 에서 람다 함수가 실행된다
  • /opt/nodejs 에 레이어가 적재된다
  • /tmp 디렉터리는 유일한 쓰기 디렉터리이다
  • /tmp 디렉터리의 용량은 512MB이다
  • /tmp 디렉터리는 일회성이다

로컬에서 테스트

  • sam local start-api로 로컬에서 람다를 테스트해볼 수 있다
  • --skip-pull-image 옵션을 주어 실행 시간을 단축시킬 수 있다
  • 로컬에서 실행할 때 도커가 필요하다
  • 참고로 람다는 아마존 리눅스 2 환경에서 돌아간다

빌드

  • sam build 명령으로 설치되는 패키지에는 devDependencies가 포함되지 않는다

레이어

  • 레이어는 종속성을 따로 관리할 수 있게 해 준다
  • 노드 모듈은 웬만하면 레이어로 빼는 게 맞는 것 같다
  • 람다 노드 모듈 폴더를 포함하여 배포되면 용량이 커져서 브라우저에서 코드 조회를 할 수 없다
  • 공통적으로 자주 사용되는 패키지들을 묶어서 재사용할 수 있다
  • 레이어로 사용할
  • devDependencies가 포함되건 말건 상관없다면 심볼릭 링크를 사용하는 것도 나쁘지 않은 것 같다 참고

레이어 (내가 만든 모듈)

  • 내가 제작한 모듈도 레이어로 뺄 수 있다
  • sam project 루트 디렉터리를 기준으로 /opt/nodejs 에 내 모듈을 작성한다 (ex. /opt/nodejs/myModule.js)
  • sam project 루트 디렉터리에서 jsconfig.json를 다음과 같이 한다 (없으면 생성)
jsconfig.json
1
2
3
4
5
6
7
8
9
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"*": ["./opt/nodejs/*"]
}
},
"exclude": ["node_modules", "build"]
}
  • 이를 임포트 해서 사용하는 파일에서는
app.js
1
const myModule = require('myModule');
  • 이런 식으로 불러와 사용할 수 있다
  • 자동 완성도 잘 작동한다

레이어 yaml 설정

tmplate.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: functions/hello-world/
Handler: app.lambdaHandler
Runtime: nodejs12.x
Layers:
- !Ref MyModuleLayer
- !Ref HelloWorldFunctionLayer
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
# ...
HelloWorldFunctionLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: HelloWorldFunctionLayer
Description: Dependencies for SAM
ContentUri: layer/HelloWorldFunction
CompatibleRuntimes:
- nodejs12.x
LicenseInfo: 'MIT'
RetentionPolicy: Retain

MyModuleLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: my-layer
Description: Dependencies for SAM
ContentUri: opt
CompatibleRuntimes:
- nodejs12.x
LicenseInfo: 'MIT'
RetentionPolicy: Retain
  • 이런 식으로 리소스에 레이어를 작성한다

참고

Author

chinsung

Posted on

2021-01-05

Updated on

2021-08-04

Licensed under

댓글