AWS Lambda를 사용하면서 습득한 기본적인 Lambda 사용법과 그 과정에 대해 기록해 보고자 한다 : )
Spring Boot API 상에서 웹용 폰트와 관련된 파일을 생성하는 작업을 맡게 되었는데, 이전의 웹용 폰트 파일 생성은 JavaScript로 된 사내 모듈을 사용했었다. 따라서 API에 폰트 파일 생성 요청이 오면, JavaScript로 된 모듈을 별도 프로세스로 실행시키는 작업을 해야하는데 의존성과 패키지 설치 등의 문제 때문에 그 작업이 쉽지 않았다.
좀 더 깔끔한 방법을 고민하던 중 사수분께서 JavaScript로 된 모듈을 AWS Lambda로 따로 구성하면 현재 API와 독립적으로 구성할 수 있고, S3에 특정 파일을 업로드하면 트리거가 되서 Lambda를 실행시키는 등의 작업도 할 수 있으니 Lambda가 좋을 거 같다는 조언을 해주셨다. 이 말씀에 크게 동감했고, 현재 회사에서도 AWS 서비스를 계속적으로 사용하고 있으니 Lambda로 구성하는 것이 가장 좋겠다는 판단이 들어 진행하게 됐다.
AWS Lambda란 별도의 서버 구축 없이, 빠르고 쉽게 서버를 배포할 수 있고 특정 이벤트가 발생할 때만 코드를 실행시킬 수 있는 Serverless 컴퓨팅 플랫폼이다. 특히 JavaScript, Python과 같은 스크립트 언어로 된 별도 서버를 구축하는 데 용이하고, AWS의 다른 서비스와 다양한 방법으로 함께 사용할 수 있는 장점이 있다.
AWS 공식 문서 링크: https://docs.aws.amazon.com/lambda/latest/dg/welcome.html
Lambda로 빠르고 쉽게 서버를 구축할 수 있다는 장점이 있으나, 디버깅과 같은 코드 레벨에서의 작업은 생산성이 떨어졌다.
파일에 접근하는 경로는 '/tmp' 폴더 경로로 지정하지 않으면 'Permission Denied'가 발생한다.
(Lambda에서는 파일에 접근할 수 있는 경로를 '/tmp' 폴더로 따로 지정하고 있다.)
실제 컴퓨터(머신)에 설치되어 있는 바이너리 파일 등에 접근하는 일을 하려면 별도의 작업이 필요하다.
나는 다음과 같이 S3에 특정 파일이 업로드 됐을 때 트리거를 구성해 Lambda 함수를 실행시켰는데, 테스트 중에 무한 트리거가 되는 경우가 있어서 매우 조심해야겠다고 생각했다.
ex) API에서 S3 특정 bucket에 파일 업로드
→ (트리거) 함수 이벤트 발생 → 함수에서 폰트 파일 생성 후, 해당 bucket에 파일 업로드
→ (트리거) 함수 이벤트 발생 → 함수에서 폰트 파일 생성 후, 해당 bucket에 파일 업로드
→ (트리거) 함수 이벤트 발생 → 함수에서 폰트 파일 생성 후, 해당 bucket에 파일 업로드 ......