AWS 환경에 Redash를 올리면서 해보는 환경구축

d3fau1t·2021년 12월 6일
2

개발환경구성

목록 보기
4/5

Redash?

Redash를 사용하면 서비스중인 DB에 쿼리를 날려보고 받은 데이터로 차트를 그려볼 수 있습니다.
심지어 차트로 도식화한 결과로 대시보드를 만들어 데이터를 보면서 서비스를 운영하는것이 매우 수월합니다.

각 사업부에서 운영중인 서비스들과 연동할 수 있고, 권한/그룹을 부여하여 특정 유저에 대하여 데이터 소스의 접근 제어가 가능합니다.
웹 브라우저 환경에서 접근할 수 있기 때문에, 비개발자의 경우도 DB 클라이언트를 설치하지않고 쉽게 접근하여 데이터를 조회할 수 있습니다.

필요에 따라 쿼리나 대시보드를 작성해두고 조직 구성원끼리 공유할 수 있다는 점이 매력적이라고 생각합니다.

서비스 구성 확인

https://github.com/getredash/redash
https://github.com/getredash/setup

제공되는 docker-compose.yml 파일을 통해 구축해보았는데 아래와 같은 구성으로 작동한다.


nginx로 웹 요청을 받아서 내부에서 작동하는 웹서버로 전달하고, 워커와 스케줄러를 따로 두어 작업량을 분산시키는 것으로 보인다.

시스템 설정 및 구성정보 저장이나 조회결과 캐싱을 위해 postgres와 redis를 사용한다.

DB나 캐싱에 필요한 컨테이너는 제거하거나 외부로 돌려서 인스턴스 자원을 확보하고 다른 시스템에 호환 가능하도록 관리하는 것이 맞아보인다.

  • 어느정도 사용량이 몰려도 스케줄러와 워커가 따로 돌고있다면 EC2 환경 하나만 있어도 충분하다고 판단된다.
  • 심지어 쿼리를 수행하는건 연결된 DBMS이기 때문에 EC2는 자원을 크게 사용하지 않는다.
  • 만약 EC2에 부하가 걸리더라도 ALB에 연결해두었으니 알아서 스케일링 될 것이다.
  • EC2에 Elastic IP를 붙이는 것도 괜찮을 것이다.
  • 워커와 스케줄러는 각 인스턴스에 같이 붙어있는 것이 맞다.
  • postgres와 redis를 분리된 상태에서 공통으로 사용할 경우 설정정보가 꼬이거나 캐싱관련 이슈가 발생하는 것을 피할 수 있다.
  • 만약 각각 배포해야한다면 ECS 및 EKS에 각각의 이미지를 올려서 Fargate로 관리하는 방법을 생각해볼 수 있다.

작업순서

  1. [선택] VPC: 전용망 생성
  2. Redash에서 제공해주는 AMI 사용하여 EC2 인스턴스 생성
  3. [선택] Elastic IP 연결
  4. [선택] RDS: PostgreSQL 생성
  5. [선택] ElastiCache: Redis 생성
  6. [선택] 배포된 EC2의 /opt/redash/env 파일 수정 후 재부팅
  7. DB 테이블 초기화
  8. Redash 접속 후 기본설정 마치기
  9. [선택] 환경설정된 EC2로 AMI 생성하기

배포

[선택] VPC: 전용망 생성

DB 접근이 Public으로 열려있다면 그냥 연결하면 그만이지만
Private 설정으로 접근이 제한된 RDS를 Redash에 연결하려면 VPC 피어링은 선택이 아니라 필수사항이 되어버린다.

여기서 제약사항이 하나 생겨버리는데..
대부분의 서비스는 AWS 계정을 생성한 뒤에 default 외의 다른 VPC를 사용하는 경우가 드물다.
IPv4에서 같은 CIDR 영역을 사용하는 VPC끼리 피어링 할 수 없기 때문에 다른 CIDR영역을 가지는 VPC를 하나 생성해주고 피어링 하면 된다.

내용이 길어지니 필요 없다면 다음 스탭으로 넘어가도 좋다.

VPC 생성


Redash 인스턴스가 올라갈 VPC를 하나 만들어준다.

10.0.0.0/16

Subnet 생성


AZ에 할당할 서브넷을 생성해준다. (최소 2개)
서브넷 계산기

10.0.0.0/24
10.0.1.0/24

왜 최소 2개냐고 물어본다면.. 그것이 서브넷이기 때문이지 않을까요?
1개만 생성해놓으면 ALB 붙일 때 안붙습니다 ㅎㅎ..

[선택] Subnet: Public IP 할당


인터넷 게이트웨이 생성 및 연결

라우팅 테이블에 등록

인터넷 게이트웨이를 생성해주고 라우팅테이블에 등록해줘야 외부망과 붙을 수 있다.

DNS 확인

이거 해줘야 외부 도메인연결 된다!

안해주면 RDS나 다른 자원을 도메인을 통해 연결할 때 통신이 안됨..!

내부 접근을 위한 보안그룹 설정

같은 망에 위치한 RDS나 ElastiCache같은 자원과 통신하기위해 VPC 보안그룹의 인바운드 설정이 필요하다.

PostgreSQL, Redis 포트를 열어주었다.

[선택] VPC 피어링


필요한 경우 VPC 피어링 할 수 있다.
다른 계정의 VPC일경우 계정 ID와 VPC ID를 같이 입력하여 요청하고 상대방이 수락하면 연결이 완료된다.

AMI로 시작

https://redash.io/help/open-source/setup#-AWS

접속하여 원하는 region의 AMI를 선택하여 인스턴스를 만들어주면 된다.

ap-northeast-2 바로가기

인스턴스 생성


t2.micro를 선택하여 배포할 경우 서비스 접근이 안되거나 오래걸립니다..
t3.medium 정도의 크기가 제일 안정적이었습니다.

[선택] 스팟 인스턴스 구매 설정


중간에 떨어져도 딱히 큰 문제가 생기지 않는다면 스팟인스턴스로 생성해준다. 현재 가격을 최고가격으로 잡아두면 왠만해서는 뺏기거나 종료되지 않을 것이다.

외부 접근을 위한 보안그룹 구성

환경설정 및 기타 유지보수를 위한 SSH와 HTTP정도만 열어주면 된다.

[선택] Elastic IP 연결

서버 재시작했는데 Public IP바뀌어버리면 외부에서 RDS 연결하던 네트워크에서 인바운드 설정 다시해줘야한다..
단일 인스턴스로 운영하는경우 방금 생성한 인스턴스를 연결해주면 된다.

여러대의 인스턴스로 운영하고싶다면 Network Load Balancer를 생성하면서 붙여주는 방법도 있다.

[선택] 도메인 연결

Public IP혹은 추가로 구성한 ALB가 있다면 ARN을 연결할 수 있다.


[선택] RDS 생성

가동중인 EC2 내부에 PostgreSQL DB가 포함되어있다.
혹시라도 스케일링되면서 다시 시작되는경우 기존 AMI로 다시 시작될텐데.. 그런경우 Redash의 사용자 계정 및 기타 설정정보가 모두 날아가는 상황이 발생한다.

그런이유로 Redis는 분리 안하더라도 내부에 포함되어있는 DB를 외부로 분리해야한다.

만약 기존에 사용하던 PostgreSQL이 있다면 Redash 전용 데이터베이스와 계정만 새로 만들어주면 된다.
필요 없다면 넘어가도 좋다.



그리 큰 데이터를 저장하지 않고.. 비용을 많이 태울 필요는 없기때문에 가장 작은 용량으로 한대만 띄워놓는다.

설정정보 덤프나 외부 툴 접근이 필요할 수 있기 때문에 Public access를 활성화했지만.. 필요없다면 비활성화 해도 무관하다.

[선택] Redis 생성

Redis도 PostgreSQL과 마찬가지로 EC2 안에 포함되어있다.
단순히 커넥션 관리나 검색결과 캐싱을 위한 기능을 하고있으니 Persistent 성격은 아니다.

캐싱으로 EC2 내부 자원을 잡아먹겠다 싶으면 최소크기로 생성해도 무관할 것으로 보인다.

설정파일 수정

ssh -i your-secret.pem ubuntu@${DOMAIN_OR_IP}
sudo vi /opt/redash/env
PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://...
POSTGRES_PASSWORD=YOUR_PASSWORD
REDASH_COOKIE_SECRET=YOUR_SECRET
REDASH_SECRET_KEY=YOUR_SECRET
REDASH_DATABASE_URL=postgresql://USERNAME:PASSWORD@DOMAIN/DATABASE_NAME

설정 마치고 EC2 재부팅 해준다.

DB 테이블 초기화

ssh -i your-secret.pem ubuntu@${YOUR_DOMAIN_OR_IP}

ubuntu@ip-10-0-0-145:~$ sudo docker container list
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                         NAMES
92eb8b1b1785        redash/nginx:latest          "nginx -g 'daemon of…"   2 hours ago         Up 2 hours          0.0.0.0:80->80/tcp, 443/tcp   redash_nginx_1
d083586973d4        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   2 hours ago         Up 2 hours          0.0.0.0:5000->5000/tcp        redash_server_1
dc39025e65b5        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   2 hours ago         Up 2 hours          5000/tcp                      redash_adhoc_worker_1
13c41fc14c09        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   2 hours ago         Up 2 hours          5000/tcp                      redash_scheduler_1
6cf503d22f8a        redash/redash:8.0.0.b32245   "/app/bin/docker-ent…"   2 hours ago         Up 2 hours          5000/tcp                      redash_scheduled_worker_1
ab650e796b5c        postgres:9.6-alpine          "docker-entrypoint.s…"   2 hours ago         Up 2 hours          5432/tcp                      redash_postgres_1
bc73e56ac9a2        redis:5.0-alpine             "docker-entrypoint.s…"   2 years ago         Up 2 hours          6379/tcp                      redash_redis_1


ubuntu@ip-10-0-0-145:~$ sudo docker exec -it d083586973d4 bash
redash@d083586973d4:/app$ python manage.py database drop_tables
redash@d083586973d4:/app$ python manage.py database create_tables
[2021-12-06 06:47:46,528][PID:43][INFO][alembic.runtime.migration] Context impl PostgresqlImpl.
[2021-12-06 06:47:46,529][PID:43][INFO][alembic.runtime.migration] Will assume transactional DDL.
[2021-12-06 06:47:46,554][PID:43][INFO][alembic.runtime.migration] Running stamp_revision  -> e5c7a4e2df4d
redash@d083586973d4:/app$ exit

redash 서비스가 실행되고있는 컨테이너에서 데이터베이스를 초기화해준다.

Redash 접속 후 기본설정

Admin 유저 생성화면이 나타나면 순서대로 진행해주고 사용하면된다.

[선택] AMI 생성

혹시 스케일링 설정을 하게될 경우 설정파일을 그대로 유지하면서 인스턴스를 띄워줘야한다.
그런 이유로 AMI를 하나 만들어놓고 스케일링 그룹에 설정해두면 된다.

작업후기

Redash 하나 올리면서 뭐 이렇게 번거로울까 싶지만.. 네트워크 구성이나 기타 인프라 설정을 많이 만져보면서 느낀점들이 상당히 유익했던 것 같다.

문서를 작성하면서 생각이 들었는데..
이런 데이터 분석용 서비스는 개인사용자가 AWS에 self-host 하면서 쓰는것이 매달 발생하는 비용문제를 이유삼아 조금 꺼려할 수 있는 부분이 아닌가싶다.

그래서 매번 인스턴스가 떠있을 필요도 없으니 Heroku로 올려두면 필요할 때 사용할 수 있지 않을까? 라고 생각하여 아래의 레파지토리를 생성하게되었다.

https://github.com/dev4hobby/redash-heroku
Heroku에서 container기반 환경을 생성하고 Add-ons 기능을 활용하여 DB도 붙여보는등.. 편리하게 작업할 수 있었다.
이런 데이터 분석 솔루션 하나쯤 갖고있으면 정말 편하게 쓸 수 있으니 AWS가 부담스럽다면 Heroku에서 올려보는건 어떨까?

profile
웹 백엔드 합니다.

0개의 댓글