BLOG
2부로 구성된 ‘서버리스 개발자를 위한 24가지 오픈 소스’의 첫번째 파트에서는 배포 프레임워크, 최상위 서버리스 플러그인, 유용한 CLI 툴에 대해 알아보았습니다. .
그렇다면 오늘은 Node.js에서 AWS Lambda 함수를 작성하기 위해 널리 사용되는 인기 라이브러리를 살펴보고, 여러 가지 잔업을 처리할 수 있는 유용한 AWS 서버리스 애플리케이션 저장소 앱을 소개해 드리겠습니다.
라이브러리
Docker-lambda
Docker-lambda는 다음과 같은 상황에 유용하게 쓰일 수 있습니다.
- AWS SAM(Serverless Application Model’s)의 local invoke 또는 Serverless Framework의 local invoke를 사용하는 경우
- 라이브 AWS Lambda 환경을 복제하는 도커 이미지인 docker-lambda를 이미 사용하는 경우
- 람다 기능을 로컬로 호출하는 것 외에, 기본 종속성을 컴파일해야 할 때
middy
Middy 는 Node.js Lambda 함수를 위한 미들웨어 엔진으로 사용자가 크로스 컷팅 문제를 손쉽게 처리하고 미들웨어로 요약할 수 있습니다. 15개 이상의 내장 미들웨어가 Amazon API Gateway 응답에서 CORS 헤더를 설정하는 것과 같은 일반적인 문제를 해결 합니다.
제가(원문의 저자: Yan Cui) 가장 좋아하는 것은 ssm 과 secretsManager 미들웨어 인데, 이 미들웨어는 Lambda 함수에 secrets을 로드하는 모범 사례를 구현할 수 있습니다.
ssm 과 secretsManager 은 제가 가장 좋아하는 미들웨어 입니다. 이 미들웨어는 secrets을 Lambda 함수에 불러오는 모범 사레를 구현할 수 있습니다. 이 때 저의 첫번째 원칙은 암호화되지 않은 형태의 비밀을 환경 변수에 저장하지 않는 것입니다. 침입자나 악의적인 목적을 가진 누군가가 애플리케이션에 손상을 입힐 경우 이를 가장 먼저 볼 수 있기 때문입니다. 따라서 저는 다음을 제안합니다.
- 콜드 스타트 시 SSM 또는 Secrets Manager에서 secrets을 로드하십시오.
- 호출할때마다 원본에서 읽을 필요가 없도록 secret을 캐싱하십시오.
- 환경변수가 아닌 context 객체에 대한 secret을 설정하십시오.
- 처리기 코드 내부의 context 개체를 통해 secrets에 액세스합니다.
선택적으로 캐시 무효화를 활성화하고 만료 시간을 몇 분 정도로 설정해야 합니다. 이렇게 하면 원본에서 secrets를 회전할 때(해야 하는 경우) 모든 동시 실행이 로컬 캐시가 무효화 되면 자동으로 업데이트됩니다.
Dazn-lambda-powertools
dazn-lambda-powertools 은 NPM 패키지 제품군으로 Node.js에서 빌드 생산 수준의 서버리스 애플리케이션을 쉽게 구축할 수 있도록 해줍니다. 무엇보다도 많은 AWS 서비스와 상관 관계 ID를 자동으로 캡처하고 전달할 수 있습니다. 이 툴을 사용하면 함수는 자동적으로 로그에 상관 관계 ID를 포함시킵니다.
또한 제공된 SDK 클라이언트(공식 AWS SDK 클라이언트를 포함)를 사용하면 이러한 상관 관계 ID가 다운스트림 기능으로 자동 전파됩니다. 현재 지원되는 AWS 서비스는 다음과 같습니다:
Lightweight logger는 JSON을 사용한 구조화된 로깅과 구성 가능한 로그 레벨을 지원합니다. logger를 제품군의 다른 미들웨어와 함께 사용할 경우, 프로덕션에서 디버그 로그의 샘플링을 활성화할 수도 있습니다. 일반적으로 생산 시 WARN 레벨에서 로그에 기록하여 로그의 볼륨 및 로그 처리와 관련된 비용을 절감하실 겁니다. 이는 종종 생산에서 문제가 발생할 때 문제를 신속하게 디버깅할 수 있도록 도와주는 유용한 디버그 로그 메시지를 놓친다는 것을 의미합니다. 샘플링을 통해 프로덕션에서 디버그 로그의 적은 비율을 유지할 수 있으며, 이를 통해 모든 시나리오와 코드 경로 실행을 다룰 수도 있습니다. 이 기능은 문제가 발생할 때 유용하며 디버그 로깅을 활성화하고 애플리케이션을 다시 배포할 필요가 없습니다.
또한 샘플링은 개별 기능보다는 트랜잭션 수준에서 발생한다는 점에 유의해야 합니다. 기본적으로 dazn-lambda-powertools는 트랜잭션의 1%에 대한 디버그 로그를 샘플링합니다. 그렇게 하면 Amazon SNS(Simple Notification Service), Amazon SQS(Simple Queue Service), Amazon EventBridge 등과 같은 비동기 이벤트 소스에 걸쳐 거래가 이루어지더라도 관련 Lambda 함수에서 발생한 모든 것을 볼 수 있습니다.
Python을 사용할 경우, Dazn-lambda-powertools의 일부 기능을 지원하는 Python용 aws-lambda-powertools 프로젝트도 존재합니다.
AWS 서버리스 애플리케이션 Repository apps
마지막으로, AWS 서버리스 애플리케이션 저장소에 있는 몇 가지 유용한 애플리케이션을 소개해 드리겠습니다.
Lambda-janitor
일단 배치되면 lambda-janitor 앱은 모든 리전에서 사용되지 않은 오래된 버전의 함수를 정리할 것입니다. 이렇게 하면 더 이상 75GB 코드 저장 한도를 넘는 문제에 대해 걱정할 필요가 없습니다.
더 이상 필요하지 않은 버전만 삭제하도록 하기 위한 여러 가지 안전 장치가 내장되어 있습니다. 예를 들어 가명으로 참조되는 버전은 삭제되지 않습니다. 또한 최신 버전으로 구성하여 긴급 상황 시 최대한 빠르게 이전 버전으로 롤백하도록 할 수 있습니다.
aws-lambda-power-tuning
AWS developer advocate인 Alex Casalboni가 개발한 aws-lambda-power-tuning 앱은 사용자가 실행할 수 있는 Step Functions 상태 머신을 배치하여 자신의 기능에 맞는 최적의 메모리 설정을 찾을 수 있도록 도와줍니다. 이 점이 lumigo-cli의 powertune-lambda 명령어를 작동시킵니다. lumigo-cli는 AWS Serverless Application Repository 앱을 배포하고 업그레이드하는 작업을 담당하르모 사용자가 항상 최신 버전의 앱에서 실행할 수 있도록 합니다.
Auto-subscribe-log-group-to-arn
auto-subscribe-log-group-to-arn 앱은 이름 그대로 사용자가 구성한 ARN에 Amazon CloudWatch 로그 그룹을 자동으로 구독하며, Lambda, Amazon Kinesis, Amazon Kinesis Data Firehose, or Amazon ES(Elasticsearch Service)가 될 수 있습니다.
배포가 되면 해당 리전의 모든 기존 CloudWatch 로그 그룹을 구성된 대상에 즉시 가입시킬 수 있습니다. 사용자가 직접 새 로그 그룹을 만들거나 새 람다 함수를 만들 때 새 로그 그룹도 대상에 자동으로 가입됩니다. 이 지역의 모든 로그 그룹 구독을 원치 않는 경우 태그뿐만 아니라 접두사별로 특정 로그 그룹을 대상으로 지정할 수 있는 여러 구성이 있습니다.
auto-set-log-group-retention
auto-set-log-group-rention 앱은 로그그룹의 보존정책을 자동으로 업데이트하는 것을 제외하고는 auto-subscribe-log-group-to-arn와 밀접한 관련이 있습니다.
기본적으로 CloudWatch 로그 그룹은 **Never Expire**로 설정이 되어있습니다. 이는CloudWatch가 매월 매월 GB당 0.03달러를 청구하기 때문에 비용에 영향을 줍니다. CloudWatch Logs에 로그를 영구적으로 보관하는 것은 매우 비효율적이며, 특히 다른 곳에서 로그를 발송하는 경우 더욱 그렇습니다.
Sfn-callback-urls
Step Functions를 사용하면 ’테스크 토큰을 사용하여 콜백 패턴 구현하기’를 할 수 있습니다. 하지만 콜백 링크가 포함된 이메일을 보내는 것과 같은 상황에서는 사용이 까다롭기 때문에 콜백 URL을 처리하기 위해 API 게이트웨이와 람다를 추가해야 하는 경우가 많습니다. 이 때 sfn-callback-urls 앱을 사용하면 이를 쉽고 정확하게 처리할 수 있습니다.
요약
이것으로 서버리스 개발자를 위한 24가지 오픈 소스 2부작 시리즈를 마치겠습니다. 앞으로는 소개해드린 오픈소스 툴을 이용하여 AWS와 서버리스 기술을 사용한 작업을 더욱 편리하고 쉽게 진행할 수 있기를 바랍니다.
본 블로그 글에서 언급한 오픈 소스 툴에 대한 보다 더 자세한 내용은 아래의 링크들을 통해 확인해 주시기 바립니다.
배포 프래임워크
서버리스 프레임워크 플러그인
- serverless-iam-roles-per-function
- serverless-webpack
- serverless-offline
- serverless-domain-manager
- serverless-step-functions
- serverless-finch
CLI
라이브러리
AWS 서버리스 애플리케이션 저장소 앱
- lambda-janitor
- aws-lambda-power-tuning
- auto-subscribe-log-group-to-arn
- auto-set-log-group-retention
- sfn-callback-urls
이번 글에서 다루지 못한 좋은 오픈 소스 툴이 아직 더 많이 있습니다. 예를 들어 serverless-appsync-plugin과 같은 도구도 여기서 언급될만한 가치가 있습니다.
오픈 소스 툴은 커뮤니티에 의해 지속되며 발전됩니다. 이러한 툴 중에 여러분과 잘 맞는 도구가 있다면 GitHub에서 리뷰를 남겨주시고 AWS의 커뮤니티에 가입하는 것을 추천 드립니다.
저자 소개
Yan Cui
Yan은 10년 이상 AWS에서 규모가 있는 프로덕션 워크로드를 운영해 온 경험있는 엔지니어입니다. 또한 은행, 전자상거래, 스포츠 스트리밍, 모바일 게임 등 다양한 산업에 걸쳐 아키텍트 겸 기술자로 활동해 왔습니다. 특히 프로덕션 분야에서 AWS 람다와 폭넓게 일해왔으며, 전 세계 고객들이 독립 컨설턴트로 AWS와 서버리스(서버리스)를 채택하는 것을 돕고 있습니다.
Yan은 AWS 서버리스 Hero로서 사용자 그룹과 컨퍼런스에서 국제적으로 정기적 연설을 하고 있습니다. 또한 그는 Production-Ready Serverless (Manning)의 저자 겸 Serverless Architectures on AWS, 2nd Edition (Manning)의 공동저자로 theburningmonk.com에서 활발히 블로그를 운영하고 있습니다. (트위터: @theburningmonk)
원문URL: https://aws.amazon.com/ko/blogs/opensource/24-open-source-tools-for-the-serverless-developer-part-2/
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.