개발 환경
TS / AWS_Lambda / AWS_SAM
목적
공통되는 로직을 람다 레이어로 모아놓고, 필요한 코드를 가져다 사용한다.
문제 및 해결책
람다 핸들러에서 레이어에 있는 코드를 어떻게 가져올 것인가
=> /opt/nodejs/node_modules 경로에 람다 레이어 모듈들이 위치하므로, import를 해당 경로로 하되, tsconfig.json 에서 paths 컴파일 옵션을 사용하여 람다 함수가 있는 레포의 코드 경로를 읽을 수 있게 한다.
레포에 적어야 하는 코드를 어떻게 최소화 할 것인가.
=> 레이어 코드에서 tsc -d 를 통해 컴파일 한 index.d.ts 만 가져와서 입력한다. (npm or 깃헙 모듈을 사용하여 휴먼 에러 방지 가능)
esbuild 번들링 에러 해결
=> sam template에서 람다 함수의 번들링을 esbuild로 하는 경우 external속성에 해당 핸들러에서 적어주었던 경로를 적어주어 번들링에서 제외하도록 한다.
개념
람다레이어 작동 방식
코드 또는 데이터를 포함하는 Zip 파일인 람다레이어를 통해 공통된 기능 또는 데이터를 람다 함수에서 쉽게 공유하고, 사용할 수 있다.
람다 함수의 코드는 /var/task 폴더로 다운로드 되고, 레이어의 코드는 /opt 로 추출된다.
람다 레이어는 변경 불가능하고 버전으로 관리되기 때문에 배포를 다시 했을 경우, 업데이트된 버전을 람다 함수에 연결해야 한다.

레이어에서 라이브러리 종속성 포함
람다 레이어는 런타임에 따라 추출되는 폴더가 달라진다. /opt 의 하위 폴더로 형성되며, 각 런타임에 따른 레이어의 경로는 아래 사진과 같다. 만약 레이어 zip 파일에 레이어가 추출되는 경로와 동일하게 폴더를 구성한다면 따로 경로를 명시하지 않아도 람다 함수 코드에서 접근 가능하다.

구현
1. 레이어
1) package.json 작성
구성한 공통 코드에 사용하는 패키지들 기재

2) npm 설치
- $ npm i
3) node_modules 이동
- layer 폴더 생성 $ mkdir layer
- node_modules 폴더 생성 $ mkdir -p layer/nodejs/node_modules
- 폴더 이동 $ mv ./node_modules ./layer/nodjs

4) node_modules 내부 사용할 코드 세팅
- common-handler 폴더 생성
- index.ts 파일 형성
- "module" 옵션은 node16 또는 commonjs 로 설정/ "noEmit"는 false로 해야 esbuild로 번들링된 람다 코드와 호환 가능하다.

- js 파일 형성 $ tsc
- 타입 파일 형성 $ tsc --declaration (tsc -d)
5) template.yaml 작성

6) 배포하기
- $ sam build
- $ sam deploy --guided (첫 배포 이후에는 sam deploy 명령어만 사용)
2. 레이어 코드 활용하기
1) index.d.ts 생성
- 타입스크립트를 활용한다면 레이어에서 가져올 코드의 타입이 필수적이다. (ex. src/common/index.d.ts)
- 1-4 에서 생성된 index.d.ts 복붙
2) 레이어에 위치한 공용 코드 모듈 가져오기
import { commonCode } from "/opt/nodejs/node_modules/common-handler"
3) tsconfig.json 파일 paths 설정
- 위에서 import 한 경로 ("/opt~" )는 현재 없는 경로이므로, 실제로 타입을 구현한 코드가 위치한 경로("./src/common") 을 설정해준다
"path" : {
"/opt/nodejs/node_modules/common-handler":[
"./src/common"
]
}
4) sam template.yaml 적용
- AWS SAM Resource AWS::Serverless::Function 예시 참조
# some lambda function
# AWS TEST Function
Resource:
AWSTestFunction
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Layers:
- Ref: "ARN of Common Layer"
Events:
ApiEvent:
Type: Api
Properties:
Path: /path
Method: get
# bundling by esbuild & setting for using layer code
Metadata:
BuildMethod: esbuild
BuildProperties:
UseNpmCi: true
EntryPoints:
- handler.ts
External:
- sqlite3
- "/opt/nodejs/node_modules/common-handler"
참고 문서
'Dev > AWS' 카테고리의 다른 글
람다레이어로 sharp 패키지 활용하여 이미지 리사이징 하기 (0) | 2024.04.13 |
---|---|
AWS Lambda 사용 시 Cognito 를 활용한 인증 인가 구현 (0) | 2023.06.03 |
typescript & aws lambda 환경에서 s3 이미지 리사이징 최적화 (0) | 2023.04.08 |
AWS CLI (Command Line Interface) (0) | 2023.01.29 |
[AWS] 클라우드 서비스의 이해 AWS (0) | 2022.09.07 |