실제 올리브영 프로세스가 아닌 임의로 구성된 프로세스입니다.
프로세스
여기서 사용하는 AWS 서비스는 아래 4가지입니다.
- SQS
- Lambda
- EventBrige
- Redis
- Aurora
1. Lambda REDIS에서 쿠폰 데이터 읽음
람다1: 레디스에서 읽은 쿠폰 데이터를 SQS에 보내는 함수
글로벌 기준이기 때문에 모든 자정을 파악하기 위해서 1시간마다 cron을 통해 호출합니다. 이전에 전달된 쿠폰 데이터는 중복으로 보내지 않는다. MessageDeduplicationId를 사용하여 동일한 coupon_id에 대해 중복 전송을 막을 수 있습니다.
2. EventBrige 국가 별 자정(미국, 일본, 한국) 트리거
이벤트 브릿지를 3개로 하여 각 미국, 일본 그리고 한국으로 설정했다. 올리브영이 미국, 일본 진출 계획에 있기 때문에 각 브릿지를 세 나라로 설정했습니다. 자정이 됐을 경우 cron을 통해 람다2를 호출합니다.
3. Lambda Redis 데이터 만료 및 Aurora에 백업(영속성)
SQS에서 저장된 메세지를 가져오고 Redis 데이터가 만료되면 영속성을 보장하기 위해 Aurora에 데이터를 백업합니다.
redis는
- received_coupons
- 중복 발급 확인용
- coupon
- 영속성 저장용
- member_coupon
- 쿠폰 만료 및 알림용 아래와 같이 저장되어있습니다.
EventBrige 생성
EventBrige를 생성했다.
최종 규칙 이름 및 Cron 표현식
국가 규칙 이름 Cron 표현식 시간대 (TZ)
🇰🇷 한국 korea-midnight-schedule cron(0 0 * * ? *) Asia/Seoul
🇯🇵 일본 japan-midnight-schedule cron(0 0 * * ? *) Asia/Tokyo
🇺🇸 미국 us-midnight-schedule cron(0 0 * * ? *) America/New_York
유연한 기간은 필수값
EventBus를 사용도 고려했지만 일정 cron을 선택하는 칸이 없어 EventBrige를 선택하였다.
SQS 대기열 생성
Lambda1에서 보내는 데이터를 Lambda2가 사용해야하는데 어떻게 연결되는거지? SQS를 이용한다.
1. SQS 대기열 생성
1. AWS 콘솔 → SQS 서비스 선택
2. 대기열 생성 클릭
3. 설정:
• 대기열 유형: FIFO (중복 방지 목적) 또는 표준
• 이름: coupon-redis-to-aurora-queue.fifo(FIFO인 경우)
• 메시지 보존 기간: 24시간
대기열 생성
대기열 세부정보 설정
대기열 유형을 표준으로 고를지, FIFO
- 표준
- 표쥰 Queue(선입선출) 의 순서를 가능한 보장하려고 하지만, 장담할 수 없다.
- 메세지 큐에 쌓여있는 메세지를 최소 1회 전송하지만, 가끔 한 개 이상의 메세지 사본이 전송 될 수 있다.
- 속도 무제한
- 모든 region 에 존재
- FIFO
- 선입선출 순서를 무조건 보장한다.
- 무조건 1회만 전송
- 속도 300~3000msg/s 제한
- 특정 region 에 존재
구성설정
- 표시 제한 시간: (한 소비자가) 대기열에서 수신한 메시지가 다른 메시지 소비자에게 보이지 않게 되는 시간
- 메시지 보존 기간: Amazon SQS가 삭제되지 않은 메시지를 보관하는 시간
- 전송 지연: 이 대기열에 추가된 각 메시지의 첫 번째 전송에 대한 지연 시간
- 최대 메시지 크기: 이 대기열의 최대 메시지 크기
- 메시지 수신 대기 시간: 폴링이 메시지를 사용할 수 있을 때까지 기다리는 최대 시간
- 콘텐츠 기반 중복 제거: Amazon SQS는 메시지 본문에 기반하여 중복 제거 ID를 자동으로 생성할 수 있음
엑세스 정책 설정
서버측 암호화(SSE, Service Side Encryption)를 활성화하면 SQS는 Queue에 들어오는 메시지들을 모두 암호화하게 됩니다. 권한 있는 소비자에게 전송되는 경우에만 메시지가 해독됩니다.
"SQS:*"는 권한이 너무 많아서 Principal을 제한한다.
배달 못한 편지 대기열
SQS 생성
Lamdba1(REDIS에서 데이터 읽음)
WaitTimeSeconds (Long Polling)
• 기본값: 0초 (즉, 즉시 응답)
• 최대값: 20초
Sever 측에서 보낸 요청은 Queue에 저장되고 Worker 측에서 이를 수신하여, 작업을 처리한다
Lambda2(Redis 데이터 만료 및 Aurora에 백업(영속성)
Lambda 함수 생성 및 SQS 트리거 연결
1. AWS 콘솔 → Lambda → 함수 생성
2. 설정:
• 함수 이름:
• 런타임: Python 3.10 (위 코드 기준)
보안그룹의 경우 별도의 설정없이 인바운드 규칙 X, 아웃바운드 규칙 모두 허용 상태로 지정했다.
Redis에서 자정 기준으로 삭제 후 Aurora에 저장 Lambda:
람다 코드를 보고 필요한 패키지 다운 받아서 압축해서 업로드한다.
mkdir my-lambda-package
cd my-lambda-package
pip install redis pymysql -t .
touch lambda_function.py
zip -r lambda-deployment-package.zip .
Aurora DB만들기
CREATE DATABASE event_db;
USE event_db;
CREATE TABLE coupon (
coupon_id VARCHAR(255) NOT NULL, -- 쿠폰 ID
member_id VARCHAR(255) NOT NULL, -- 회원 ID
PRIMARY KEY (coupon_id) -- 쿠폰 ID를 기본 키로 설정
);
트러블 이슈
로그 자체는 EventBridge에 저장되지 않으며, 트리거된 대상 서비스(Lambda 등)에서 로그를 확인할 수 있습니다.
트러블 이슈1
• 2025-02-25T19:21:01.557+09:00
오류 발생: EventBridge 규칙을 생성하거나 SQS 메시지를 전송하는 중에 오류가 발생했습니다: ValidationException: 'CouponTrigger_offline-e1754683-abb7-470e-a10c-87b2ce9048f8_midnight_20250225000000' 값이 'name' 제약 조건을 만족하지 못함. 이름 길이가 64자 이하이어야 합니다.
트러블 이슈2
WaitTimeSeconds는 SQS의 long polling을 설정할 때 사용되는 값으로, 0부터 20까지의 값만 유효합니다. 현재 코드에서 WaitTimeSeconds=600으로 설정되어 있는데, 이는 잘못된 값입니다. 최대값은 20초입니다.
response = sqs_client.receive_message(
QueueUrl=queue_url,
MaxNumberOfMessages=1, # 한 번에 최대 1개 메시지 가져오기
WaitTimeSeconds=20 # 최대 20초 동안 대기
)
이 트러블 이슈 외에도 파이썬 버전문제 Lambda ColdStart 문제에 대해서도 고려 해보길 바랍니다.
'IT > cloud' 카테고리의 다른 글
[AWS] 테라포밍: AWS 인프라를 Terraform으로 exporting (0) | 2025.02.28 |
---|---|
EC2 Bastion 서버와 Aurora 데이터베이스 연동 설정 (0) | 2025.02.24 |
[Terraform] 테라폼으로 AWS Elasticache(redis) Cluster 모드로 생성하기 (0) | 2025.02.19 |
Jenkins 디스크 용량 부족 문제 해결 방법 (1) | 2025.02.19 |
AWS Certificate Manager(ACM)을 활용한 CloudFront HTTPS 적용 (0) | 2025.02.17 |