ElastiCache for Redis 클러스터를 만들고 로컬 터미널에서 redis-cli로 붙어보려 했다. 엔드포인트를 그대로 넣어서는 연결이 안 된다. ElastiCache는 외부 접근을 허용하지 않고, 같은 VPC 안의 인스턴스를 거쳐야만 접근할 수 있다.
그래서 로컬과 Redis 사이에 Bastion Host를 두고 SSH 포트포워딩으로 길을 냈다. 이 글에서는 클러스터를 만들 때 고른 설정값, 포트포워딩, redis-cli --tls 접속, CLI 대신 쓸 수 있는 GUI 툴까지 순서대로 정리한다. 테스트 환경은 M1 Mac이다.
클러스터를 만들 때 고른 설정값
클러스터 모드: 비활성화
포트: 기본값
6379대신6480암호화: 저장 중 암호화, 전송 중 암호화 모두 활성화
포트는 보안을 위해 기본값을 피해서 6480으로 바꿨다. 포트를 바꾸면 무작위 스캔이 조금 번거로워지는 정도이고, 실제로 접근을 막는 건 뒤에 나올 VPC 경계와 보안 그룹이다.
나머지 두 설정은 접속 명령에 그대로 이어진다. 클러스터 모드를 껐으니 redis-cli에 -c가 필요 없고, 전송 중 암호화를 켰으니 --tls가 필요하다.
로컬에서 Redis까지 SSH 터널 열기
Bastion Host는 Redis와 같은 VPC 안에 있으면서 로컬에서 SSH로 들어갈 수 있는 인스턴스다. ssh -L로 로컬 포트 하나를 Bastion 너머의 Redis 엔드포인트에 이어두면, 로컬에서는 localhost:6480에 붙는 것만으로 Redis에 닿는다.
flowchart LR
A["로컬 Mac<br/>localhost:6480"] -- SSH --> B["Bastion Host<br/>(같은 VPC)"]
B -- "TCP 6480" --> C["ElastiCache for Redis<br/>엔드포인트"]ssh -L 6480:{Redis Endpoint}:{Redis Port} {Bastion Host 접속 유저명}@{Bastion Host IP} -p {Bastion Host 접근할 수 있도록 보안그룹에 인바운드 오픈한 TCP port}
# pem 키로 Bastion Host에 접근해야 한다면
# ssh -i "{pem 키 경로/키 이름.pem}" -L 6480:{Redis Endpoint}:{Redis Port} {Bastion Host 접속 유저명}@{Bastion Host IP} -p {Bastion Host 접근할 수 있도록 보안그룹에 인바운드 오픈한 TCP port}
# 예시 (엔드포인트, IP, SSH 포트는 예시 값)
ssh -L 6480:master.example-redis.xxxxxx.euc1.cache.amazonaws.com:6480 {IPA ID}@10.0.1.10 -p 2222
-L 바로 뒤의 6480이 로컬에서 열 포트이고, 그 뒤가 Bastion 입장에서 찾아갈 Redis 주소와 포트다. 예시는 클러스터 포트를 6480으로 만들었기 때문에 두 숫자가 같을 뿐이다. 마지막 -p는 Redis 포트가 아니라 Bastion Host의 SSH 포트다.
터널이 제대로 열렸는지는 로컬 포트가 LISTEN 상태인지로 확인한다.
# 방법 1
lsof -i4 -P | grep -i "listen" | grep 6480
# 연결 정상일 경우 결과
ssh 26646 user 29u IPv4 0xb9b737e263825d0b 0t0 TCP localhost:6480 (LISTEN)
# 방법 2
nc -zv 127.0.0.1 6480
# 연결 정상일 경우 결과
Connection to 127.0.0.1 port 6480 [tcp/sun-sr-http] succeeded!
redis-cli –tls로 접속하기
redis-cli는 brew install redis로 설치한다.
redis-cli -c -h {redis-endpoint or host} --tls -p {port}
# -c: 클러스터 모드가 '비활성화'면 생략 가능
# -h: 호스트가 localhost면 생략 가능
# -p: 기본 포트 6379면 생략 가능
# --tls: '전송 중 암호화'가 활성화된 클러스터라면 필요. TLS 프로토콜로 통신한다
# 예시
redis-cli -h localhost --tls -n 1 -p 6480
# SSH 터널로 포워딩된 로컬 6480 포트를 통해 Redis와 TLS로 통신한다
# -n 1: 1번 데이터베이스에 접속한다 (생략하면 0번)

AWS ElastiCache for Redis 1번 DB 접속 성공.
프롬프트가 localhost:6480[1]>로 바뀌면 접속된 것이다. 대괄호 안 숫자가 지금 선택한 DB 번호다.
redis-cli에 –tls 옵션이 없다면
M1 Mac에서 brew로 설치한 redis-cli는 --tls를 바로 지원했다. 그런데 Redis의 SSL/TLS는 버전 6부터 들어왔고, 컴파일할 때 켜야 하는 선택 기능이다. 다른 환경에서 설치한 redis-cli가 --tls를 모른다면 TLS를 켜서 다시 빌드해야 한다. 방법은 아래 참고자료의 AWS 문서에 있다.
CLI 대신 GUI로 보기
CLI 말고 GUI 툴로 Redis를 확인하고 관리할 수도 있다. 써본 건 Medis2와 RedisInsight이고 둘 다 무료다.
Medis2는 구성이 단순해서 다루기 쉽다. 다만 무료 버전은 클러스터를 하나만 연결할 수 있다. 업무에서 클러스터 두 개 이상을 같이 봐야 할 일이 생겨서 RedisInsight로 바꿨다. GUI도 결국 로컬에서 붙는 것이니 위의 SSH 터널을 열어둔 채로 localhost:6480에 연결하면 된다.


참고
ElastiCache for Redis는 VPC 밖에서 바로 접근할 수 없어서, 같은 VPC의 Bastion Host로
ssh -L터널을 연다.클러스터 설정이 명령 옵션을 정한다. 클러스터 모드 비활성화면
-c생략, 전송 중 암호화 활성화면--tls.터널은
lsof나nc -zv로 먼저 확인하고, 그다음redis-cli -h localhost --tls -p 6480으로 붙는다.