역경매 서비스의 경매 상태 자동화를 담당하는 AWS Lambda 모듈입니다. EventBridge Scheduler 트리거를 받아 SQS 지연 메시지를 발행하고, SQS 메시지를 소비하여 RDS 상태 변경 및 Redis Pub/Sub 이벤트를 발행합니다.
EventBridge Scheduler
│ (경매 시작/종료 5분 전 트리거)
▼
AuctionLambda (auction-sqs-handler)
│ SQS 지연 메시지 발행 (최대 900초 지연)
▼
Amazon SQS
│ 정확한 시각에 트리거
▼
AuctionSqsLambda (auction-sqs-consumer)
├── RDS → auction_status 변경
└── Redis → auction-events / auction:notification 발행
| 항목 | 내용 |
|---|---|
| 트리거 | Amazon EventBridge Scheduler |
| 배포 함수명 | auction-sqs-handler |
| 역할 | EventBridge 이벤트 수신 후 SQS 지연 메시지 발행 |
입력 이벤트 (EventBridge)
{
"auctionId": 123,
"action": "START",
"targetTime": "2026-05-13T10:00:00"
}동작
targetTime과 현재 시각의 차이를 초 단위로 계산delaySeconds를[0, 900]범위로 클램핑하여 SQS 지연 메시지 발행- EventBridge가 5분 전에 트리거하므로 900초를 넘을 일은 없으나 안전장치로 설정
| 항목 | 내용 |
|---|---|
| 트리거 | Amazon SQS |
| 배포 함수명 | auction-sqs-consumer |
| 역할 | 경매 상태 변경, 낙찰 결과 저장, Redis 이벤트 발행 |
START 처리
auctions.auction_status: READY → ACTIVE
└── Redis auction-events : AUCTION_STARTED 발행
└── Redis auction:notification: AUCTION_STARTED 알림 (구매자)
└── Redis 캐시 무효화
END 처리 — 낙찰 (입찰 존재)
auctions.auction_status: ACTIVE → DONE
└── auction_results 삽입 (낙찰가, 낙찰자, 판매자, 입찰 ID)
└── bids.status: → CLOSED
└── Redis auction-events : AUCTION_ENDED 발행
└── Redis auction:notification: AUCTION_CLOSED_WIN (낙찰자)
└── Redis auction:notification: AUCTION_CLOSED_BUYER (판매자)
└── Redis 캐시 무효화
END 처리 — 유찰 (입찰 없음)
auctions.auction_status: ACTIVE → NO_BID
└── bids.status: → CLOSED
└── Redis auction-events : AUCTION_NO_BID 발행
└── Redis auction:notification: AUCTION_NO_BID 알림 (구매자)
└── Redis 캐시 무효화
SQS 부분 실패 처리
배치 내 메시지 처리 중 일부 실패 시 SQSBatchResponse의 BatchItemFailure에 실패한 메시지 ID만 반환하여 해당 메시지만 재시도합니다.
| 채널 | 발행 이벤트 | 구독 서버 |
|---|---|---|
auction-events |
AUCTION_STARTED, AUCTION_ENDED, AUCTION_NO_BID |
auction (메인 서버) |
auction:notification |
AUCTION_STARTED, AUCTION_CLOSED_WIN, AUCTION_CLOSED_BUYER, AUCTION_NO_BID |
auction-notification (알림 서버) |
멱등성 보장
상태 변경 SQL에 현재 상태 조건(AND auction_status = 'READY' / AND auction_status = 'ACTIVE')을 포함하고, updated > 0인 경우에만 후속 처리를 실행합니다. 중복 트리거 시 Redis 발행이 일어나지 않습니다.
RDS Proxy 핀닝 방지
PostgreSQL JDBC의 assumeMinServerVersion=9.0 속성을 설정하여 세션 단위 SET 명령 발행을 억제합니다. 이로써 RDS Proxy의 연결 핀닝을 방지하고 커넥션 풀을 효율적으로 활용합니다.
Redis 캐시 무효화
SCAN + UNLINK를 사용하여 auction::getAuction::{id}, auction::getManyAuctionsPublic::* 패턴의 캐시를 일괄 삭제합니다. UNLINK는 비동기로 메모리를 해제하여 블로킹을 최소화합니다.
Jedis Pool 재사용
JedisPool을 static으로 선언하여 Lambda 실행 환경(Execution Context) 재사용 시 커넥션을 재활용합니다.
src/com/example/lambda/
├── AuctionLambda.java # EventBridge 트리거 → SQS 지연 메시지 발행
└── AuctionSqsLambda.java # SQS 트리거 → RDS 상태 변경 + Redis Pub/Sub 발행
| 변수명 | 설명 | 사용 Lambda |
|---|---|---|
SQS_QUEUE_URL |
SQS 큐 URL | AuctionLambda |
DB_URL |
PostgreSQL JDBC URL | AuctionSqsLambda |
DB_USERNAME |
DB 사용자명 | AuctionSqsLambda |
DB_PASSWORD |
DB 비밀번호 | AuctionSqsLambda |
REDIS_HOST |
Redis 호스트 | AuctionSqsLambda |
./gradlew jarbuild/libs/auction-lambda-0.0.1-SNAPSHOT.jar (JAR)가 생성됩니다.
main / dev 브랜치에 push 시 GitHub Actions가 자동으로 실행됩니다.
push → ./gradlew jar → AWS OIDC 인증 → Lambda 함수 코드 업데이트 (3개)
AWS 인증은 OIDC(키 없이 역할 기반)로 처리합니다.
aws lambda update-function-code \
--function-name auction-sqs-consumer \
--zip-file fileb://build/libs/auction-lambda-0.0.1-SNAPSHOT.jar