
AWS에서 제공하는 완전관리형 인메모리 캐시 서비스로, 현재 Redis OSS, Memcached, Valkey 등 여러 엔진을 지원합니다.
메모리 기반으로 동작하여 빠른 데이터 조회를 제공하며, 서버 관리, 패치, 스케일링 등을 AWS가 대신 처리합니다.
오픈 소스 기반의 인메모리 데이터 구조 저장소로, 키-값 형태뿐 아니라 리스트, 셋, 해시 등 다양한 데이터 구조를 지원합니다.
단순 키-값 저장소 형태의 경량 메모리 캐시 엔진으로, 기능은 최소화되어 있으나 빠른 읽기/쓰기 성능에 최적화되어 있습니다.
Redis OSS의 오픈소스 포크 프로젝트 기반으로, AWS에서 관리형 엔진으로 지원되는 최신 인메모리 캐시입니다.
Redis의 오픈소스 라이선스 정책 변경을 계기로 등장했으며, 여러 기업들에서 Redis에서 Valkey로 전환하는 움직임도 보이고 있습니다.
| Redis OSS | Memcached | Valkey | |
|---|---|---|---|
| 데이터 구조 | 문자열, 리스트, 셋, 해시 등 다양한 자료구조 지원 | 단순 키-값 구조 | 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로 생성해야 프리티어로 사용할 수 있습니다.
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이 됩니다.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

연결이 되었다면 이제 Python과 Redis 라이브러리를 설치합니다.
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()
host를 publisher.py와 동일하게 설정해줍니다.
코드 작성이 완료되면 control + x를 눌러 subscriber.py로 저장하고 종료합니다.
subscriber.py를 먼저 실행합니다.
python3 subscriber.py
Subscriber가 실행되면 메시지 수신을 대기합니다.

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

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

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