[AWS Elasticache] Redis/Valkey로 Pub/Sub 구현하기

이한슬·2025년 8월 31일

AWS

목록 보기
2/3
post-thumbnail

AWS Elasticache

AWS Elasticache

AWS에서 제공하는 완전관리형 인메모리 캐시 서비스로, 현재 Redis OSS, Memcached, Valkey 등 여러 엔진을 지원합니다.
메모리 기반으로 동작하여 빠른 데이터 조회를 제공하며, 서버 관리, 패치, 스케일링 등을 AWS가 대신 처리합니다.

특징

  • 완전관리형 서비스: 서버 프로비저닝, 패치, 백업, 모니터링 등을 AWS가 자동으로 관리합니다.
  • 빠른 데이터 접근: 메모리 기반 캐시로 DB보다 높은 처리 속도를 제공합니다.
  • 높은 확장성: 노드 추가, 클러스터 모드 지원으로 트래픽 증가에 대응이 가능합니다.
  • 보안: VPC, 보안 그룹, IAM, TLS 등을 통한 접근 제어가 가능합니다.
  • 호환성: Redis OSS, Valkey, Memcached 등 다양한 오픈 소스 캐시 엔진과 호환되어 기존 애플리케이션에 쉽게 통합 가능합니다.

기능

  • 캐시 저장소: 자주 사용하는 데이터를 메모리에 저장해 읽기 속도 향상
  • 클러스터링: 여러 노드로 분산, 데이터 샤딩과 복제 지원
  • 모니터링 및 알람: CloudWatch와 연동해 성능, 메모리 사용량, 연결 상태 등 모니터링 가능
  • 스냅샷 및 백업: 데이터를 주기적으로 저장하여 장애 시 복구 가능

캐시 엔진

Redis OSS

오픈 소스 기반의 인메모리 데이터 구조 저장소로, 키-값 형태뿐 아니라 리스트, 셋, 해시 등 다양한 데이터 구조를 지원합니다.

  • 특징
    • 옵션(RDB, AOF 설정)에 따라 디스크에 데이터를 저장할 수 있어, 서버 재시작 시 데이터 복구가 가능합니다.
    • Pub/Sub 메시징, 트랜잭션, Lua 스크립트 실행 등의 기능을 제공합니다.
    • 클러스터링, 레플리카 복제 지원으로 높은 확장성과 내결함성을 제공합니다.
  • 용도
    • 실시간 데이터 처리, 세션 관리, 순위/통계, 메시지 브로커 등

Memcached

단순 키-값 저장소 형태의 경량 메모리 캐시 엔진으로, 기능은 최소화되어 있으나 빠른 읽기/쓰기 성능에 최적화되어 있습니다.

  • 특징
    • 구조가 단순해 매우 빠른 속도를 제공합니다.
    • 메모리 사용 효율이 높고 분산 환경에서 노드의 추가, 삭제가 용이합니다.
    • 데이터 영속성이 없으며 복잡한 기능은 제공하지 않습니다.
  • 용도
    • 웹 애플리케이션 캐시, 세션 캐시, 페이지 캐시 등 간단한 데이터 캐싱

Valkey

Redis OSS의 오픈소스 포크 프로젝트 기반으로, AWS에서 관리형 엔진으로 지원되는 최신 인메모리 캐시입니다.
Redis의 오픈소스 라이선스 정책 변경을 계기로 등장했으며, 여러 기업들에서 Redis에서 Valkey로 전환하는 움직임도 보이고 있습니다.

  • 특징
    • Redis OSS와 호환되며, AWS가 서버 관리, 백업, 스케일링을 자동으로 처리합니다.
    • 보안 그룹, VPC, TLS(전송 암호화) 지원으로 안전한 네트워크 환경을 제공합니다.
    • 클러스터 모드, 복제, 스냅샷 기능을 통한 고가용성 및 확장성을 지원합니다.
  • 용도
    • Redis 기능을 AWS 관리형 환경에서 안정적으로 사용하고 싶을 때 적합
Redis OSSMemcachedValkey
데이터 구조문자열, 리스트, 셋, 해시 등 다양한 자료구조 지원단순 키-값 구조Redis OSS와 동일
기능복제, 영속화, Lua 스크립트, 트랜잭션, Pub/Sub 지원기본 캐시 기능에 집중, 복잡한 기능 없음Redis 기능 유지, 서버리스 최적화, 비용 절감 가능
확장성클러스터링, 복제 지원단순 분산 캐시, 클러스터링 지원 제한적클러스터링, 복제 지원
장애 복구영속화 기능으로 데이터 보존 가능메모리 기반, 장애 시 데이터 소실 가능Redis와 동일한 영속성 기능 제공
비용 절감표준 비용저비용서버리스 기반 비용 최대 33% 절감 가능
주요 용도실시간 데이터 처리, 세션, 순위/통계, 메시지 브로커웹 캐시, 세션 캐시, 페이지 캐시Redis 기능을 안전하게 관리형 환경에서 사용

더 자세한 비교는 아래 페이지에서 확인할 수 있습니다.
Comparing Valkey, Memcached, and Redis OSS self-designed caches

실습

이전 포스트에서 진행했던 Redis Pub/Sub 튜토리얼을 AWS ElastiCache 환경에서 실행해 보겠습니다.
AWS Elasticache는 프리티어를 지원합니다. 단, 서버리스는 사용할 수 없으며 자체 캐시를 생성해야 합니다.
또한, 인스턴스를 cache.t2.micro 또는 cache.t3.micro로 생성해야 프리티어로 사용할 수 있습니다.

1. Elasticache 생성

AWS console로 접속해 로그인하고 Elasticache를 검색합니다.

오른쪽의 지금 시작 버튼을 눌러줍니다.

이제 캐시를 설정합니다.

캐시 엔진 선택

Redis Pub/Sub 기능을 사용할 것이므로 Valkey 또는 Redis OSS를 선택합니다.
Valkey는 AWS에서 새롭게 지원하는 엔진으로, 공식 문서에 프리티어 지원 여부가 명확히 기재되어 있지 않았습니다. 하지만 직접 테스트해본 결과, 프리티어 인스턴스 유형(cache.t2.micro, cache.t3.micro)에서는 정상적으로 프리티어 혜택이 적용되었습니다.
저는 Valkey로 진행하겠습니다.
서버리스 배포 옵션은 프리티어를 지원하지 않으므로, 반드시 자체 캐시 설계로 선택해주세요.

클러스터 설정

클러스터 모드를 활성화할 경우에도 과금이 발생할 수 있습니다.
클러스터 모드를 비활성화하고 클러스터 이름을 작성합니다.

네트워크 설정

위치는 AWS 클라우드를 선택하고 다중 AZ를 해제합니다.
다중 AZ를 해제하지 않으면 과금 발생 가능성이 있습니다.

노드 유형

노드 유형을 cache.t2.micro 또는 cache.t3.micro로 설정합니다.
위 두가지 유형만 프리티어를 지원합니다.
복제본 개수는 0으로 설정합니다.

서브넷 및 가용 영역

서브넷 그룹을 설정합니다.

추가 설정은 없으며 가용 영역 배치는 기본 설정 없음으로 설정합니다.
다음으로 2단계로 넘어갑니다.

보안 및 백업

보안 설정을 모두 해제합니다.

자동 백업 사용을 해제하고 유지 관리 기간을 기본 설정 없음으로 설정합니다.

로그 사용도 모두 해제합니다.
다음으로 3단계로 넘어갑니다.

생성 완료

마지막으로 점검 후 문제가 없다면 캐시 생성을 완료합니다.
캐시가 정상적으로 생성되면, 이미지처럼 상태가 Available이 됩니다.

2. EC2 인스턴스 생성

이번엔 콘솔에 EC2를 검색해 이동합니다.

오른쪽의 인스턴스 시작을 클릭합니다.

인스턴스 이름을 설정하고 OS 이미지를 선택합니다.
저는 Amazon Linux를 사용하겠습니다.

오른쪽에 프리티어 사용 가능을 확인한 후, 아키텍처는 자유롭게 선택합니다.
인스턴스는 t2.micro를 지원하는 리전에서는 t2.micro를, 나머지 리전에서는 t3.micro를 선택해야 프리티어를 사용할 수 있습니다.

오른쪽의 새 키 페어 생성을 클릭합니다.

저는 다음처럼 설정해 생성하였습니다.

보안 그룹을 설정합니다.
다음에서 SSH 트래픽 허용을 체크합니다.

스토리지는 프리티어로 30GiB까지 사용할 수 있습니다.
저는 간단한 예제이기 때문에 8로 그대로 진행하겠습니다.
이제 인스턴스 시작을 눌러줍니다.

인스턴스가 정상적으로 실행되면, 인스턴스 상태가 실행 중이 됩니다.

3. EC2, Elasticache 연결

EC2와 Elasticache를 연결합니다.
Elasticache에서 생성한 캐시의 이름을 눌러 이동합니다.

스크롤을 아래로 내리면 연결된 컴퓨팅 리소스라는 항목이 나타납니다.
컴퓨팅 연결 설정을 클릭합니다.

EC2 인스턴스를 방금 생성한 EC2 인스턴스로 선택하고 설정 버튼을 클릭합니다.

연결이 성공적으로 구성되면 상태가 Running이 됩니다.

4. Pub/Sub 코드 작성

다시 ec2 인스턴스로 돌아와 오른쪽의 연결 버튼을 클릭합니다.

EC2 인스턴스 연결 항목에서 아래의 연결 버튼을 클릭합니다.

연결이 완료되면 아래 같은 화면이 나옵니다.

연결이 되었다면 이제 PythonRedis 라이브러리를 설치합니다.

sudo yum update -y         
sudo yum install -y python3 pip
pip3 install redis

설치가 완료된 후 nano 에디터를 이용해 publisher.py 파일을 작성합니다.

nano publisher.py

코드를 다음처럼 작성합니다.

import redis

def publisher():
    r = redis.Redis(
        host="elasticache-cluster.~~~.cache.amazonaws.com",
        port=6379
    )
    channel = "tutorial"
    message = "Tutorial test"                 
    r.publish(channel, message)
    print(f"Sent: {message}")

if __name__ == "__main__":
    publisher()

host는 cache의 기본 엔드포인트에서 포트번호를 제외한 주소를 입력합니다.

코드 작성이 완료되면 control + x를 눌러 publisher.py로 저장하고 종료합니다.
EC2 연결 버튼을 다시 눌러 새로운 터미널을 시작합니다.
이제 subscriber.py를 작성합니다.

nano subscriber.py

코드를 다음처럼 작성합니다.

import redis

def subscriber():
    r = redis.Redis(
        host="elasticache-cluster.~~~.cache.amazonaws.com",
        port=6379
    )
    pubsub = r.pubsub()
    pubsub.subscribe("tutorial")

    print("Waiting for messages...")
    for message in pubsub.listen():
        if message["type"] == "message":
            print(f"Received: {message['data'].decode('utf-8')}")

if __name__ == "__main__":
    subscriber()

hostpublisher.py와 동일하게 설정해줍니다.
코드 작성이 완료되면 control + x를 눌러 subscriber.py로 저장하고 종료합니다.

5. Pub/Sub 실행

subscriber.py를 먼저 실행합니다.

python3 subscriber.py

Subscriber가 실행되면 메시지 수신을 대기합니다.

publisher.py를 실행합니다.
메시지를 전송했음이 출력됩니다.

다시 Subscriber 콘솔을 살펴보면 메시지가 정상적으로 수신된 것을 확인할 수 있습니다.

실습이 모두 끝나고 나면 혹시 모를 과금을 방지하기 위해 리소스들을 꼭 정리합니다.

profile
궁금하면 일단 먹어보는 소프트웨어 전공생

0개의 댓글