설치를 위한 사전 정보

Redhat에서 정석적인 경로로 ansible을 받는 경우, Subscription 에 대한 사전지식이 필요하지만, 여기서는 따로 전달하지 않는다. Ansible은 표준 레드햇 엔터프라이즈 리눅스 서브스크립션이 있으면 제한된 지원을 받으며, 해당 채널을 사용하여 ansible을 설치할 수 있다. 이러한 채널은 Repository인 rhel-7-server-ansible2-rpms(최신 업데이트버전),  rhel-7-server-ansible-2.7-rpms(2.7버전) 등이 있다.  (2.6, 2.5, 2.4 등도 물론 있을 것이다)

 

그러나 Ansible과 해당 모듈에 대해 정식 지원을 원한다면 Redhat Ansible Engine Subscription을 구매해야 한다. 이는 SLA(Service Level Agreement)와 Ansible, 그리고 핵심 모듈의 공개 적용 범위에 대한 공식 기술지원을 제공한다.

 

또한 Redhat Ansible Engine은 신속한 업스트림 개발로 인해 버전 수명주기가 빠른 편이다. 상세한 수명 주기는 아래 링크를 참고한다. 

access.redhat.com/support/policy/updates/ansible-engine

 

Red Hat Ansible Engine Life Cycle - Red Hat Customer Portal

The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.

access.redhat.com

 

Ansible 설치하기

Ansible 설치 방식은 크게 3가지 Case가 있으며, 제어 노드에서만 설치하면 된다. 다른 관리 호스트에서는 특별히 할 것은 없으며, 몇가지 기본설정만 수행하면 된다. 그리고 제어노드는 Linux/Unix만 그 역할을 할 수 있다. (윈도우, 네트워크 장치 등은 불가) 또한 설치되는 Ansible은 x86_64가 아닌, noarch 이다.

 

* RHEL Subscription만 있는 경우

1. 서브스크립션 새로고침 : subscription-manager refresh
2. Ansible 서브스크립션  등록 : subscription-manager repos --enable rhel-7-server-ansible-2-rpms
3. 설치 진행 : yum install ansible

4. 설치 확인 : ansible --version

 

* Ansible Subscription이 있는 경우

1. 시스템을 서브스크립션등록 : subscription-manager register
2. 사용가능한 서브스크립션 확인 : subscription-manager list --availabie
3. 서브스크립션의 pool ID를 사용하여 pool을 시스템에 연결 : subscription-manager attach --pool=<engine-subscription-pool>
4. redhat ansible engine 리포지토리 활성 : subscription-manager repos --enable rhel-7-server-ansible-2-rpms

5. 엔진설치 : yum install ansible

6. 설치 확인 : ansible --version

 

* Subscription이 없는 경우 (CentOS)

1. epel-release 레포지토리 등록 (여기에 Ansible이 있음) : yum install epel-release
2. 설치 진행 : yum install ansible

3. 설치 확인 : ansible --version

 

일반적으로 개인사용자가 따로 서브스크립션을 구매하지는 않으므로, CentOS에서 설치하는것이 가장 간편하다. 굳이 RHEL로 해야 한다면, CentOS의 /etc/yum.repos.d/ 에 있는 모든 내용을 RHEL의 동일한 경로로 복사한 후 Subscription이 없는 경우와 동일하게 진행하면 된다.

 

위와 같은 방법으로 하면 아래 이미지처럼 알아서 dependency로 python을 설치하지만, 다른 방법으로 ansible을 수동설치 하는 경우, python 등도 따로 직접 설치해야 하므로 가능하면 위와 같은 정식 루트로 설치하는 것을 권고한다.

ansible을 설치하면 딸려 오는 dependency 패키지들

 

# 참고 : 관리 호스트에서 확인할 사항

Linux 기준으로 기본적으로 따로 뭔가를 할 것은 없지만, 제어 노드가 관리 호스트에 연결하는 방식과 실행할 모듈에 따라 관리 호스트에 몇가지 요구사항이 있을 수 있다. 또한 관리 호스트가 윈도우나 네트워크 장비인경우 추가적으로 다른 내용이 있을 수 있다. (이 글에서는 윈도우와 네트워크 장비는 배제하고 Linux 기준으로 설명한다)

 

1. 대부분의 모듈이 작동하기 위해 python 2.6, 3.5 이상이 설치되어야 한다. (yum install python, yum installl python3)

2. 관리 호스트에서 Selinux가 활성화 되어있는 경우 복사, 파일/템플릿 기능과 관련 있는 모듈은 selinux의 영향을 받기 때문에 관련 패키지를 설치해야 한다. (yum install libselinux-python)

3. 일부 모듈에는 고유의 추가사항이 있다. 예를들어 fedora 시스템에 패키지를 설치하는 데 사용하는 dnf 모듈은 python-dnf 패키지를 설치해야 한다. (yum install python-dnf)

4. Linux, Unix인 경우 SSH 기반으로 통신하므로 openssh 설치 및 사용할 수 있도록 설정이 되어 있어야 한다.

 

 

설치 관련 추가 상세사항은 다음 링크를 참고한다. 

 

access.redhat.com/articles/3174981 (권한 있는 계정 로그인 필요)

 

How do I Download and Install Red Hat Ansible Engine? - Red Hat Customer Portal

Available methods for downloading and installing Ansible Engine

access.redhat.com

centos의 최신버전은 다음 링크를 확인한다.

https://releases.ansible.com/ansible/

 

Index of /ansible

 

releases.ansible.com

 

'Ansible' 카테고리의 다른 글

6장. ansible에서 모듈 사용하기  (0) 2021.02.19
5장. ad-hoc 명령  (0) 2021.02.19
4장. ansible.cfg 파일 톺아보기  (0) 2021.02.06
3장. Inventory 파일  (2) 2021.02.06
1장. Ansible 소개  (0) 2021.02.06

Ansible이란 무엇인가?

Ansible은 파이썬 기반으로 작성되었으며, module과 명령어를 사용하여 여러 서버에 동시에 명령을 실행할 수 있는 자동화 엔진이다. 또한 ansible playbook 이라는 스크립트를 통해 IT 어플리케이션 인프라스트럭쳐를 정확하게 묘사할 수 있는 언어이다. Ansible의 주요 목적은 IT 장비를 관리를 자동화하는 것이다. 원래 무료 오픈소스 프로젝트였으나 레드햇이 인수하였다. 그래서 RHEL에서는 서브스크립션을 구매해야 사용할 수 있다. 하지만 커뮤니티 버전도 있기 때문에 무료로 사용할수도 있다. 그 둘의 차이는 크게 없으며 기술지원을 받을 수 있느냐의 차이가 크다.

 

 

Ansible Playbook이란?

Ansible play는 ansible을 사용한 한 줄의 명령이라고 볼 수 있다. 이러한 play를 모아서 스크립트화 한 것이 ansible playbook이다. 즉, 하나이상의 play를 포함하는 일련의 명령을 모은 스크립트 파일을 playbook 라고 부른다. 이러한 스크립트는 사람이 읽을 수 있는 형식으로 애플리케이션 환경의 모든 측면을 설명/기록 가능하다.

이 Aansible playbook은 Ansible의 문법으로 만들어지며, script form은 yaml을 사용한다. 따라서 읽기/쓰기가 쉽고 일반 텍스트이므로 소스코드처럼 취급하고 git등의 버전 제어 프로그램을 사용하여 관리할 수 있다.

 

 

Ansible 작동 목표와 원리

Ansible은 시스템을 원하는 상태로 표현하여 필요한 변경만 수행하여 시스템을 원하는 상태로 만드는 것이 Ansible의 목표이다. 각 task에서는 특정 항목이 "특정 상태"에 있는지 확인한다. 예를들어 그 상태라고 하는것은 예를들어 특정 파일이 있거나, 마운트가 되어있거나, 서비스가 중단되어 있는 등등 그냥 어떤 상태이다. ansible은 이렇게 상태를 확인한 후 시스템이 그 상태가 아니면, task에서 해당 상태로 만들도록 실행한다. 만약 시스템이 이미 해당 상태라면, 아무것도 수행하지 않는다. task가 실패하는 경우 default 설정으로, 실패가 발생한 호스트에 대한 나머지 플레이북은 중단된다.

 

 

Ansible의 강력한 기능

1. 간편함 – 추가 설치가 필요 없음

관리하려는 서버에 ansible용 agent등을 설치할 필요가 없다. Ansible은 openssh또는 winrm 등을 사용하여 관리할 서버에 ansible을 실행할 수 있다. 따라서 서버에 대한 뭔가 승인절차나 추가절차가 없다. 따라서 보안적으로도 취약점이 생길 가능성이 적다. 그리고 빠르게 바로 사용할 수 있고 매우 효율적이다.

 

2. 명령에 집중하지 않고 상태(결과)를 집중

Ansible은 어떤 결과를 얻기 위해서 “특정 명령을 실행해라” 라고 하는 것이 아닌, 특정 "상태"로 만들도록 한다. 시스템을 "특정 상태"로 만드므로, 자동화와 유지보수에 있어 더 명확하고 편리하다.

 

3. 다양한 플랫폼 지원

ansible은 물리,가상,클라우드,컨테이너 환경 모두를 지원하며, OS도 Linux, Unix, Windows 모두 지원한다. 또한 네트워크장치등 특정한 하드웨어도 지원한다.

 

4. 다른 시스템과 쉽게 통합할 수 있음

ansible은 사용자 환경에 있는 HP SA, Puppet, Jenkins, Redhat Satellite 등의 시스템을 활용하고 ansible 워크플로우로 통합할 수 있다. 즉 다른 3rd 프로그램과 호환이 되는 것이 많다. 물론 정확히 확인해보아야 할 것이다.

 

5. 보안기능

ansible은 리눅스의 SELINUX를 그대로 사용하며, playbook이나 비밀번호 파일들을 암호호화하는 ansible-vault 기능을 지원한다.

 

 

Ansible 의 사용 예시

구성 관리 집중화

구성파일 관리, 배포 중앙집중화, 애플리케이션 라이프사이클을 중앙에서 관리할 수 있다.

워크플로우 자동화

업무를 관리하고 사용하는데 있어 자동화할 수 있다.

네트워크 자동화

네트워크 설정 작업을 자동화할 수 있다.

애플리케이션 배포

제어 노드에서 하나의 명령으로 호스트 모두에게 한번에 프로그램이나 파일을 전달할 수 있다.

프로비저닝

PXE booting + kickstart + Ansible로 간단하게 대규모 OS설치, 환경구축 작업을 수행할 수 있다.

효과적인 협업 지원

한 코드를 여럿이서 작업하는 개발 등을 효과적으로 할 수 있게 할 수 있다.

애플리케이션
라이프사이클 관리

전체 에플리케이션 라이프사이클을 오케스트레이션할 수 있다.

 

 

Ansible architecture

API

특정 프로그램과 연결할 수 있는 인터페이스. Ansible 사이트에서 사용할 수 있는 목록들을 확인할 수 있다.

CMDB

상태를 저장하는 DB이다. 서버 목록, 서버 구성정보등의 상태를 저장한다. 인벤토리에서 관리대상을 체크하고 그 관리대상의 정보를 CMDB에 저장하고 활용한다.

제어 노드

(ansible automation engine)

ansible 엔진이 설치되고 명령/playbook을 실행하는 서버(또는 노트북, 데스크탑 등). 단순히 명령을 전달하고 관리만 하므로 고사양을 요구하지는 않는다.

관리 호스트

(hosts)

맨 오른쪽에 HOSTS(서버), NETWORKING(네트워크장비)를 의미한다. 제어 노드에 의해 관리되는 장비들이다. 정적/동적 인벤토리에 해당 리스트가 나열된다.

Plugins

ansible에 추가할 수 있는 코드나 기능이다. 기능확장이라고 생각하면 된다. 인벤토리 관련 플러그인, 접속 관련 플러그인 등 여러가지가 있다. 이런것들을 추가하여 ansible을 새로운 용도와 플랫폼에 맞게 조정할 수 있다.

Inventory

ansible에서는 inventory라고 하여, ansible에서 관리할 서버 리스트를 사용한다. 이러한 inventory는 2가지 방식으로 사용할 수 있다. 정적 인벤토리는 사용자가 직접 ansible로 관리할 서버 리스트를 작성하여 ansible을 사용하는 것이다. 동적 인벤토리는 ansible로 관리할 서버 리스트가 현재 서버 상태에 따라 자동으로 변경되는 방식 사용하는 것이다. 이것을 구현하려면 여러 개발언어를 사용해야 한다.

Modules

ansible playbook은 각각의 작업 단위를 task로 구분한다. 각 task는 특정 인수와 함께 module을 실행한다. module은 작은 코드를 가진 소형 프로그램이며, python, powershell 또는 기타 언어로 작성된다. 일반적으로 각 모듈들은 "명령어" 라고 생각하면 편하다. 이러한 모듈은 특정 명령, 소프트웨어 설치, API호출 등 여러가지 기능이 있다. ansible play를 실행하면 이러한 module을 push 하여 사용하고, push된 module은 ansible에서 작업이 완료되면 제거된다.

Ansible은 다양한 자동화 작업을 수행할 수 있는 수백개의 유용한 module을 함께 제공한다. module은 ansible이 official하게 만든것도 있고, 다른 3rd 업체에서 만든것들도 있다. 쉘 스크립트는 작업자가 직접 어떤 기능을 일일이 코딩해야 하지만, ansible은 그 기능을 가진 module을 사용하면 된다. 웬만한 대부분의 기능은 모두 module로 구현되어 있어서 일반적으로 사용자가 직접 모듈을 만들 필요는 없다. 물론 특정한 용도가 있고 필요사항이 있다면 직접 module을 만들 수도 있다.

 

'Ansible' 카테고리의 다른 글

6장. ansible에서 모듈 사용하기  (0) 2021.02.19
5장. ad-hoc 명령  (0) 2021.02.19
4장. ansible.cfg 파일 톺아보기  (0) 2021.02.06
3장. Inventory 파일  (2) 2021.02.06
2장. Ansible 설치하기  (0) 2021.02.06

시스템 엔지니어로서, 오픈소스의 시대가 도래하고 있고 "결국은 개발을 배워야 한다" 라는 생각을 가지고 있었는데, 기억은 잘 안나지만 페북 광고인가... 인터넷 광고인가 아무튼 스파르타 코딩클럽이라는 광고를 접한 적이 있다. 이때만 해도 개발 공부를 위해 패xx캠xx 에서 파이썬 강의 결제를 언제 해야하나 라고 고민하고 있던 때였다. 그런데 아무래도 온라인 강의로 여러번 쓴잔을 마신 적이 있던 터라 (개발 강의를 끝까지 끝낸 적이 없음;;;) 오프라인으로 만나서 수업한다는 스파르타 코딩클럽의 방식이 매우 크게 다가왔다.

 

개발은 정말 영어와 같은 "언어" 이다. 자주 사용해야 발전한다. 이런 측면에서 온라인 강의는 과연 내가 "자주" 공부할 수 있게 만들 수 있을까?? 라는 의문을 갖고 있었기 때문에 스파르타코딩클럽은 좀 더 나에게 효과적이라고 생각했다. 또한 왕초보도 할 수 있다는 커리큘럼도 맘에 들었고. 그래서 일반 개발 강의와 비교했을 때 나름 거금을 투자할 수 있었다.

 

7월에 시작해서 벌써 9월, 생각보다 길었지만 또 어떻게 보면 금방 지나간 기간이기도 하다. 사실 1주차 수업을 끝낸 후, "이걸 8주동안 하면... 어우야.... 쉽지 않겠는데.." 라는 생각이 들었다. 초보자가 할 수 있지만, 도전적인 마인드가 필요한 강의였다. 즉 내가 하려는 의지에 따라 난이도를 쉽게도 할 수 있고, 어렵게도 할 수 있다. 이러한 유연함이 꽤 좋았던 것 같다.

 

아무튼 다 끝났다. 내가 작업했던 내용들을 아래에 대충 기록해본다.

 

 

프로젝트 녹화 영상

해당 서비스는 현재 public에 운영중이므로 링크로 대체한다.

everysp.shop:5696

 

 

 

취지/설명

인터넷에서는 여러 특가 정보가 시시각각으로 뜨게 된다. 이러한 특가들은 네이버 쇼핑 등에서 검색할 수 있는 최저가보다 더 저렴한 경우가 많다. 또한 지속적이지 않아 특정 기간동안에만 진행하거나, 직접 검색하지 않으면 찾기 어려운 경우 등이 있다.

 

우리나라의 몇몇 상위 커뮤니티에서는 이러한 정보들을 공유하는 게시판이 있는데, 커뮤니티가 많아 일일이 다 들어가서 확인하기가 어렵다. 또한 특가다 보니 금방 종료된다. 그래서 몇몇 커뮤니티를 골라 스크래핑을 통해 한번에 특가 정보를 볼 수 있도록 만들고 싶었다.

 

 

기술설명

* 사용한 기술

- 웹페이지 구현 : html, javascript, CSS

- 데이터 스크래핑 : python, selenium, bs4

- 데이터 저장 및 컨트롤 : mariadb (mysql의 오픈소스판) 및 SQL

- 서버(+API)구축 및 자동화 : AWS, python, flask, ubuntu, bash script

 

 

* 서비스 구조

 

* 로직

1. 데이터 스크래핑 : python 스크립트를 통해 각 커뮤니티의 특가 게시판에서 데이터를 스크래핑 수행

2. 데이터 저장 : mysql에 해당 데이터들을 저장.

3. 웹페이지 뼈대 출력 : python flask에서 웹서버를 올리고 뼈대를 출력

4. 웹페이지 내용 출력 : python flask에서 ajax통신을 사용하는 API를 구축하고, 해당 API에 맞게 DB에서 데이터를 가져옴.

5. 업데이트 : 서버에서는 1번 스크래핑을 20분 주기로 수행하여 20분마다 새로운 특가정보를 지속적으로 가져옴.

 

 

결국 극복하지 못한 점과 향후 진행 예정

 

* 스크래핑 주기와 서버

주기를 10분정도로 하고 싶었으나, 1년 무료로 제공되는 AWS의 가상머신으로는 부하 때문에 어려운 듯 하다. 한 2일 돌다가 뻗는다.  20분 주기로 계속 하다가, 계속 서버가 먹통이 되길래 결국 AWS가 아닌 GCP로 서버를 바꿨다. GCP는 신규가입시 30만원어치의 크레딧을 주므로 AWS보다 더 좋은 성능이지만 더 적은 기간동안 쓸 수 있다. 일단 쓰다가 이후에는 내 도커 컨테이너로 옮길 예정이다.

  

* 썸네일 마우스오버 출력

이미지를 그냥 출력하면 사이트의 레이아웃을 깰 수 있어, 각각 항목에 마우스를 올리면 이미지를 작게 띄울 수 있도록 했다. 제목이 아닌 밑에 빈공간에 커서를 대면 썸네일이 나온다. 이는 모바일에서도 썸네일을 볼 수 있게 하기 위함이다. 전체적인 레이아웃을 깔끔하게 하기 위해 넣은 기능인데, 사용자 경험적으로는 약간 애매하다. 불편할때도 있고... 조금 개선할 필요가 보인다.

 

* 방문자 분석

구글 애널리틱스를 사용하여 누적 방문자와 경향, 검색 유입 등을 분석

 

* https 보안

현재 해당 사이트는 http로만 서비스하며, 요즘같이 위험한 세상에 http 서비스는 신뢰가 매우 낮으므로, 향후 https로 전환할 예정

 

* 모바일 모드

뷰포트로 간단하게 모바일로 볼 수는 있게 해두었지만, 조금씩 사용에 불편함이 있어 전체적으로 html을 엎어서 변경할 필요가 있어 보임.

 

* 카테고리화

아무래도 특가 정보가 너무 많아 카테고리화를 시키면 좋겠는데 (예를들어 음식, 가전제품, 미용, 건강 등..), 이렇게 하려면 결국은 제목을 가지고 카테고리를 만들 수 있도록 해야한다. 간단한 방법은 수작업이고, 자동화 하려면 뭔가.. 딥러닝이나 빅데이터 분석? 같은 게 필요한 것으로 보인다. 근데 이것은 다른 내용들보다도 훨씬 어렵고, 심지어 가능할지도 모르겠다. 하지만 개인적으로 빅데이터와 딥러닝쪽도 향후 공부할 예정이 있으므로, 공부해보고 가능하다면 구현해보고 싶다.

 

 

마치며

이러한 개발과 서비스 구축에 대해 배우면서 시스템 엔지니어로서 몰랐던 새로운 시각을 갖게 되었다. 이러한 배움은 적어도 내가 온라인에서 그냥 녹화된 강의를 듣는 것으로는 얻을 수 없는 것이라고 생각한다. 또한, 개발자 라는 직업을 하지 않은 것에 대해.. 사실 다행이라고 생각하기도 한다. 너무 힘들어!!! 하지만 느껴보지 못한 새로운 성취감을 느낄 수 있었다. 또한 자신감도 가질 수 있었다.

 

마지막으로 제일 걱정되는 게 있다. 이렇게 공부해놓고 다 끝났으니 아무것도 안해~ 이래버리면... 분명 또 다 까먹을 것이다. 그게 언어니까. 결국 조금씩이라도 지속적으로 해야 한다는 거다. 연말에 여유 될 때 또 새로운 프로젝트를 시작해보는 것도 좋을 것 같다. 아마 간단하게는 IOT쪽, 좀 심도있게 하려면 딥러닝이나 빅데이터쪽을 시도해볼 수 있으면 좋겠다.

 

생각해보니 그렇다. 결국, 한번 발을 들여놓았으면 계속 해야 까먹지 않고 계속 써먹을 수 있다는 것..ㅜㅜ 개발이란 참 어려운 길이다.

 

 

 

이제 서버 작업을 해야 한다.

서버는 총 3대를 사용했다. AWS의 무료서버는 정말 성능이 낮아서, 스크래핑도 제대로 버티지 못한다 ㅠ

그래서 GCP에서 무료 크레딧으로 쓸 수 있는 그래도 2코어 4GB는 되는 서버를 사용했다.

 

서버 구조

 

- AWS 서버 : WEB 서버 (FLASK)

- GCP 서버 : 스크래핑 스크립트를 주기적으로 수행 (20분마다)

- 나스 도커 컨테이너 : mariadb

 

 

서버 설치 작업 (우분투 기준)

 

1. 파이썬 설치, pip 패키지 설치

 

# 파이썬 설치 : python 이라는 명령어로 3 버전 이상을 실행하도록 하는 명령어입니다.

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

 

# pip3 설치

sudo apt-get update

sudo apt-get install -y python3-pip

sudo apt-get install python-pip

 

# 버전 확인

pip3 --version

 

# pip3 대신 pip 라고 입력하기 위한 명령어

# 아래 명령어를 입력하면 pip 라고 쳐도 pip3를 작동시킬 수 있습니다.

sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1

 

 

2. 파이썬 패키지 설치

pip install selenium

pip install bs4

pip install re

pip install pymysql

pip install opengrapher

pip install datetime

pip install lxml

 

 

3. 크롬설치 (https://webnautes.tistory.com/1184 참고)

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

sudo apt-get updatet

sudo apt-get install goole-chrome-stable

 

 

4. 서버 시간 변경 (KST로 변경)

sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

 

5. 포트포워딩 (접속시 :5000을 해줘야 하는데, 아예 안하도록 함)

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000

 

 

6. 크롬 드라이버 다운로드

- 검색해..ㅜㅜ

 

 

7. PYTHON 데이터 배치

- 웹페이지 : app.py

- 스크래핑 : SSP_main.py

 

 

8. 백그라운드에서 app.py 실행

nohup python app.py &

 

 

9. crontab으로 주기적으로 스크래핑 실행

00,20,40 * * * * python /home/ubuntu/uk_work/SSP/SSP_main.py

18,38,58 * * * * pkill chrome

시스템 엔지니어로서, 오픈소스의 시대가 도래하고 있고 "결국은 개발을 배워야 한다" 라는 생각을 가지고 있었는데, 기억은 잘 안나지만 페북 광고인가... 인터넷 광고인가 아무튼 스파르타 코딩클럽이라는 광고를 접한 적이 있다. 이때만 해도 개발 공부를 위해 패xx캠xx 에서 파이썬 강의 결제를 언제 해야하나 라고 고민하고 있던 때였다. 그런데 아무래도 온라인 강의로 여러번 쓴잔을 마신 적이 있던 터라 (개발 강의를 끝까지 끝낸 적이 없음;;;) 오프라인으로 만나서 수업한다는 스파르타 코딩클럽의 방식이 매우 크게 다가왔다.

 

개발은 정말 영어와 같은 "언어" 이다. 자주 사용해야 발전한다. 이런 측면에서 온라인 강의는 과연 내가 "자주" 공부할 수 있게 만들 수 있을까?? 라는 의문을 갖고 있었기 때문에 스파르타코딩클럽은 좀 더 나에게 효과적이라고 생각했다. 또한 왕초보도 할 수 있다는 커리큘럼도 맘에 들었고. 그래서 일반 개발 강의와 비교했을 때 나름 거금을 투자할 수 있었다.

 

7월에 시작해서 벌써 9월, 생각보다 길었지만 또 어떻게 보면 금방 지나간 기간이기도 하다. 사실 1주차 수업을 끝낸 후, "이걸 8주동안 하면... 어우야.... 쉽지 않겠는데.." 라는 생각이 들었다. 초보자가 할 수 있지만, 도전적인 마인드가 필요한 강의였다. 즉 내가 하려는 의지에 따라 난이도를 쉽게도 할 수 있고, 어렵게도 할 수 있다. 이러한 유연함이 꽤 좋았던 것 같다.

 

아무튼 다 끝났다. 내가 작업했던 내용들을 아래에 대충 기록해본다.

 

 

프로젝트 녹화 영상

해당 서비스는 현재 public에 운영중이므로 링크로 대체한다.

everysp.shop

 

 

 

 

취지/설명

인터넷에서는 여러 특가 정보가 시시각각으로 뜨게 된다. 이러한 특가들은 네이버 쇼핑 등에서 검색할 수 있는 최저가보다 더 저렴한 경우가 많다. 또한 지속적이지 않아 특정 기간동안에만 진행하거나, 직접 검색하지 않으면 찾기 어려운 경우 등이 있다.

 

우리나라의 몇몇 상위 커뮤니티에서는 이러한 정보들을 공유하는 게시판이 있는데, 커뮤니티가 많아 일일이 다 들어가서 확인하기가 어렵다. 또한 특가다 보니 금방 종료된다. 그래서 몇몇 커뮤니티를 골라 스크래핑을 통해 한번에 특가 정보를 볼 수 있도록 만들고 싶었다.

 

 

기술설명

* 사용한 기술

- 웹페이지 구현 : html, javascript, CSS

- 데이터 스크래핑 : python, selenium, bs4

- 데이터 저장 및 컨트롤 : mariadb (mysql의 오픈소스판) 및 SQL

- 서버(+API)구축 및 자동화 : AWS, python, flask, ubuntu, bash script

 

 

* 서비스 구조

 

* 로직

1. 데이터 스크래핑 : python 스크립트를 통해 각 커뮤니티의 특가 게시판에서 데이터를 스크래핑 수행

2. 데이터 저장 : mysql에 해당 데이터들을 저장.

3. 웹페이지 뼈대 출력 : python flask에서 웹서버를 올리고 뼈대를 출력

4. 웹페이지 내용 출력 : python flask에서 ajax통신을 사용하는 API를 구축하고, 해당 API에 맞게 DB에서 데이터를 가져옴.

5. 업데이트 : 서버에서는 1번 스크래핑을 20분 주기로 수행하여 20분마다 새로운 특가정보를 지속적으로 가져옴.

 

 

결국 극복하지 못한 점과 향후 진행 예정

 

* 스크래핑 주기

주기를 10분정도로 하고 싶었으나, 1년 무료로 제공되는 AWS의 가상머신으로는 부하 때문에 어려운 듯 하다. 한 2일 돌다가 뻗는다. 20분도 어떻게 될 지는 모르겠지만, 20분도 안된다면 개인 docker 서버에 컨테이너 형태로 다시 올려야 할 듯 하다.

  

* 썸네일 마우스오버 출력

이미지를 그냥 출력하면 사이트의 레이아웃을 깰 수 있어, 각각 항목에 마우스를 올리면 이미지를 작게 띄울 수 있도록 함.

 

* 방문자 분석

구글 애널리틱스를 사용하여 누적 방문자와 경향, 검색 유입 등을 분석

 

* https 보안

현재 해당 사이트는 http로만 서비스하며, 요즘같이 위험한 세상에 http 서비스는 신뢰가 매우 낮으므로, 향후 https로 전환할 예정

 

* 모바일 모드

뷰포트로 간단하게 모바일로 볼 수는 있게 해두었지만, 조금씩 사용에 불편함이 있어 전체적으로 html을 엎어서 변경할 필요가 있어 보임.

 

* 카테고리화

아무래도 특가 정보가 너무 많아 카테고리화를 시키면 좋겠는데 (예를들어 음식, 가전제품, 미용, 건강 등..), 이렇게 하려면 결국은 제목을 가지고 카테고리를 만들 수 있도록 해야한다. 간단한 방법은 수작업이고, 자동화 하려면 뭔가.. 딥러닝이나 빅데이터 분석? 같은 게 필요한 것으로 보인다. 근데 이것은 다른 내용들보다도 훨씬 어렵고, 심지어 가능할지도 모르겠다. 하지만 개인적으로 빅데이터와 딥러닝쪽도 향후 공부할 예정이 있으므로, 공부해보고 가능하다면 구현해보고 싶다.

 

 

마치며

이러한 개발과 서비스 구축에 대해 배우면서 시스템 엔지니어로서 몰랐던 새로운 시각을 갖게 되었다. 이러한 배움은 적어도 내가 온라인에서 그냥 녹화된 강의를 듣는 것으로는 얻을 수 없는 것이라고 생각한다. 또한, 개발자 라는 직업을 하지 않은 것에 대해.. 사실 다행이라고 생각하기도 한다. 너무 힘들어!!! 하지만 느껴보지 못한 새로운 성취감을 느낄 수 있었다. 또한 자신감도 가질 수 있었다.

 

마지막으로 제일 걱정되는 게 있다. 이렇게 공부해놓고 다 끝났으니 아무것도 안해~ 이래버리면... 분명 또 다 까먹을 것이다. 그게 언어니까. 결국 조금씩이라도 지속적으로 해야 한다는 거다. 연말에 여유 될 때 또 새로운 프로젝트를 시작해보는 것도 좋을 것 같다.

 

아.. 잘 진행하다가, 아주 난감한 결함을 발견했다. 한번 테스트 해볼려고 AWS에 올린 리눅스 서버에서 스크래핑을 하는데, 거의 10분 가까이 걸리는 것이다. 겁나 느리다. 이 때 아차 싶던게.. 스크래핑 하고 있을 때 데이터 수집하고 삭제하고 난리인데 실제 사이트에서 10분동안 그런게 보인다는 것이다.;;;;;; 아....이런...

 

어떻게 할까 머리를 쥐어짜다가, 이거 꽤.. 괜찮은데? 라는 아이디어가 생겼다.

 

어차피 여기 데이터베이스는 300~400건도 안되고, 계속 삭제되니 중요한 데이터도 아니다. 그러니까, 동일한 DB를 두개 만들고, 하나는 스크래핑용, 하나는 실제로 HTML에서 출력하는 용으로 사용하는 것이다.

 

그리고, 스크래핑이 완료되면 스크래핑이 완료된 DB를 HTML에서 출력하는 용도의 DB로 이름을 바꿔버리는 것이다... ㅋㅋㅋㅋㅋㅋ..ㅋㅋㅋㅋ

 

 

정리해보자.

 

- 동일한 형태의 데이터베이스를 총 2개 만든다. 그 이유는, 스크래핑 돌리는 동안, 서버에 붙으면 데이터가 이상하다. 스크래핑 도중이라서 그렇고, 스크래핑이 오래 걸린다.

- 즉 사용중인 데이터베이스는 그대로 두고, 스크래핑시 데이터 저장하는 데이터베이스를 따로 만들어 두고 이름을 서로 바꾸는 방식으로 한다.

- 데이터를 복사하지 않고 이름을 바꾸는 이유는 복사보다 이름 변경이 훨씬! 빠르기 때문이다. 사용자가 중간에 이상한 데이터를 볼 가능성을 최대한 낮추기 위함이다.

- 즉 이름을 서로 바꾸므로 총 2개의 테이블이 있어야 한다. 이름은 다음과 같다.
product_data : 메인 테이블  /  bg_product_data : 스크래핑용 테이블

 

 

전체적인 순서는 다음과 같다.

 

1. bg_product_data 에서 크롤링 완료 (유저가 접속하는것은 실제로 product_data 이다.)
2. product_data를 dummy_product_data로 이름변경 
3. bg_product_data를 product_data로 이름변경 (product_data에는 최신 데이터가 있다.)
4. dummy_product_data를 bg_product_data로 이름변경 (이전 데이터가 있는 dummy가 bg로 변경된다. 어차피 또 스크래핑 하면, 데이터는 싹 다 날라간다.)

---이하 반복---

 

 

구문은 다음과 같다.

conn = pymysql.connect(host="XXXXXXXXXXX", port=XXXXX, user="root", password="root", db="XXXXXe", charset="utf8")
curs = conn.cursor()

originalToDummy = "ALTER TABLE product_data RENAME dummy_product_data;"
bgToOriginal = "ALTER TABLE bg_product_data RENAME product_data;"
dummyToBg = "ALTER TABLE dummy_product_data RENAME bg_product_data;"

curs.execute(originalToDummy)
curs.execute(bgToOriginal)
curs.execute(dummyToBg)

conn.commit()
conn.close()

 

이제 스크래핑을 돌리고, 내 사이트에서 F5를 계속 치면서 보고 있었는데, 스크래핑 끝나자마자 값이 딱 바뀌고 전혀 문제가 없었다. 

 

개발이라는 것은 참... 진짜 어떻게는 꾸역꾸역 해 내는게 참 신기하기도 하고 재밌기도 하다. 근데 더 이상 이런 결함은 없었으면..ㅜㅜ

+ Recent posts