개인정보보호법의 안전성 확보 조치에 따라 국.공립 사립대학은 웹서비스에 SSL 인증서 도입이 의무화되어 있다. 우리학교에서도 이에 따라 행정전자서명인증센터로부터 발급받은 SSL 인증서를 웹서버에 적용하고 있는데, 최근 Node.js 기반으로 개발된 웹서비스에 적용이 필요해졌다. 일명 G-SSL이라고도 하는 행정안전부 보안서버인증서(GPKI)는 싱글 도메인, 와일드카드(*) 도메인, 멀티 도메인을 지원하며 Apache HTTPd용과 IIS용, Tomcat용 포맷을 별도로 지원하고 있다.

 여담으로 G-SSL 인증서는 최신 웹브라우저와 모바일용 브라우저를 지원하지 못하는 등 문제가 많아서 행정망 업무시스템으로 발급을 제한하였다. 2019년 6뤌 이후부터 대학은 발급대상에서 제외되었으며 기존 발급된 인증서의 유효기간 만료일까지만 사용이 가능하도록 해서 민간 SSL 인증서로 전환을 강제하고 있다.

 G-SSL 인증서는 2015년에 웹트러스트 국제인증을 획득하여, 최상위(Root) CA 역할을 하는 행정안전부 보안서버인증(GPKI)과 하위(sub) CA 기관인 교육부 보안서버인증(EPKI)을 통해 대학기관의 인증을 처리하는 구조이다. 그렇기 때문에 G-SSL 인증서의 경우 인증서 소유자(대학)로부터 트러스트의 체인이 시작되는 Root CA까지 인증 경로라고도 하는 인증서 체인을 위해 Root CA 행정안전부(GPKI) 인증서 및 교육부 CA (EPKI) 인증서를 모두 등록해야 한다.

 위의 2가지 인증서는 대학의 경우 교육부 행정전자서명인증센터 자료실을 통해 내려받으면 된다.

 Node.js는 http 대신 https 클래스를 이용하며, 실제 서비스에서는 비동기 구현이 필요하겠으나, 인증서 체인의 동작만 확인할 목적이므로 간단히 동기방식으로 코드를 작성했다.

NodeMCU

 ESP8266은 3개의 UART 포트를 제공한다. UART0과 UART2는 같은 Serial 클래스에서 관리하므로 동시 사용이 불가능하므로 교대로 사용해야 한다. UART1은 Serial1 클래스에서 관리하므로 동시 사용이 가능하지만 출력 전용이기 때문에 TX만 정의되어 있다.

  UART0 UART1 UART2
RX GPIO3(RX) - GPIO13
TX GPIO1(TX) GPIO2 GPIO15
Arduino class Serial Serial1 Serial
비고 UART2와 동일한 클래스를 통해 관리됨 메시지 전송 전용. 수신을 위한 RX는 정의되어 있지 않음 UART0과 동일한 클래스를 통해 관리됨

 UART0과 UART2는 동시 사용이 불가능하므로 한 번에 하나의 포트만 사용하도록 Serial 클래스의 swap() 멤버함수를 사용한다.

UART0 포트와 USRT2 포트 연결하기

NodeMCU와 USB-UART 연결 장치(FTDI)

NodeMCU는 ESP-12E 개발보드가 사용되었으며 기본적으로 micro-USB 포트를 제공한다. micro-USB 포트는 UART0 포트를 사용하며, RX와 TX를 공유한다. USB-UART 연결 장치를 추가로 연결하기 위해 UART2 포트의 GPIO13과 GPIO15에 연결했다. NodeMCU는 UART0 포트를 이용하여 Ardino의 시리얼 모니터로 출력을 보내며, UART2 포트의 출력은 별도의 터미널프로그램으로 연결했다.

프로그램 소스 코드와 같이 구문 강조(code highlight) 기능이 필요한 코드를 블로그에 포함(embeded)시키기 위해서는 페이스트빈(pastebin)이라는 서비스가 필요하다. 물론 티스토리나 네이버의 경우 자체 편집기에 프로그램 소스 등을 포함시키기 위한 별도의 기능을 제공하고 있다. 특히 티스토리의 경우 SyntaxHightlight 플로그인을 추가하면 좀 더 다양한 구문 강조 기능을 사용할 수 있다.

대표적인 페이스트빈 서비스로는 자바스크립트 기반의 SyntaxHighlighter가 있으며, 이 밖에도 'code highlight'나 'syntax highlight'라는 검색어로 구글링해보면 다양한 프로그래밍 언어로 구현된 온라인 서비스와 SyntaxHighlight와 같이 블로그 소스내에 끼워 넣을 수 있는 소스로 제공되는 페이스트빈 서비스를 찾을 수 있다.

여기서는 깃허브에서 제공하는 페이스빈 서비스인 Gist를 이용하여 블로그에 소스 코드를 포함시키는 방법을 알아보겠다.

우선 깃허브를 가입하고 계정을 생성한다. 그리고 Gist로 접속하여 파일을 생성하면 끝!

https://gist.github.com

먼저 확장자를 포함한 파일 이름를 입력한다.

본문에 소스를 입력한 뒤에 gist를 생성한다.

이때 secret과 public을 구분하여 만들 수 있는데 public은 외부의 검색을 허용한다는 정도만 이해하면 된다. Github의 private와 public 저장소의 차이와 비슷.

우측 상단에 끼워넣기(embed)를 위한 복사 기능이 있으므로 복사한 후 블로그 소스에 <script> 블럭을 붙여넣기 하면 완료.

참고로 이 기능은 HTML 코드 편집을 지원하는 블로그에만 가능하며 HTML 코드 편집을 지원하지 않을 경우 Color Scripter와 같은 온라인 페이스트빈 서비스를 이용하면 된다.

Raspberry Pi 모니터링

 Grafana는 오픈소스 기반의 강력한 대시보드 플랫폼이다. 서버나 임베디드 장비의 운영상태 등을 Prometheus, ElasticSearch와 같은 data source를 플러그인 방식으로 연결해서 다양한 그래픽 요소로 나타낸다.

 여기서는 대표적인 오픈소스 모니터링 솔루션인 Prometheus를 이용하여 요즘 메이커들 사이에 사물인터넷의 주요 디바이스로 자리매김하고 있는 라즈베리 파이의 운영상태를 모니터링 해보기로 하겠다.

Raspberry Pi 3 B+

 라즈베리 파이는 영국의 라즈베리 파이 재단에서 학교와 개발도상국에서의 기초 컴퓨터 과학 교육 증진을 목표로 제작한 초소형 PC이다. 메인보드에 내장된 GPIO핀을 이용하여 다양한 센서모듈을 조합하여 메이커들에게는 사물인터넷의 핵심 기기로 각광받고 있다.

 서버나 사물인터넷 허브와 같이 중단없이 장시간 운영되는 장비의 경우 안정적인 운영을 위해 실시간 서비스 모니터링이 필수적인데, Prometheus를 이용하면 다양한 정보를 수집하여 로그를 저장하고 이를 Grafana와 연동하여 세련된 그래픽 환경으로 운영이 가능하다. 게다가 오픈소스로 제공되기 때문에 설치와 운영 등 기술 비용(!)을 제외하면 소프트웨어 라이선스 비용은 무료이다. (제발, 소프트웨어 라이선스가 무료라고 모든게 공짜라는 생각은 버리자!)

Prometheus Architecture

 Prometheus는 그림과 같이 Prometheus 서버가 외부의 export node들로부터 metric을 pulling 방식으로 수집하고, 이를 Grafaana 등을 이용해 시각화한다. 구조는 좀 복잡해 보이지만 이 글에서 구현해 볼 모니터링 툴을 간단히 설명하면,

1. node exporter - 모니터링할 기기의 메트릭(정보)을 제공
2. prometheus - 노드들로부터 수집한 메트릭을 집계하거나 후처리
3. Grafana - prometheus가 집계한 데이터를 시각화

 이렇게 3가지 서비스를 설치하면된다. 3가지 서비스는 모두 HTTP 프로토콜을 사용하므로 개별 장비에서 별도로 운영해도 되고 한 장비에서 운영해도 된다. 실제 운영환경에서는 모니터링 할 개별 장비에는 node exproter 서비스를 설치하고, 모니터링 서비스를 제공할 서버에 prometheus와 grafana를 설치해서 운영하게 될 것이다.

설치 준비.
최신 버전의 Raspberian이 설치된 라즈베리 파이(이 글에서 사용한 라즈베리 파이는 NOOBS 3.2.0을 이용하여  Raspberry Pi 3 B+에 설치함)


node exporter 설치하기

배포 : https://github.com/prometheus/node_exporter/

 

prometheus/node_exporter

Exporter for machine metrics. Contribute to prometheus/node_exporter development by creating an account on GitHub.

github.com

1. 설치하기

현재 사용 중인 라즈베리 파이 CPU 타입에 맞는 배포 파일을 내려받아 압축을 푼다. (설치 작업을 편리하게 하기위해 root 권한으로 실행할 것.)

$ sudo su -
# cat /proc/cpuinfo (ARM CPU 버전 확인)
# cd /opt
# curl -sSLO https://github.com/prometheus/node_exporter/releases/download/v0.16.0-rc.0/node_exporter-0.16.0-rc.0.linux-armv7.tar.gz
# tar zxvf node_exporter-0.16.0-rc.0.linux-armv7.tar.gz
# ln -s node_exporter-0.16.0-rc.0.linux-armv7 node_exporter ### 설치 진행의 편리를 위해 심볼릭 링크 생성

 

※ 여기서 잠깐!
 현재 설치하고 있는 라즈베리 파이 3 B+는 ARMv7 계열의 CPU를 사용하므로 armv7 이름이 들어간 배포 프로그램을 내려받는다.

 그리고 라즈베리 파이에서 일반적으로 많이 사용하는 라즈비안(Raspberian)은 데비안(Debian) 계열의 리눅스이므로 디렉터리 관리는 리눅스의 파일시스템 관례( http://www.pathname.com/fhs/pub/fhs-2.3.html)를 따르는게 좋을 것 같다. 리눅스에서는 통상 사용자가 직접 소스나 실행파일을 내려받아 설치할 경우 /opt나 /usr/local 디렉터리을 이용한다.

 관례에 따르면 /opt 디렉터리는 애드온 어플리케이션 소프트웨어 패키지의 인스톨 용도로 사용되며, /usr/local 디렉터리는 시스템 관리자가 필요에 의해 직접 컴파일하거나 설치하는 소프트웨어 인스톨 용도이다.

 curl 명령은 원격서버(FTP, HTTP 등)에서 데이터를 전송받을 때 사용한다. 여기서는 -s: 진행 상태 표시 안함, -S: -s와 함께 사용. 실패시 에러 표시, -L: 요청 페이지가 다른 위치로 옮겨졌을 경우(HTTP 응답코드 303) 재요청, -o: remote 데이터를 파일로 저장 옵션을 사용하였다.

2. SYSTEMD 파일 설치

# cd /etc/systemd/system/
# curl -sSLo - https://raw.githubusercontent.com/prometheus/node_exporter/master/examples/systemd/node_exporter.service \
 |sed -e 's|/etc/sysconfig/node_exporter|/etc/default/node_exporter|' |sed -e 's/^User.*//'  > node_exporter.service
# curl -sSLo - https://raw.githubusercontent.com/prometheus/node_exporter/master/examples/systemd/sysconfig.node_exporter \
 |sed -e 's/^OPTIONS/#OPTIONS/;aOPTIONS=""' >/etc/default/node_exporter
# cp /home/pi/node_exporter-0.16.0-rc.0.linux-armv7/node_exporter /usr/sbin/node_exporter
# systemctl daemon-reload
# systemctl enable node_exporter.service
# systemctl start node_exporter.service

시스템 부팅시 자동 실행을 위해 데몬 서비스로 설치하는 과정이다.

3. Query 테스트

$ curl 127.0.0.1:9100/metrics

 제대로 설치가 되었는지 확인하기 위해 웹서비스를 호출한다. 제대로 설치가 되었다면 라즈베리 파이 시스템의 다양한 정보(metric)가 출력될 것이다.


Prometheus 설치하기

공식사이트 : https://prometheus.io/

 

Prometheus - Monitoring system & time series database

Some of our users include:

prometheus.io

배포 : https://github.com/prometheus/prometheus

 

prometheus/prometheus

The Prometheus monitoring system and time series database. - prometheus/prometheus

github.com

1. 설치하기

 현재 사용 중인 라즈베리 파이 CPU 타입에 맞는 배포 파일을 내려받아 압축을 푼다. (설치 작업을 편리하게 하기위해 root 권한으로 실행할 것.)

# cd /opt
# curl -sSLo https://github.com/prometheus/prometheus/releases/download/v2.11.1/prometheus-2.11.1.linux-armv7.tar.gz
# tar zxvf prometheus-2.11.1.linux-armv7.tar.gz
# ln -s prometheus-2.11.1.linux-armv7 prometheus

2. YAML 설정 파일 편집

# vi /opt/prometheus/prometheus.yml

'scrape_configs:'섹션을 찾아서 아래와 같이 작성한다.

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'nodes'
    scrape_interval: 1m
    scrape_timeout: 10s
    static_configs:
    - targets: ['127.0.0.1:9100']

 Prometheus가 node_exporter를 통해 1m 단위로 metric값을 수집하도록 설정하였다. Prometheus의 설정은 'global:' 섹션에서 지정한다.

3. 서비스 실행

# cd /opt/prometheus
# nohup ./prometheus &

4. Query 테스트

$ curl http://127.0.0.1:9090/metrics

Grafana 설치하기

공식사이트 :  https://grafana.com/

 

Grafana Labs

Splunk by Grafana Labs The official Splunk premium plugin from Grafana Labs,

grafana.com

1. 설치하기

 Grafana 역시 Prometheus처럼 배포 소프트웨어를 내려받아 설치할 수 있으나 다행히 Raspbian용 배포판이 있으므로 패키지 설치 프로그램을 이용하여 손쉽게 설치가 가능하다.

 공식사이트에서 'Get Grafana' 버튼을 클릭하여 현재 사용 중인 라즈베리 파이에 맞는 배포판을 내려받는다. (ARMv7)

$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt autoremove -y
$ curl -sSLo https://dl.grafana.com/oss/release/grafana_6.2.5_armhf.deb
$ sudo dpkg -i grafana_6.2.5_armhf.deb
$ sudo apt-get upgrade -y
$ sudo systemctl daemon-reload
$ sudo systemctl enable grafana-server
$ sudo systemctl start grafana-server

2. Grafana  실행

 라즈베리 파이에서 웹브라우저를 띄우거나, 사용 중인 PC에서 웹브라우저를 띄워서 라즈베리 파이에 설정한 IP 주소를 포함한 URL 주소를 입력한다. 정상적으로 설치가 완료되었다면 아래와 같이 Grafana 로그인 화면이 표시된다.

Grafana 로그인

 디폴트 ID와 Password인 'admin'을 입력하여 로그인한다.

 「Data Sources」 메뉴를 선택하여 Prometheus를 등록한다. 

「Add data sources」 버튼을 클릭하여 「Prometheus」를 선택한다.

 다음과 같이 입력란에 값을 입력한다.

Name: Prometheus
URL: http://localhost:9090
Access: Server(default)

 Save & Test」 버튼을 클릭하여 Data source를 등록한다.

 「+」 > 「Import」 메뉴를 선택한다.

Dashboard ID: 1860을 입력하여 미리 준비된 Dashboard를 등록한다.

 드디어 설치 완료! 라즈베리 파이의 모니터링 화면을 볼 수 있다. Good luck!

생각보다 준비할게 많은 얇은 책

센서는 우리의 일상을 둘러싸고 있다.

Make: Getting Started with Sensors

 얇은 분량으로 기본적인 센서들을 이용하여 따라 하기 식으로 간단하게 실행시켜볼 수 있는 형식이라 가벼운 마음으로 빌려서 필요한 부품들을 구매한 후 실습을 해봤다. 일단 라즈베리 파이와 아두이노 우노 보드만으로도 5~6만원 정도에 책에 나오는 각종 부품을 개별 구매하니 다시 6~7만 원에서 정도 지출이 필요했다. 거기에 시행착오 비용 ∝까지!

 ​아두이노와 라즈베리 파이로 불리는 보드에 각종 센서들을 부착해서 직접 회로를 구성하는 메이커 문화가 나름 붐을 일으켜 자리를 잡아가고 있다. 물론 최근 메이커 문화의 원조격이라고 할 수 있는 '메이커미디어'의 파산 소식도 들려오지만 여전히 메이커 문화는 꾸준히 성장하고 있는 것 같다.

 ​메이커(전자회로) 입문자에게는 그냥 한 번 쭉 따라해볼 수 있는 좋은 내용이다. 실습을 위해 준비할 부품들이 생각보다 많지만 입문서를 거치고 본격적인 회로를 구성하기 위해 기본적으로 필요한 부품들이므로 계속 사용하게 되니 걱정할 것 없다.

참고.
p.134 SPI 통신을 이용하는 실습에서 라즈베리 파이는 기본적으로 SPI 통신이 비활성되어 있으므로 먼저 raspi-config 등의 명령을 이용하여 SPI 통신을 활성화시켜야 한다.

+ Recent posts