- SPF
- CKA
- kubernetesstudyguide
- SAA-CO3
- Kubernetes
- SMTP
- gochannel
- DKIM
- eventbridge
- Java
- go
- DevOps
- Lambda
- EKS
- nodeaffinity
- JVM
- cloudnative
- containerorchestration
- aws
- K8S
- Datadog
- aws ses
- Certified Solutions Architect
- 메일 인증 프로토콜
- kubernetesadmin
- Fargate
- SAA-CO2
- kubernetesscheduling
- dMarc
- Today
- Total
DevOps Tasks
AWS Step Functions 를 이용한 Lambda 처리 전략 본문
Overview
기존 시스템에서는 Lambda 간 호출과 API Gateway에서 발생하는 Timeout 문제로 인해 안정성과 성능 저하를 경험했습니다.
특히, Lambda 함수 간 호출 시 외부 네트워크 경로를 거치며 발생하는 Timeout 제한과 GPT 전처리 작업의 추가로 인해 API Gateway의 Timeout이 빈번하게 발생했습니다.
이를 해결하기 위해 AWS Step Functions를 도입하여 Lambda 호출 간 발생하는 타임아웃을 해결하고, 동시에 시스템의 동시성 제어 및 성능을 최적화했습니다.
Step Functions의 비동기 처리와 병렬 작업 관리를 통해 API Gateway의 제한을 극복하고 Lambda의 과부하를 방지하며, 작업 재시도 및 대기 기능으로 시스템의 안정성을 더욱 강화했습니다.
Step Functions 도입 전후의 주요 문제점과 해결 방법을 아래에서 자세히 살펴보겠습니다.
문제점 정리
Lambda 간 호출 시 Timeout 발생
- 문제 : Lambda 함수가 다른 Lambda 함수를 호출할 때, 호출 경로가 외부 네트워크를 거치며 TimeOut (350초 제한)이 발생.
- 원인 : NAT Gateway를 통한 호출이 이루어져 TimeOut에 걸림.
- 영향 : Lambda 간 호출 실패로 시스템 성능 저하 및 지연 발생.
GPT 전처리 작업으로 인한 API Gateway Timeout 문제
- 문제 : 기존 API에 GPT 전처리 작업이 추가되면서, 전처리 작업 시간이 30초 이상 소요됨.
- 원인 : GPT 전처리 작업이 복잡해 처리 시간이 길어졌고, API Gateway의 최대 TimeOut 제한 (29초)을 초과함.
- 영향 : API Gateway에서 Timeout 발생으로 인해 요청 실패.
Lambda 간 호출 Timeout 문제 해결 Flow
1. ListExecutions 단계
- 먼저, 현재 실행 중인 다른 Step Function 작업들을 조회합니다.
- 이 과정에서 RUNNING 상태인 실행 목록을 가져옵니다.
2. CountExecutions 단계
- 실행 중인 Step Function의 개수를 계산하여 count 변수에 저장합니다.
3. CheckExecutionLimit 단계
- 실행 중인 작업이 10개 이하인지 확인합니다.
- 10개 이하일 경우, 다음 단계인 renderer로 진행합니다.
- 10개 초과 시, WaitAndRetry 단계로 이동합니다.
4. WaitAndRetry 단계
- 실행 중인 작업이 10개를 초과하면, 60초 대기 후 다시 ListExecutions 단계로 돌아가 재시도합니다.
5. Renderer 단계
- 실행 중인 작업이 10개 이하일 경우, 각 rendererInputs 항목에 대해 병렬로 PDF 렌더링 작업을 수행합니다.
- 이 작업은 Lambda 함수를 호출해 처리됩니다.
- Lambda 호출 실패 시, 최대 3번 재시도하며, 재시도 간격은 기하급수적으로 증가합니다.
- 기하급수적 "BackoffRate": 2
- BackoffRate가 2일 경우, 재시도 간격이 매번 2배로 증가
- 기하급수적 "BackoffRate": 2
6. Merger-Compressor 단계
- 모든 렌더링이 완료되면, 렌더링 된 파일들을 병합하고 압축하는 Lambda 함수를 호출하여 마지막 작업을 수행합니다.
- 이 단계에서도 실패 시 최대 3번 재시도합니다.
이점
Lambda 함수의 동시성 제어
- 동시 실행 제한 : 작업 수를 10개 이하로 제한해 Lambda 함수의 과도한 실행을 방지.
- 리소스 과부하 방지 : 동시 실행 제한을 통해 Lambda 리소스를 안정적으로 유지하고 비용을 절감.
타임아웃 및 재시도 관리
- 재시도 로직 : Lambda 오류 시 최대 3회 자동 재시도하며, 재시도 간격은 기하급수적으로 증가.
- 타임아웃 해결 : Step Functions의 재시도 정책으로 Lambda 타임아웃 문제 완화.
병렬 처리 및 효율성
- 병렬 작업 관리 : 여러 PDF 작업을 병렬로 처리해 속도 및 처리 효율을 극대화.
- 효율성 향상 : 병렬 처리와 상태 관리를 통해 Lambda 호출 최적화.
대기 및 시스템 안정성 관리
- Wait & Retry : 동시 실행 제한에 도달할 경우 대기 후 재시도해 시스템 과부하를 방지.
비용 관리
- Lambda 비용 절감 : 동시 실행 제한과 재시도를 통해 불필요한 재실행과 오류로 인한 추가 비용 절감.
GPT 전처리 작업으로 인한 API Gateway Timeout 문제 해결 요약
1. ListExecutions
- 현재 실행 중인 다른 Step Functions 작업을 조회합니다.
- 이 단계에서는 RUNNING 상태인 작업 목록을 가져와서, 현재 얼마나 많은 작업이 동시에 실행되고 있는지 확인합니다.
2.CountExecutions
- 조회된 Step Function 작업의 개수를 계산하여, 이 개수를 기준으로 다음 단계에서 작업이 진행될지 대기할지를 결정합니다.
3. CheckExecutionLimit
- 실행 중인 작업의 개수가 3개 이하일 경우, 다음 전처리 작업 단계로 넘어갑니다.
- 3개를 초과하면, WaitAndRetry 단계로 이동해 60초 동안 대기한 후 다시 작업 개수를 확인합니다.
- 이는 동시 실행 작업 수를 제어하여 시스템이 과부하에 빠지지 않도록 하는 기능입니다.
4. 병렬 전처리 작업
- customQuestionPreprocessingMap: customQuestionPreprocessingList 배열을 병렬로 처리하며, 각 항목에 대해 Lambda 함수를 호출해 GPT 전처리 작업을 수행합니다.
- ProfilePreprocessingMap: 전처리를 병렬로 처리하는 단계로, 2가지 전처리를 각각 병렬로 실행합니다.
- 이 단계에서는 전처리할 항목이 없을 경우 SkipResumePreprocessing과 SkipCoverLetterPreprocessing 단계를 통해 해당 작업을 건너뜁니다.
- 마지막으로 solverAnalysis 단계에서, 전처리된 데이터를 바탕으로 GPT 분석 작업을 수행합니다.
이점
비동기 처리
- API Gateway의 Timeout 문제 해결 : Step Functions는 작업을 비동기적으로 처리하여 API Gateway의 29초 Timeout 제한을 극복하고, 장시간 소요되는 작업도 안정적으로 수행 가능.
병렬 처리
- 작업 속도 향상 : Step Functions의 Map 상태를 활용해 여러 전처리 작업을 병렬로 처리함으로써, 전반적인 작업 속도가 향상
배열 처리 및 건너뛰기 기능
- 배열 처리 : PreprocessingList 배열을 병렬로 처리하여 각 항목에 대해 GPT 전처리 작업을 수행
- 건너뛰기 기능 : 전처리 항목이 없을 경우, 해당 작업을 자동으로 건너뛰어 불필요한 처리 비용과 시간을 절감
동시성 제어
- Lambda 과부하 방지 및 성능 안정화 : MaxConcurrency 값을 설정하여 병렬로 실행되는 작업 수를 최대 50개로 제한함으로써, Lambda 함수가 과부하에 빠지지 않도록 관리
재시도 및 대기
- 시스템 안정성 확보 : 실행 중인 작업이 너무 많을 경우, WaitAndRetry 단계에서 60초 대기 후 다시 시도하여 동시 실행을 제어
마무리
이번에 AWS Step Functions를 도입하면서 Lambda 호출과 API Gateway 타임아웃 문제를 한 번에 해결할 수 있었습니다.
동시 실행 제한과 병렬 처리를 통해 작업 효율성도 높아졌고, 재시도 기능 덕분에 오류 처리도 한층 안정적이 되었습니다.
덕분에 시스템 성능도 개선되고 비용 절감 효과도 봤습니다.
앞으로 더 복잡한 작업에도 유연하게 대응할 수 있는 기반을 마련했다는 점에서, 확장성 면에서도 큰 이점을 얻을 수 있을 것 같습니다.
'AWS' 카테고리의 다른 글
DynamoDB 데이터를 AWS 데이터 파이프라인으로 QuickSight에서 시각화하기 (0) | 2024.08.04 |
---|---|
Event Driven Architecture with AWS Infra Monitoring (0) | 2024.08.04 |
AWS RDS Proxy 와 Serverless (1) | 2024.03.02 |
AWS Lambda 마스터리북 구매하기 (1) | 2024.01.05 |
AWS ECS Fargate 컨테이너에 노크하고 들어가기 (1) | 2023.12.24 |