- airflow에서 pymysql이 기본으로 제공되지 않는데, pymysql을 설치하려면 아래와 같이 내용을 수정하고 저장하자.
## docker compose 파일에서 추가로 설치할 python module을 등록하는 경우
## 아래와 같은 environment 찾아서 수정 후 docker compose up -d
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql}
## module을 여러개 설치해야하는 경우는 아래와 같이 공백으로 구분하여 추가한다
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql pandas numpy}
3. airflow를 실행하자
- docker compose 파일이 있는 폴더에서 docker compose up -d으로 airflow 환경을 구축한다.
- airflow에서 사용하려는 port를 이미 사용하고 있는 경우 yaml에서 port 번호를 바꿔주도록 하자.
- 공식적으로 제공하는 파일에서는 id와 password는 모두 airflow이므로 변경이 필요하면 yaml에서 바꿔주자.
- localhost:8080 으로 접속해서 아래와 같은 창이 뜨면 테스트 환경 구축에 성공한 것이다.
- docker-compose.yml 파일이 있는 경로로 이동하고, docker compose로 설정이 변경된 컨테이너를 다시 띄운다.
- 설정이 변경되지 않은 컨테이너는 재생성 되지 않고 Nginx 컨테이너만 다시 생성될 것이다.
1. 경로로 이동해서 Nginx 컨테이너를 다시 실행
cd /opt/redash
COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d
2. 컨테이너 재생성 후 docker-compose ps 입력 후 아래와 같은 화면이 나오는지 확인
Name Command State Ports
-------------------------------------------------------------------------------------------------------------
redash_adhoc_worker_1 /app/bin/docker-entrypoint ... Up 5000/tcp
redash_nginx_1 nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
redash_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
redash_scheduled_worker_1 /app/bin/docker-entrypoint ... Up 5000/tcp
redash_scheduler_1 /app/bin/docker-entrypoint ... Up 5000/tcp
redash_server_1 /app/bin/docker-entrypoint ... Up 0.0.0.0:5000->5000/tcp
3. redash_nginx_1의 Ports가 아래와 같으면 설정 성공
0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
1. Nginx 컨테이너로 진입
docker exec -itu 0 redash_nginx_1 bash
2. vim 설치
apt-get update
apt-get install vim
3. Nginx 설정 파일이 있는 폴더로 이동
cd /etc/nginx
3. 테스트용 SSL 인증서 생성
- 간단한 연습을 위해 SSL 인증서와 도메인을 구매할 수는 없다.
- openssl이 설치되어 있다면 아래의 명령어로 자체 서명된 인증서를 생성할 수 있다.
- 물론 자체 서명이므로 보안성이 전혀 없으니 연습용으로만 사용할 수 있으니 실제 적용에는 인증서를 꼭 구매해야한다.
1. 인증서를 생성하여 저장할 폴더를 생성하고 폴더로 진입
mkdir self_cert_ssl_files
cd self_cert_ssl_files
2. openssl로 자체서명 인증서 생성
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
3. 입력을 요청하는 정보는 정확히 입력할 필요는 없으니 참고
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (e.g. server FQDN or YOUR name) []:test
Email Address []:test@test.test
4. cert.pem 과 key.pem 파일이 생성되었는지 확인하자
4. 80번 포트와 443 포트 설정
- 80번 포트는 http 접속, 443번 포트는 https 접속인 것을 기억할 것이다.
- 이제 Nginx의 설정을 변경해서 80번 포트와 443번 포트에 대한 접속 설정을 해보자.
vim /etc/nginx/conf.d/default.conf
- 연습삼아 redash 공식 홈페이지의 설정을 일부 수정하여 적용해보자
- 아래의 설정을 default.conf 파일에 적용하자
- 아래의 설정은 80번 포트로 접속하는 경우 403 에러가 나도록 설정하고, 443번 포트로 접속하는 경우 SSL을 적용하는 설정이다.
1. 터미널에 nginx -t 입력하여 메세지 확인
2. 설정이 정상이라면 아래와 같은 출력 값이 뜬다.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
3. Nginx를 끄지 않고 설정을 적용할 수 있다.
service nginx reload
4. 정상적으로 적용 됐다면 아래와 같은 출력 값이 뜬다.
[ ok ] Reloading nginx: nginx.
- 그리고 http://223.130.200.107로 접속을 시도해보면, https://naver.com으로 다시 접속되는 것을 확인할 수 있다.
- https는 암호화된 통신을 할 수 있는 기능이라고 생각하면 간단하며, 보안을 위해 적용하는 것이라고 생각하면 된다.
- 결론적으로 포트 번호가 없는 http와 https 도메인을 사용할 수 있도록 하는 포트가 80번과 443번 포트이다.
2. 뭔말인지 잘 모르겠어요.
- 직접 우리가 실습 중인 redash로 확인해보자
- 일단 좀 더 직관적인 도메인 실습을 위해 localhost가 아닌 임의의 도메인을 등록해보도록 하자.
1. 아래의 방식으로 파일에 관리자 권한에 접근한다
윈도우즈는 C:\Windows\System32\drivers\etc\hosts (텍스트 편집기를 사용해 관리자 권한으로 연다)
맥OS는 sudo vim /private/etc/hosts
우분투는 sudo vim /etc/hosts
2. 임의의 도메인 이름을 설정하고 저장한다.
127.0.0.1 localhost 라고 설정된 것 처럼
127.0.0.1 my.example.domain 과 같은 임의의 도메인을 설정한다.
- 이렇게 설정한 이후 127.0.0.1:5000, localhost:5000, my.example.domain:5000으로 접속해서 동일한 페이지가 뜨는 것을 확인할 수 있다.
설정한 임의의 도메인으로도 접속할 수 있다.
3. 80번 포트로 접속해보자 - http 접속
- 이번에는 127.0.0.1:80, localhost:80, my.example.domain:80
- 5000이 주소에 보였던 것과 달리 127.0.0.1, localhost, my.example.domain만 주소창에 나타나는 것을 볼 수 있다.
- 이처럼 80번 포트는 기본적으로 포트 번호가 숨겨진 것을 알 수 있다.
- 그리고 크롬에서 확인해보면 보안 연결인 https가 적용되지 않은 http로 접속한 것을 확인할 수 있다.
보안이 중요한 사이트인 경우 https로 접근하도록 설정해야한다.
4. 443 포트로 접근은 다음 글에서 실습해보도록 하겠다.
- https 접근을 위해서는 SSL 인증서를 구입해야한다.
- 하지만 실습을 위해 도메인과 SSL 인증서를 구입할 수는 없으니 연습용 인증서를 사용해 실습할 것이다.
- 정상적인 접근 화면은 확인할 수 없지만 Nginx를 통해 80번 포트로의 접근을 443포트로 보내주는 설정 등을 실습하여 안전한 대시보드 환경을 만들어보도록 하자!
SELECT date_format(orderDate, "%Y-%m") AS order_month,
count(*) AS order_month_count
FROM orders
GROUP BY order_month
- 조회된 테이블에 있는 New Visualization를 눌러서 시각화를 해보자
라이언이 귀여워서 라이언으로 New Visualization을 표시해보았다.
- 아래와 같은 에디터에서 시각화 설정을 할 수 있다.
(1) 시각화 선택에서 box, chart, map 등의 다양한 시각화 방식을 선택할 수 있다.
(2) 생성한 시각화에 이름을 설정할 수 있다.
(3) 각 시각화 방식에 따라 세부 설정할 수 있는 옵션이 다르게 나오니 직접 실습해보자.
- 세부 설정을 통해 시각화 색상/범례/수치표시 등의 설정을 변경할 수 있다
옵션 설정의 설명이 영어로 되어 있지만 난이도가 높지 않다.
- Pivot Table을 활용한 시각화는 직접 만들어보도록 하자.
- 아래의 쿼리를 사용해서 만들면 아래의 GIF와 동일한 기능을 할 수 있는 통계치를 뽑을 수 있다.
SELECT date_format(orderDate, "%Y-%m") AS order_month,
status,
count(*) AS status_count
FROM orders
WHERE orderDate BETWEEN '{{날짜.start}}' AND '{{날짜.end}}'
GROUP BY order_month,
status
- '{{날짜}}'와 같은 방식으로 파라미터를 설정하여 사용자가 임의의 날짜를 선택할 수 있도록 할 수 있다.
- 대시보드에 시각화를 넣으면 대시보드에서 날짜를 조절하는 등의 기능을 그대로 사용할 수 있다.
파라미터를 설정하고 톱니바퀴를 누르면 Type을 설정할 수 있다.
- 글로 설명하기 어려워서 GIF 파일을 사용했다.
- 다양한 통계치를 뽑는 방식이 있으니 실습해보자.
컬럼을 이동시켜 축에 배치할 수 있고 다양한 통계치를 선택할 수 있다.
3. 대시보드 생성
- Dashboard로 진입하여 대시보드를 생성할 수 있다.
- 우측 하단의 Add Textbox를 누르면 마크다운이 가능한 텍스트 위젯을 생성할 수 있고, Add widget를 누르면 미리 생성한 시각화를 배치할 수 있다.
- 작성한 쿼리와 시각화를 선택해서 Add to Dashboard를 통해 시각화를 배치해보자.
쿼리와 시각화 이름을 확실히 정해두면 대시보드를 구성할 때 도움이 된다.왼쪽 상단의 날짜의 수치를 변경해서 다양한 기간의 시각화 결과를 확인할 수 있다.
4. 대시보드 위젯 설정
- Add widget으로 시각화를 대시보드에 배치할 때 Value Source 설정을 변경할 수 있다.
- 변경할 수 있는 파라미터를 여러개 생성하거나 위젯에 종속시켜 각각 다르게 수치를 변경할 수 있다.
(1) New dashboard parameter로 새로운 파라미터 key를 생성할 수 있다.
(2) Existing dash dashboard parameter로 미리 작성한 위젯의 key를 같이 사용할 수 있다.
(3) Widget parameter로 해당 위젯에만 독립적으로 사용되는 파라미터를 생성할 수 있다.
(4) Static value로 설정한 파라미터 값으로 나온 결과를 보여주는 위젯을 생성할 수 있다.
2~3개의 시각화를 작성해두고 사용해보면 어렵지 않게 습득할 수 있다.
5. 공식 홈페이지의 설명도 확인해보자
- 국내에는 자료가 없어서 parameter 사용법은 redash 공식 홈페이지의 가이드로 확인해서 습득하였다.
- 세세한 사용 방법은 역시 검색과 실습 밖에 없다!
- 기본적인 사용법의 설명은 이번 포스팅으로 끝이다.
- 다음으로는 ldap과 같은 로그인 방식의 적용, Nginx를 활용한 https로의 접속 방식 설명을 적어보도록 하겠다.
- Redash 서버가 기본적으로 5000번포트로 띄워지고, 우리에게 익숙한 포트 번호가 없는 도메인으로 접속하기 위한 80번 포트와 SSL 적용을 위한 443 포트 또한 포트포워딩했습니다.
- 80번 포트와 443 포트의 사용은 아직 이해하지 않으셔도 되고, 추후 Nginx를 설정 설명에서 이해하시면 됩니다.
(1) 터미널에서 컨테이너 상태 확인
docker ps -a
(2) 결과가 아래와 같아야 정상 작동하는 것
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7dcfad7ca41 jrei/systemd-ubuntu:18.04 "/lib/systemd/systemd" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp redash_test
(3) 수월한 설치를 위해 sudo 권한으로 컨테이너에 진입
docker exec -itu 0 redash_test bash
- 위의 과정 중에 docker exec -itu 0 rehasd_test bash의 -it는 익숙하지만 -itu 0가 익숙하지 않을 수 있습니다.
- u 0는 sudo 권한을 컨테이너 내에서 사용할 수 있게 하는 설정입니다.
- Redash 설치 스크립트에 sudo 권한을 요구하는 과정이 많으니 편의를 위해 꼭 sudo 권한을 사용할 수 있도록 설정합시다.
3. 설치 세부 과정
(1) Redash 스크립트 설치와 설치에 필요한 환경 설정
- 필수로 필요한 우분투 패키지를 설치하고 설치 스크립트를 가져옵니다.
- 기존에 도커와 도커컴포즈가 설치된 시스템에서 설치를 해보시는 경우 도커 버전이 변경될 수 있으니 주의하세요!
(1) 필요한 우분투 패키지 설치
apt-get update
apt-get install sudo
apt-get install git
apt-get install vim
(2) 설치 스크립트를 가져옵니다
git clone https://github.com/getredash/setup.git
cd setup
- (선택사항)도커 설치가 필요 없는 분은 setup.sh파일의 마지막 부분의 install_docker 부분을 삭제하시면 됩니다.
(2) 설치 진행과 발생할 수 있는 오류 설명
- 설치 파일의 권한을 변경하고 설치 스크립트를 실행합니다.
sudo chmod +x setup.sh
sudo ./setup.sh
- 일반적으로 첫번째로 볼 수 있는 에러는 아래와 같습니다.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 664 100 664 0 0 1019 0 --:--:-- --:--:-- --:--:-- 1018
100 11.2M 100 11.2M 0 0 2939k 0 0:00:03 0:00:03 --:--:-- 5165k
--2022-04-22 06:13:04-- https://raw.githubusercontent.com/getredash/setup/master/data/docker-compose.yml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1076 (1.1K) [text/plain]
Saving to: 'docker-compose.yml'
docker-compose.yml 100%[=================================================>] 1.05K --.-KB/s in 0s
2022-04-22 06:13:04 (64.1 MB/s) - 'docker-compose.yml' saved [1076/1076]
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
- 에러메세지 설명대로 도커가 실행되지 않은 경우에 발생합니다.
- 도커를 실행하고 다시 setup 스크립트를 실행합니다.
(1) docker가 켜져있는지 확인
service --status-all
(2) 실행되지 않았다면 아래처럼 [-] 표시가 있음
[ - ] apparmor
[ - ] cron
[ + ] dbus
[ - ] docker
[ - ] hwclock.sh
[ - ] procps
[ + ] unattended-upgrades
(3) 도커를 실행
service docker start
(4) service --status-all로 다시 확인하고 실행되었다면 [+]로 표시됨
[ - ] apparmor
[ - ] cron
[ + ] dbus
[ + ] docker
[ - ] hwclock.sh
[ - ] procps
[ + ] unattended-upgrades
(5) 설치 스크립트를 다시 실행
sudo ./setup.sh
- 가끔씩 이 과정에서 time out error라는 문구와 함께 컨테이너가 일부만 생성되거나 하는 문제가 발생하는데, docker-compose의 HTTP 테스트시간이 짧게 설정되어 있어서 발생하는 문제입니다.
- 아래와 같은 과정으로 일반적으로 해결할 수 있습니다.
(1) 깨끗하게 설치하기 위해 설치되다가 멈춘 컨테이너를 삭제
docker-compose down
(2) 도커 컴포즈의 HTTP 테스트 시간을 200초 까지 늘려서 다시 생성
sudo COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d
- 도커 컴포즈 설정 파일이 있는 폴더로 이동하여 정상적으로 Redash 시스템이 구축되었는지 확인합니다.
- docker-compose.yml파일에 docker-compose.yml.1와 같이 숫자가 붙은 파일들이 많이 있을텐데 반복된 설치 스크립트 실행으로 생긴 것이니 docker-compose.yml을 제외한 yml 파일은 삭제하시면 됩니다.
(1) Redash 시스템 구성과 관련된 파일들이 있는 디렉토리로 이동
cd /opt/redash
(2) 도커 컴포즈에서 Redash 시스템 구성이 잘 되었는지 확인
docker-compose ps -a
(3) 아래와 같이 나오면 성공
Name Command State Ports
------------------------------------------------------------------------------------------------
redash_adhoc_worker_1 /app/bin/docker-entrypoint ... Up 5000/tcp
redash_nginx_1 nginx -g daemon off; Up 443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
redash_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
redash_scheduled_worker_1 /app/bin/docker-entrypoint ... Up 5000/tcp
redash_scheduler_1 /app/bin/docker-entrypoint ... Up 5000/tcp
redash_server_1 /app/bin/docker-entrypoint ... Up 0.0.0.0:5000->5000/tcp
(4) 에러 발생으로 인한 반복 과정에서 생성된 docker-compose.yml파일이 있는지 확인
ls
(5) 디렉토리에서 docker-compose.yml.1을 확인함
docker-compose.yml docker-compose.yml.1 env postgres-data
(6) docker-compose.yml.1을 완전히 삭제
rm -f docker-compose.yml.1
3. 기본적인 설치를 완료했다!
- 웹브라우저에서 내 컴퓨터의 80번이나 5000번 포트로 접속해서 아래와 같은 화면이 뜨면 시스템 구축에 성공한 것이다.
- localhost:80나 localhost:5000을 주소창에 입력하여 접속해보자!
- 80번 포트는 Nginx를 통해 5000번 포트로 다시 접근하는 경로이고, 5000번 포트는 플라스크 서버로 띄운 Redash에 직접 접근하는 것이다.