Database

[Redis] AWS EC2에 redis-server setup 하기

jewook3617 2021. 6. 22. 22:19

이번 글에서는 AWS EC2에 외부에서 접속 가능한 redis-server를 setup 하는 과정을 정리해보겠습니다.

 

EC2 인스턴스 생성

우선, redis-server를 설치할 EC2 인스턴스를 만듭니다.

저는 jony라는 이름의 ubuntu 18.04 인스턴스를 만들었고 인스턴스 유형은 t2.micro로 선택했습니다.

 

EC2 인스턴스 접속

이제 이 인스턴스에 접속해보겠습니다.

위 화면에서 인스턴스 ID를 클릭하면 아래와 같은 화면이 나오고 여기서 연결 버튼을 클릭하면 인스턴스 연결에 대한 정보가 나옵니다.

연결 버튼을 클릭하면 아래와 같은 화면이 나옵니다. 저는 ssh 클라이언트로 접속을 해보겠습니다.

인스턴스 생성 시 만든 pem 키가 있는 폴더로 이동 후 위 명령어들을 그대로 치면 됩니다.

chmod 400 [pem키]
ssh -i './[pem키]' ubuntu@[EC2 인스턴스의 IP or DNS]

첫 번째 명령어는 chmod 400 redis-server-test.pem입니다. (저는 redis-server-test.pem이라는 이름으로 pem키를 생성했습니다.)

chmod 명령어는 pem 키의 접근 권한을 변경하는 명령어입니다. 

chmod 뒤에 등장하는 숫자 3개는 각각 나 / 그룹 / 전체의 권한을 나타냅니다. read, write, execute 권한이 각각 숫자 4, 2, 1을 의미하고 숫자들의 합으로 권한을 나타냅니다.

예를 들어, 510 권한은 나에게 read, execute(4 + 1) 권한, 그룹에게 execute(1) 권한, 전체에게 아무 권한 없음을 나타냅니다.

chmod 400으로 pem 키의 접근 권한을 변경하면 나에게 read 권한만 부여하게 됩니다. AWS가 생성한 pem키를 변경하지 못하고 읽어서 사용할 수만 있게 하는 명령어입니다.

다음 명령어는 ssh -i './redis-server-test.pem' ubuntu@ec2-54-180-9-100.ap-northeast-2.compute.amazonaws.com입니다. 

ssh 명령어는 ssh [옵션] [접속 계정]@[호스트 주소] 형태로 사용됩니다. 위에서 사용된 -i 옵션은 인증키 파일을 선택하겠다는 옵션입니다.

따라서 위 명령어는 ec2-54-180-9-100.ap-northeast-2.compute.amazonaws.com 컴퓨터에 ubuntu라는 이름의 계정으로 redis-server-test.pem 파일에서 읽은 인증 키로 접속을 하겠다는 의미입니다.

위 사진과 같이 뜨면 접속에 성공한 것입니다.

 

EC2 인스턴스에 redis-server 설치

인스턴스 접속에 성공했으니 이제 인스턴스에 redis-server를 설치하겠습니다.

먼저 아래 명령어를 통해 apt-get을 업그레이드 해줍니다.

sudo apt-get update
sudo apt-get upgrade

업그레이드가 완료되었으면 apt-get을 통해 redis-server를 설치해줍니다.

sudo apt-get install redis-server

설치 후에 redis-server --version 명령어를 입력했을 때 아래와 같이 설치된 redis-server의 버전 정보가 뜬다면 설치에 성공한 것입니다.

redis-server가 잘 설치되었다면 redis-cli를 통해 redis-server가 잘 동작하는지 확인해보겠습니다.

redis-cli 명령어를 입력하면 위 사진과 같이 로컬에 설치된 redis에 접속해 바로 명령어를 입력할 수 있게 바뀝니다.

redis에 데이터를 저장하고 가져오려면 set과 get 명령어를 사용해야 합니다.

set [key] [value]
get [key]

set 명령어는 key 값에 value를 저장하는 명령어이고 get 명령어는 key 값에 저장된 value를 가져오는 명령어입니다.

set과 get 명령어가 잘 동작하는 것을 확인했습니다.

 

Redis 설정

이제 외부에서도 EC2 인스턴스에 설치된 redis에 접속할 수 있도록 설정을 해야 합니다. redis 설정들은 redis.conf 파일에서 할 수 있습니다.

아래 명령어로 redis.conf 파일을 열어보겠습니다.

sudo vi /etc/redis/redis.conf

redis.conf 파일을 열면 이런 화면이 나옵니다.

주석으로 설명들이 많이 적혀있습니다.

이번 글에서 변경하려는 redis 설정 값들은 redis 접속 비밀번호, redis에 접속 가능한 ip 주소, redis가 사용할 max 메모리, 메모리가 가득 찼을 때 데이터 교체 알고리즘입니다.

먼저 redis 접속 비밀번호입니다.

redis.conf 파일에서 접속 비밀번호를 설정하려면 requirepass 옵션을 설정하면 됩니다. 파일의 내용이 너무 많으니 명령어를 이용해 requirepass를 찾아보겠습니다. vim 파일에서 원하는 단어를 찾으려면 /[단어]를 입력하고 엔터를 치면 됩니다. 그리고 n 버튼을 누르면 계속해서 다음 단어를 찾아나갑니다.

n 버튼을 누르다가 이 부분을 찾았다면 requirepass foobared라고 적힌 라인의 주석(#)을 제거하고 foobared 부분에 원하는 비밀번호를 입력하면 됩니다. i 키를 누르면 vim이 수정 모드로 변경됩니다. 수정이 끝나고 esc를 누르면 다시 초기 모드로 돌아갑니다.

다음은 redis에 접속 가능한 ip 주소입니다.

접속 가능한 ip 주소는 bind 옵션으로 설정 가능합니다. 위와 같은 방법으로 bind 옵션을 찾습니다.

이런 부분을 찾았다면 bind 뒤에 있는 127.0.0.1 ::1 부분을 0.0.0.0으로 변경하면 됩니다. redis는 bind 옵션에 지정한 ip에서 오는 connection만 허용합니다. 현재 127.0.0.1로 되어있으므로 local에서의 연결만 허용합니다. 이 값을 0.0.0.0으로 바꿔 모든 ip에서 오는 connection을 허용하도록 합니다.

그다음은 redis가 사용할 max 메모리 설정입니다.

redis는 인 메모리 데이터베이스이기 때문에 여기서 설정한 max 메모리 값만큼의 용량이 확보되는 것입니다.

max 메모리 설정은 maxmemory 옵션으로 설정 가능합니다. 동일한 방법으로 maxmemory 옵션을 찾습니다.

이런 부분을 찾았다면 제일 마지막 줄에 있는 maxmemory <bytes> 라인의 주석(#)을 해제하고 <bytes> 부분에 원하는 max 메모리 값을 입력합니다. 

제가 생성한 EC2 인스턴스의 메모리 용량이 1GB 밖에 되지 않아 maxmemory를 500mb로 입력했습니다. byte 단위의 숫자로 입력해도 되고 500mb, 1gb, 2gb 등의 단위를 포함하여 입력해도 됩니다.

마지막으로 데이터 교체 알고리즘입니다.

redis는 인 메모리 데이터베이스이기 때문에 용량이 많이 크지 않습니다. 그렇기 때문에 데이터가 메모리에 가득 찼을 때 새로운 데이터가 저장된다면 어떤 데이터를 뺄 지에 대한 알고리즘을 설정할 수 있습니다.

데이터 교체 알고리즘은 maxmemory-policy 옵션으로 설정할 수 있습니다. 동일한 방법으로 maxmemory-policy 옵션을 찾습니다.

이런 부분을 찾았다면 제일 마지막 줄에 있는 maxmemory-policy  라인의 주석(#)을 해제하고 부분에 원하는 데이터 교체 알고리즘 값을 넣습니다. 저는 모든 키에 대해서 사용된 지 가장 오래된 데이터를 삭제하는 방법인 allkeys-lru 알고리즘을 선택했습니다. 사용 가능한 교체 알고리즘의 목록과 설명은 이 글에 있습니다. 이 글의 Eviction Policies 부분을 보시면 됩니다.

수정이 모두 끝났으면 esc를 누르고 초기 모드로 돌아가 :wq 명령어를 입력하면 파일이 저장되고 닫힙니다.

 

Redis 실행

redis 설정이 다 끝났으니 이제 redis를 실행해보겠습니다.

redis는 인 메모리 데이터베이스이기 때문에 redis-server가 실행 중인 상태여야 사용할 수 있습니다. 그렇기 때문에 EC2 인스턴스를 닫아도 redis-server가 계속 실행중인 상태를 유지할 수 있도록 백그라운드 실행을 해야 합니다.

sudo systemctl start redis-server

systemctl 명령어를 이용하면 백그라운드로 redis-server를 실행할 수 있습니다. systemctl을 백그라운드 프로세스를 제어하는 명령어입니다. redis-server 실행 이후 redis.conf 파일을 수정했다면 sudo systemctl restart redis-server 명령어를 통해 redis-server를 재시작해야 합니다.

 

EC2 포트 개방

명령어를 실행시켰으면 이제 EC2 인스턴스를 종료하고 EC2 설정을 추가적으로 해야 합니다.

redis는 설정해놓은 port로 들어오는 connection만 허용하기 때문에 6379번 포트로 EC2 인스턴스에 접속할 수 있도록 설정해줘야 합니다. 6379번 포트가 default로 설정되어 있습니다. 이 값도 redis.conf 파일에서 변경할 수 있습니다.

포트 설정은 EC2 인스턴스 상세 페이지에서 할 수 있습니다.

인스턴스 상세 페이지에서 보안 탭을 누르면 보안 그룹이라고 표시된 링크가 보입니다. 그 링크를 클릭합니다.

링크에 들어가면 위 사진과 같은 화면이 보입니다. 현재는 ssh로 22번 포트로만 접속할 수 있도록 설정되어 있습니다.

인바운드 규칙 편집 버튼을 눌러 포트 설정을 할 수 있습니다.

인바운드 규칙 편집 버튼을 누르면 위 사진과 같은 화면이 보입니다. 이 화면에서 규칙 추가 버튼을 누르고 위 사진처럼 값들을 입력하고 규칙 저장 버튼을 누르면 됩니다.

이제 EC2 인스턴스에 모든 외부 IP(0.0.0.0/0)으로부터 6379번 포트로 TCP 연결을 할 수 있도록 설정을 마쳤습니다.

 

Redis 원격 접속

마지막으로 외부에서 EC2 인스턴스에 설치된 redis에 접속이 잘 되는지 확인해보겠습니다.

로컬 컴퓨터에 redis-cli를 설치하고 아래 명령어를 입력하면 됩니다.

redis-cli -h [EC2 인스턴스의 IP or DNS] -p 6379 -a [redis.conf에 설정한 비밀번호]

아래와 같이 뜬다면 접속에 성공한 것입니다.

EC2 인스턴스에 설치한 redis에 접속했으니 제대로 동작하는지 다시 한번 확인해보겠습니다.

get 명령어를 통해 위에서 저장해놓은 데이터를 불러와보겠습니다.

잘 동작하는 것을 확인할 수 있습니다.