/images/profile.png

Github์˜ WebHook์„ ์ด์šฉํ•˜์—ฌ ์ž๋™ Jenkins Job ์‹คํ–‰

PullRequest๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›๊ณ ์‹ถ๋‹ค๊ฑฐ๋‚˜, ๋‚ด๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆด๋•Œ๋งˆ๋‹ค ๋˜๋Š” ์ด์Šˆ๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ๋งˆ๋‹ค ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๊ฑฐ๋‚˜. ์ข…ํ•ฉํ•ด๋ณด๋ฉด Github์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ์–ด๋–ค ๋™์ž‘์„ ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ Github์—์„œ ์ œ๊ณตํ•˜๋Š” Webhook ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„ ๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ์ด์ง€๋งŒ ์–ธ๊ธ‰ํ•˜๊ณ  ๋„˜์–ด๊ฐˆ๊ป˜ ์žˆ๋‹ค๋ฉด, Github์—์„œ Jenkins Job์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Jenkins๊ฐ€ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. (๋‚ด๋ถ€์‚ฌ์„ค๋ง์ด๋‚˜ private ํ•œ ์„ค์ •์ด ๋˜์–ด์žˆ๋‹ค๋ฉด ํ˜ธ์ถœ์ด ์•ˆ๋˜์–ด Webhook๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.)

Jenkins Security ์„ค์ •

Jenkins Job์„ ์™ธ๋ถ€์—์„œ URL๋กœ ์‹คํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์„ค์ •์ด ๊ผญ ํ•„์š”ํ•˜๋‹ค. (์ด ์„ค์ •์„ ๋ชฐ๋ผ์„œ ์ˆ˜๋งŽ์€ ์‚ฝ์งˆ์„ ํ–ˆ๋‹ค.) CSRF Protection ์„ค์ • ์ฒดํฌ๋ฅผ ํ’€์–ด์ค˜์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€์—์„œ Job์— ๋Œ€ํ•œ ํŠธ๋ฆฌ๊ฑฐ๋ง์ด ๊ฐ€๋Šฅํ•ด ์ง„๋‹ค.

/images/github-web-hook-jenkins-job-excute/jenkins_config.png
Jenkins > Configure Global Security

Jenkins Job ์„ค์ •

Github ์—์„œ Webhook์— ์˜ํ•ด Jenkins Job์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ ํ…๋ฐ, ๊ทธ๋•Œ ์ •๋ณด๋“ค์ด payload๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ POST ํ˜•์‹์œผ๋กœ ํ˜ธ์ถœ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ Job์—์„œ ๋ฐ›๋Š” ์ค€๋น„(?)๋ฅผ ํ•ด๋‘ฌ์•ผ ํ•œ๋‹ค. ์„ค์ •์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Job ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

/images/github-web-hook-jenkins-job-excute/jenkins_job_param.png
Jenkins > ํ•ด๋‹น Job > configure

Github Webhook ์„ค์ •

์ด์ œ Github Repository ์˜ Hook ์„ค์ •๋งŒ ํ•˜๋ฉด ๋์ด๋‚œ๋‹ค. ํ•ด๋‹น Repository > Settings > Hooks ์„ค์ •์— ๋“ค์–ด๊ฐ€์„œ Add webhook์„ ์„ ํƒํ•˜์—ฌ Webhook์„ ๋“ฑ๋กํ•ด์ค€๋‹ค. URL์€ {jenkins URL}/jenkins/job/{job name}/buildWithParameters์‹์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ  Content Type ์€ application/x-www-form-urlencoded์œผ๋กœ ์„ ํƒํ•œ๋‹ค. ์–ธ์ œ Webhook์„ ํŠธ๋ฆฌ๊ฑฐ๋ง ์‹œํ‚ฌ๊บผ๋ƒ๋Š” ์˜ต์…˜์—์„œ๋Š” ์›ํ•˜๋Š” ์„ค์ •์— ๋งž์ถ”๋ฉด ๋˜๊ฒ ์ง€๋งŒ ๋‚˜๋Š” pullRequest๊ฐ€ ๋“ฑ๋ก ๋ ๋•Œ๋งŒ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ Jenkins Job์„ ์‹คํ–‰์‹œํ‚ฌ ๊ณ„ํš์ด์˜€์œผ๋‹ˆ Let me select individual events.์„ ์„ค์ •ํ•˜๊ณ  Pull Request์— ์ฒดํฌ๋ฅผ ํ•ด์ค€๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

/images/github-web-hook-jenkins-job-excute/oss_webhook.png
ํ•ด๋‹น Repositroy > Settings > Hooks

์ด๋ ‡๊ฒŒ ๋“ฑ๋กํ•˜๊ณ  ๋‹ค์‹œ ๋“ค์–ด๊ฐ€์„œ ๋งจ ์•„๋žซ ๋ถ€๋ถ„Recent Deliveries์„ ๋ณด๋ฉด ping test ๊ฐ€ ์ด๋ฃจ์–ด์ ธ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต์„ ๋ฐ›์€๊ฒƒ์„ ํ™•์ธํ• ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

/images/github-web-hook-jenkins-job-excute/oss_webhook_result.png
Webhook ๋“ฑ๋ก ๊ฒฐ๊ณผ

์ด๋ ‡๊ฒŒ ์„ค์ •์„ ๋‹ค ํ•œ ๋’ค PullRequest๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด Jenkins ํ•ด๋‹น Job์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉฐ ์‹คํ–‰์ด ๋œ๊ฒƒ์„ ํ™•์ธํ• ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

/images/github-web-hook-jenkins-job-excute/jenkins_webhook_result.png
Jenkins Job ์‹คํ–‰ ๊ฒฐ๊ณผ

๋~

Github๊ณผ Jenkins ์—ฐ๋™ํ•˜๊ธฐ

Jenkins์—์„œ Github์˜ ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋นŒ๋“œ๋ฅผ ํ•˜๋Š” ๋“ฑ Github๊ณผ Jenkins์™€ ์—ฐ๋™์„ ์‹œ์ผœ์ค˜์•ผํ•˜๋Š” ์ƒํ™ฉ์—์„œ, ๋ณ„๋„์˜ ์„ ํ–‰ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์„์ˆ˜ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” SSH๋กœ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

์šฐ์„  Jenkins๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ๋Š” ์„œ๋ฒ„์—์„œ ์ธ์ฆํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์ž.

$ ssh-keygen -t rsa -f id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
SHA256:~~~~~ ~~~@~~~~~
The key's randomart image is:
+---[RSA 2048]----+
|     o*+**=*=**+ |
|     o B=o+o++o  |
|     E+.o+ + oo .|
|      oo. * o ...|
|     .+ S  =   o |
|     . +    o .  |
|      . .  .     |
|       .         |
|                 |
+----[SHA256]-----+

$ ls
id_rsa  id_rsa.pub

๊ฐœ์ธํ‚ค(id_rsa)๋Š” ์  ํ‚จ์Šค์— ์„ค์ •ํ•ด์ค€๋‹ค. (์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ณต์‚ฌ, ์ฒซ์ค„ ๋งˆ์ง€๋ง‰์ค„ ๋นผ๋ฉด ์•ˆ๋œ๋‹ค… )

/images/github-with-jenkins/ssh_jenkins.png
์  ํ‚จ์Šค์— SSH ๊ฐœ์ธํ‚ค ์„ค์ •

๊ทธ ๋‹ค์Œ ๊ณต๊ฐœํ‚ค(id_rsa.pub)๋Š” Github์— ์„ค์ •์„ ํ•ด์ค€๋‹ค.

/images/github-with-jenkins/ssh_github.png
Github์— SSH ๊ณต๊ฐœํ‚ค ์„ค์ •

์ด๋ ‡๊ฒŒ ํ•œ๋’ค Jenkins ์—์„œ ์ž„์˜๋กœ job์„ ์ƒ์„ฑํ•˜๊ณ  job ์„ค์ • > ์†Œ์Šค์ฝ”๋“œ ๊ด€๋ฆฌ ์—์„œ git ๋ถ€๋ถ„์— ์•„๋ž˜์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๋™์ด ๋œ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค. Credentials ๊ฐ’์„ ์œ„์—์„œ ์„ค์ •ํ•œ ๊ฐœ์ธํ‚ค๋กœ ์„ค์ •ํ•˜๊ณ , repo ์ฃผ์†Œ๋ฅผ SSH์šฉ์œผ๋กœ ์ ์—ˆ์„๋•Œ ์—๋Ÿฌ๊ฐ€ ์•ˆ๋‚˜์˜ค๋ฉด ์„ฑ๊ณตํ•œ๊ฒƒ์ด๋‹ค.

/images/github-with-jenkins/ssh_complete.png
์ •์ƒ ์—ฐ๊ฒฐ๋˜๋ฉด Jenkins ์˜ค๋ฅ˜๋„ ์—†๊ณ , github SSH ํ‚ค์— ๋…น์ƒ‰๋ถˆ์ด ๋“ค์–ด์˜จ๋‹ค.

๋~

linux(centOS)์—์„œ selenium ์„ค์ •ํ•˜๊ธฐ (feat. python)

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ์•ˆ๋˜๋Š” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋‹จ ์‚ฌ์šฉ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด ํ™”๋ฉด์ด ๋œจ๊ณ , ์–ด๋–ค ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ํ•˜๋Š” ์ผ๋ จ์˜ Regression Test. ์ด๋•Œ ํ™œ์šฉํ• ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋ฒˆ์—” selenium ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ์‚ฌ์‹ค web application ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ ค๊ณ  selenium ๋ฅผ ์•Œ์•„๋ณด๊ฒŒ ๋œ๊ฑด ์•„๋‹ˆ๊ณ , ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋Š” ํŠน์ • ๋ฐด๋“œ(๋„ค์ด๋ฒ„ BAND)์—์„œ ์ผ์ฃผ์ผ์— ํ•œ๋ฒˆ์”ฉ ๋™์ผํ•œ ํ˜•ํƒœ์˜ ๊ธ€์„ ์˜ฌ๋ฆฌ๊ณ  ์žˆ๋Š”๋ฐ (์ผ์ข…์˜ ํ•œ์ฃผ ์ถœ์„์ฒดํฌ ๊ฐ™์€…) ์ด๋ฅผ ์ž๋™ํ™” ํ•ด๋ณผ์ˆœ ์—†์„๊นŒ ํ•˜๋ฉฐ ๋ฐด๋“œ API๋ฅผ ์ฐพ์•„๋ณด๋‹ค selenium ๋ผ๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ์–ด๋–ค๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ณ  ๊ทธ๋‹ค์Œ ์–ด๋–ค๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ณ  ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๊ฐ๋™์„ ๋ฐ›์•„(?) + ๋ณ„๋„์˜ API๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์ง€ ์•Š์•„๋„ ๋˜์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. (๋ฌผ๋ก  UI๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ณจ์น˜์•„ํ”„๊ฒ ์ง€๋งŒ…)

์—ฌ๊ธฐ์„œ๋Š” selenium ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (์ธํ„ฐ๋„ท์— ๋‚˜๋ณด๋‹ค ์ •๋ฆฌ ์ž˜๋œ๊ธ€์ด ๋งŽ์œผ๋‹ˆ…) ๋‹จ, linux ํ™˜๊ฒฝ์—์„œ ์…‹ํŒ…ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋„ˆ๋ฌด ์—†๊ณ  ๋ช‡์ผ๋™์•ˆ ์‚ฝ์งˆ์„ ํ•œ๊ฒŒ ์•„์‰ฌ์›Œ์„œ ๊ทธ ๊ณผ์ •์„ ํฌ์ŠคํŒ… ํ•ด๋ณธ๋‹ค. (๋‚˜๊ฐ™์€ ๋ถ„์ด ์ด ๊ธ€์„ ๋ณด๊ณ  ๋„์›€์ด ๋˜์‹ค๊บผ๋ผ๋Š” ๊ธฐ๋Œ€๋ฅผ ๊ฐ–์œผ๋ฉฐ…)

โ€ป ์ฃผ์˜ : ๋ณธ ํฌ์ŠคํŒ…์€ ๋ฐด๋“œ ์„œ๋น„์Šค์— ๊ธ€์„ ์˜ฌ๋ฆด์ˆ˜ ์žˆ๋Š” ๋น„ ์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์˜ ๊ณต์œ ๊ฐ€ ์•„๋‹Œ, selenium์— ๋Œ€ํ•œ ์‚ฌ์šฉ ํ›„๊ธฐ(?)์— ๋Œ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. (์ฐธ๊ณ ๋กœ ๋ง‰ํ˜”์–ด์š” -ใ…-)

์„ค์ •ํ•˜๊ธฐ

์„œ๋ฒ„ ํ™˜๊ฒฝ์€ CentOS 7.4 64Bit + Python 3.6.3 + jdk 8 ์ด๋‹ค. ์šฐ์„  selenium ์„ ์„ค์น˜ํ•ด์ค€๋‹ค.

$ sudo python3.6 -m pip install selenium

๊ทธ ๋‹ค์Œ CentOS์—์„œ ํฌ๋กฌ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ yum ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (๊ผญ ํฌ๋กฌ์ด ์•„๋‹ˆ๋”๋ผ๋„ ํŒŒ์ด์–ดํญ์Šค๋‚˜ ์ง€๊ธˆ์€ ์ง€์›์ด ๋Š๊ธด ํŒฌํ…€JS ๊ฐ™์€๊ฒƒ์œผ๋กœ ํ™œ์šฉํ• ์ˆ˜๋„ ์žˆ์œผ๋‚˜ ๋‹ค๋ฅธ๊ฒƒ๋“ค๋„ ํ•ด๋ดค๋Š”๋ฐ ์ž๊พธ ์„ค์ •์—์„œ ๊ฑธ๋ ค์„œ ํฌ๋กฌ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ… ํ•œ๋‹ค.)

$ sudo vi /etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

๊ทธ๋ฆฌ๊ณ ๋Š” yum ์œผ๋กœ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์„ค์น˜ํ•œ๋‹ค. (๋‚ด๊ฐ€ ์„ค์น˜ํ–ˆ์„๋•Œ์˜ ๋ฒ„์ „์€ google-chrome-stable.x86_64 0:64.0.3282.119-1)

$ yum install google-chrome-stable

ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค. ๋‹ค์Œ url์—์„œ ๋ฐ›์„์ˆ˜ ์žˆ๋Š”๋ฐ https://sites.google.com/a/chromium.org/chromedriver/downloads ๋‚˜๋Š” 2.35 linux64 ๋ฒ„์ „์„ ๋ฐ›์•˜๋‹ค. ๋‹ค์šด๋ฐ›๊ณ  unzip ํ•˜๋ฉด ๋”ฑํ•˜๋‚˜ ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ๋‚˜์ค‘์— selenium ์„ ์‚ฌ์šฉํ• ๋•Œ ์ด์šฉ๋˜๋‹ˆ path๋ฅผ ์•Œ์•„๋‘์ž.

๊ทธ๋‹ค์Œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๋‚ด๊ฐ€ ์ง  ํŒŒ์ด์ฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.

  • ๋ฐด๋“œ ์ ‘์† ( https://band.us/home )
  • ๋กœ๊ทธ์ธ
  • ํŠน์ • ๋ฐด๋“œ ์„ ํƒ
  • ๊ธ€์“ฐ๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ณ  ์–‘์‹์— ๋งž์ถฐ ๊ธ€ ์ž‘์„ฑ
  • ๊ธ€ ๋“ฑ๋ก

ํŒŒ์ด์ฌ ์ฝ”๋“œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜์˜€๋‹ค. (์ค‘์š”๋ถ€๋ถ„๋งŒ.. ๊ทธ ์•„๋ž˜๋Š” ์ž์œ )

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# ์ดˆ๊ธฐํ™” --------------------------------------------
chrome_options = Options()
chrome_options.add_argument("--headless")

driver  = webdriver.Chrome(executable_path='home/~~~/chromedriver', chrome_options=chrome_options)
driver.implicitly_wait(3)
driver.get('https://band.us/home')

# ๋กœ๊ทธ์ธ --------------------------------------------
driver.find_element_by_class_name('_loginLink').click()
...์ƒ๋žต

๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰์„ ํ•ด๋ณด๋ฉด ์ž‘๋™์ด ์ž˜~ ๋œ๋‹ค.

/images/linux-selenium/result.png
selenium + python ์œผ๋กœ ์ž๋™์ž‘์„ฑ๋œ ๋ฐด๋“œ ๊ธ€

๋งˆ์น˜๋ฉฐ

selenium ์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๋ฉด ๊ฑฐ์˜ ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ€๋Š”๊ฒƒ๋“ค์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์ด ๋งŽ์•˜๋‹ค. ๋‚œ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์Šค์ผ€์ฅด๋Ÿฌ(์  ํ‚จ์Šค ๊ฐ™์€)๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ํ™”๋ฉด์—†์ด ์ž‘๋™์‹œํ‚ค๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์•„๋ฌด๋ฆฌ ์ฐพ์•„๋ด๋„ + ์‚ฝ์งˆํ•ด๋„ ์ž˜ ์•ˆ๋˜์—ˆ๋‹ค. ๊ฒฐ๊ตญ ์‚ฌ๋‚ด์—๋„ ๋‚˜๊ฐ™์€ ์‚ฝ์งˆ์„ ํ•˜์‹  ๋ถ„์„ ์ฐพ๊ณ  ๋ฌป๊ณ  ๋ฌผ์–ด ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„๋งŒ ์žˆ์–ด์•ผ ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํฌ๋กฌ์•ฑ๋˜ํ•œ ์žˆ์–ด์•ผ ๋™์ž‘์„ ํ•œ๋‹ค๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์—ญ์‹œ, ๋‚ด๊ฐ€ ํ•œ ์‚ฝ์งˆ์€ ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ํ•œ ์‚ฝ์งˆ์ด๋ผ๋Š”๊ฑธ ๋‹ค์‹œํ•œ๋ฒˆ ๊นจ๋‹ณ์€ ์ข‹์€(?) ์‹œ๊ฐ„์ด์˜€๋‹ค.

์ด๊ฑธ๋กœ ๋‚˜์ค‘์— ๋‚ด๊ฐ€ ๋งก๊ณ ์žˆ๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์›น ์ž๋™ ํ…Œ์ŠคํŠธ ํˆด๋„ ๋งŒ๋“ค์–ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค.

์•„ํŒŒ์น˜ ์—‘์„ธ์Šค ๋กœ๊ทธ๋ฅผ ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์— ์ธ๋ฑ์‹ฑ ํ•ด๋ณด์ž.

apache access log ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด ์ƒ๊ฒผ๋‹ค. ์•„๋‹ˆ ๊ทธ๋ณด๋‹ค apache access์— ๋Œ€ํ•ด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด๊ณ ์‹ถ์—ˆ๊ณ , log๋ฅผ ๊ฒ€์ƒ‰ & ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ์œ ์˜๋ฏธํ•œ ๋ถ„์„๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๊ทธ์— ์ƒ๊ฐํ•œ๊ฒƒ์ด (์—ญ์‹œ) ElasticStack.

์ฒ˜์Œ์— ์ƒ๊ฐํ•œ ๋ฐฉ์•ˆ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ–ˆ๋‹ค.

/images/apache-access-log-to-es/model_1.png
์ฒ˜์Œ ์ƒ๊ฐํ•œ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ

ํ•˜์ง€๋งŒ, ๋‚ด ๋‹จ์ˆœํ•œ(?) ์˜ˆ์ƒ์€ ์—ญ์‹œ ๋น—๋‚˜๊ฐ”๊ณ  logstash์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋‚ด๋ฑ‰์—ˆ๋‹ค.

retrying individual bulk actions that failed or were rejected by the previous bulk request

request๊ฐ€ ๋งŽ์•„์ง์— ๋”ฐ๋ผ elasticsearch๊ฐ€ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋”๋‹ˆ logstash์—์„œ ๋Œ€๋Ÿ‰์ž‘์—…์€ ๊ฑฐ๋ถ€ํ•˜๊ฒ ๋‹ค๋ฉฐ ์ธ๋ฑ์‹ฑ์„ ๋ฉˆ์ท„๋‹ค. ๊ณ ๋ฏผ๊ณ ๋ฏผํ•˜๋‹ค elasticsearch์— ์ธ๋ฑ์‹ฑํ• ๋•Œ ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ƒํ™ฉ์—์„œ ์ค‘๊ฐ„์— ๋ฒ„ํผ๋ฅผ ๋‘” ๊ฒฝํ—˜์ด ์žˆ์–ด์„œ facebook๊ทธ๋ฃน์— ๋ฌธ์˜๋ฅผ ํ•ด๋ดค๋‹ค. https://www.facebook.com/groups/elasticsearch.kr/?multi_permalinks=1566735266745641 ์—ญ์‹œ ๋‚˜๋ณด๋‹ค ํ•œ์ฐธ์„ ์•ž์„œ๊ฐ€์‹œ๋Š” ๋ถ„๋“ค์€ ์ด๋ฏธ ์—๋Ÿฌ๊ฐ€ ๋ญ”์ง€ ์•Œ๊ณ  ์žˆ์œผ์…จ๊ณ , ์ค‘๊ฐ„์— ๋ฒ„ํผ๋ฅผ ๋‘๊ณ  ํ•˜๋‹ˆ ์ž˜๋œ๋‹ค๋Š” ์˜๊ฒฌ์ด ์žˆ์–ด ๋‚˜๋„ ๋”ฐ๋ผํ•ด๋ดค๋‹ค. ๋ฌผ๋ก  ๋‹ต๋ณ€์ค‘์— ๋‚˜์˜จ redis๊ฐ€ ์•„๋‹Œ ๊ธฐ์กด์—๋„ ๋น„์Šทํ•œ ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ kafka๋ฅผ ์ ์šฉ. ์•„, ๊ทธ์ „์— ํ˜„์žฌ๊ตฌ์„ฑ์€ Elasticsearch ๋…ธ๋“œ๊ฐ€ ์ด 3๋Œ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋Š˜๋ฆฌ๋ฉฐ ์Šค์ผ€์ผ ์•„์›ƒ์„ ํ•ด๋ณด๊ธฐ์ „์— ํ• ์ˆ˜์žˆ๋Š” ๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์ด๋‹ค ์ƒ๊ฐํ•˜๊ณ  ์ค‘๊ฐ„์— kafka๋ฅผ ๋‘ฌ์„œ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. (์–ธ์ œ๋ถ€ํ„ด๊ฐ€ ๋งˆ์น˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ๋งž๋ฌผ๋ ค ๋Œ์•„๊ฐ€๋Š”๋“ฏํ•œ ์‹œ์Šคํ…œ ์„ค๊ณ„๋ฅผ ํ•˜๋Š”๊ฒŒ ์žฌ๋ฐŒ์—ˆ๋‹ค.) ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

/images/apache-access-log-to-es/model_2.png
๊ทธ๋‚˜๋งˆ ์ข€๋” ์ƒ๊ฐํ•œ ๊ตฌ์กฐ

๊ทธ๋žฌ๋”๋‹ˆ ๊ฑฐ์ง“๋ง ์ฒ˜๋Ÿผ ์—๋Ÿฌํ•˜๋‚˜ ์—†์ด ์ž˜ ์ธ๋ฑ์‹ฑ์ด ๋ ์ˆ˜ ์žˆ์—ˆ๋‹ค. logstash๊ฐ€ ์–‘์ชฝ์— ์žˆ๋Š”๊ฒŒ ์•ฝ๊ฐ„ ๊ฑธ๋ฆฌ๊ธด ํ•˜์ง€๋งŒ, ์ฒ˜์Œ์— ์ƒ๊ฐํ•œ ๊ตฌ์กฐ๋ณด๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ์•ˆ๋‚˜๋‹ˆ ๋‹คํ–‰์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

์ด ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ์–ป์€ Insight๊ฐ€ ์žˆ๊ธฐ์—, ๊ฐ ํ•ญ๋ชฉ๋ณ„๋กœ ์ ์–ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ( ์ด๊ฒƒ๋งŒ ์ ์–ด๋†“๊ธฐ์—” ๋„ˆ๋ฌด ์—†์–ด๋ณด์—ฌ์„œ.. )

access log ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•˜์—ฌ ์ธ๋ฑ์‹ฑ ํ• ๊ฒƒ์ธ๊ฐ€?

apache 2.x๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ„๋„์˜ ๋กœ๊ทธ ํฌ๋งท์„ ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ access log๊ฐ€ ์ฐํžŒ๋‹ค. 123.1.1.1 - - [25/Jan/2018:21:55:35 +0900] "GET /api/test?param=12341234 HTTP/1.1" 200 48 1144 "http://www.naver.com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_1_2 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Mobile/15B202 NAVER(inapp; blog; 100; 4.0.44)" ๊ทธ๋Ÿผ ์ด ๋กœ๊ทธ๋ฅผ ์•„๋ฌด ํฌ๋งทํŒ… ์—†์ด ๋กœ๊น…์„ ํ•˜๋ฉด ๊ทธ๋ƒฅ ํ•œ์ค„์˜ ํ…์ŠคํŠธ๊ฐ€ ์ธ๋ฑ์‹ฑ์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด elasticsearch ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์žฌ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„์˜ ์ž‘์—…์ด ํ•„์š”ํ• ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ค‘๊ฐ„์— ์žˆ๋Š” logstash์—๊ฒŒ ์ผ์„ ์‹œ์ผœ ์ข€๋” nice ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ๋ฑ์‹ฑ์„ ํ•ด๋ณด์ž. ๋ฐ”๋กœ logstash ์˜ filter ๊ธฐ๋Šฅ์ด๋‹ค. ๊ทธ์ค‘ Grok filter ๋ผ๋Š”๊ฒŒ ์žˆ๋Š”๋ฐ ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ row data ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์กฐ๊ธˆ ์ฐพ์•„๋ณด๋‹ˆ ๋„ˆ๋ฌด ๊ณ ๋ง™๊ฒŒ๋„ ์•„ํŒŒ์น˜ ํ•„ํ„ฐ ์˜ˆ์ œ๊ฐ€ ์žˆ์–ด ์ˆ˜์ •ํ•˜์—ฌ ์ ์šฉํ• ์ˆ˜ ์žˆ์—ˆ๋‹ค. http://grokconstructor.appspot.com/do/match?example=2 ๊ทธ๋ž˜์„œ ์ ์šฉํ•œ ํ•„ํ„ฐ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

filter {
        grok {
                match => {
                        message => "%{IP:clientIp} (?:-|) (?:-|) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:httpMethod} %{URIPATH:uri}%{GREEDYDATA}(?: HTTP/%{NUMBER})?|-)\" %{NUMBER:responseCode} (?:-|%{NUMBER})"
                }
        }
}

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  elasticsearch ์— ์ธ๋ฑ์‹ฑ์„ ํ•˜๋ฉด ํ‚ค๋ฐ”๋‚˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณผ์ˆ˜ ์žˆ๋‹ค.

/images/apache-access-log-to-es/access_log_kibana.png
ํ‚ค๋ฐ”๋‚˜์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ตฌ์กฐ๋Œ€๋กœ ์ด์˜๊ฒŒ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” access log

๊ฐ ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ํ•œ์ค„๋กœ ์ธ๋ฑ์‹ฑ์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

Elasticsearch ์— ์ธ๋ฑ์‹ฑ์ด ๋˜๊ธด ํ•˜๋Š”๋ฐ ๋กœ๊ทธ ํ•œ์ค„์ด ํ†ต์งธ๋กœ ๋“ค์–ด๊ฐ€ ๋ฒ„๋ฆฐ๋‹ค. message๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ… ์•Œ๊ณ ๋ณด๋‹ˆ ํ˜„์žฌ ๊ตฌ์กฐ๋Š” logstash๊ฐ€ kafka ์•ž ๋’ค์— ์žˆ๋‹ค๋ณด๋‹ˆ producer logstash ์™€ consumer logstash ์˜ codec์ด ๋งž์•„์•ผ ์ œ๋Œ€๋กœ ์ธ๋ฑ์‹ฑ์ด ๋ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋จผ์ € access log์—์„œ kafka ๋กœ produce ํ•˜๋Š” logstash ์—์„œ๋Š” output ํ• ๋•Œ codec ์„ ๋งž์ถฐ์ฃผ๊ณ 

output {
        kafka {
                bootstrap_servers => "123.1.2.3:9092,123.1.2.4:9092"
                topic_id => "apache-log"
                codec => json{}
        }
}

kafka ์—์„œ consume ํ•˜๋Š” logstash ์—์„œ๋Š” input ์—์„œ codec ์„ ๋งž์ถฐ์ค€๋‹ค.

input {
        kafka {
                bootstrap_servers => "123.1.2.3:9092,123.1.2.4:9092"
                topic_id => "apache-log"
                codec => json{}
        }
}

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด codec์ด ๋งž์•„ ๊ฐ ํ•„๋“œ๋กœ ์ด์˜๊ฒŒ ์ธ๋ฑ์‹ฑ์„ ํ• ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํŒŒ์ด์ฌ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ (2.6 > 3.6)

ํŒŒ์ด์ฌ 2.x ์—์„œ๋Š” depreate ๋œ ๋ชจ๋“ˆ๋„ ๋งŽ๊ณ  3.x์—์„œ๋งŒ ์ง€์›๋˜๋Š” ๋ฒ„์ „๋“ค์ด ๋งŽ์•„์ง€๋ฉด์„œ ์‹ค์ปท ๊ฐœ๋ฐœ์„ ํ•ด๋„ ํŒŒ์ด์ฌ ๋ฒ„์ „๋•Œ๋ฌธ์— ๋‹ค์‹œ ์งœ์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค. ํŒŒ์ด์ฌ ๋ฒ„์ „์—…์„ ํ•˜๊ณ ์‹ถ์–ด ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋ฉด ์ด๋ ‡๋‹คํ•  ์ •๋ฆฌ๋œ ๋ฌธ์„œ๊ฐ€ ์ž˜ ์•ˆ๋‚˜์˜จ๋‹ค. (์˜์–ด๋กœ๋œ ํฌ์ŠคํŠธ๋Š” ๋งŽ์ด ์žˆ๊ธด ํ•˜๋‚˜, ํ•„์ž์˜ ํ™˜๊ฒฝ๊ณผ๋Š” ๋งž์ง€ ์•Š๋Š” …) ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์ €๊ฒƒ ์‚ฝ์งˆ์„ ํ•œ ๊ฒฐ๊ณผ ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ์˜ฌ๋ฆด์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ํฌ์ŠคํŒ… ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ณด๊ณ ๋‹ˆ 2018๋…„ ์ฒซ ํฌ์ŠคํŒ…์ด๋„ค… ์˜ฌํ•ด๋Š” ์ •๋ง ์ ์–ด๋„ ํ•œ๋‹ฌ์— 1~2๊ฐœ๋Š” ์˜ฌ๋ฆด์ˆ˜ ์žˆ๋Š” ๋‚ด๊ฐ€ ๋˜๊ธฐ๋ฅผ…

ํ™˜๊ฒฝ

  • CentOS 6.9
  • ๊ธฐ๋ณธ์œผ๋กœ python 2.6 ์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค. (ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅผ์ˆ˜ ์žˆ์Œ.)
$ python -V
Python 2.6

์„ค์น˜์ˆœ์„œ

  • ํ•„์š”ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
$ sudo yum update
$ sudo yum install yum-utils
$ sudo yum groupinstall development
  • yum ์ €์žฅ์†Œ์—์„œ๋Š” ์ตœ์‹  ํŒŒ์ด์ฌ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ RPM ํŒจํ‚ค๋ฅผ ์ œ๊ณตํ•˜๋Š” IUM ์ด๋ผ๋Š” ์ถ”๊ฐ€ ์ €์žฅ์†Œ๋ฅผ ์„ค์น˜
$ sudo yum install -y https://repo.ius.io/ius-release-el7.rpm
  • ํŒŒ์ด์ฌ 3.6 ๋ฒ„์ „์„ ์„ค์น˜
$ sudo yum install python36u
  • pip ๋“ฑ ํŒจํ‚ค์ง€ ๊ด€๋ จ ๋ชจ๋“ˆ๋„ ํ•จ๊ป˜ ์„ค์น˜
sudo yum install python36u-pip
sudo yum install python36u-devel
  • ์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ๊ธฐ์กด ํŒŒ์ด์ฌ 2.6๊ณผ ์ƒˆ๋กœ ์„ค์น˜๋œ ํŒŒ์ด์ฌ 3.6 ์ด ์„ค์น˜๋˜์–ด์žˆ๋‹ค.
$ ll /usr/bin/python*
-rwxr-xr-x 1 root root 9997450 Jan  2 16:02 python
lrwxrwxrwx 1 root root       6 Jan  1 06:02 python2 -> python
-rwxr-xr-x 1 root root    9032 Aug 19  2016 python2.6
-rwxr-xr-x 1 root root    1418 Aug 19  2016 python2.6-config
-rwxr-xr-x 2 root root    6808 Oct 12 08:19 python3.6
lrwxrwxrwx 1 root root      26 Jan  2 20:48 python3.6-config -> /usr/bin/python3.6m-config
-rwxr-xr-x 2 root root    6808 Oct 12 08:19 python3.6m
-rwxr-xr-x 1 root root     173 Oct 12 08:19 python3.6m-config
-rwxr-xr-x 1 root root    3339 Oct 12 08:16 python3.6m-x86_64-config
lrwxrwxrwx 1 root root      16 Apr 25  2017 python-config -> python2.6-config
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.
$ sudo mv python python_backup
$ sudo ln -s python3.6 python
  • ํ™•์ธ
$ python -V
Python 3.6.3

pip ๋ฅผ ์ด์šฉํ•œ ๋ชจ๋“ˆ ์„ค์น˜

  • pip๋ž€ Python Package Index ์˜ ์•ฝ์ž๋กœ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ( https://pypi.python.org/pypi/pip )
  • ์„ค์น˜ํ•  ๋ชจ๋“ˆ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ex : requests ๋ชจ๋“ˆ์ธ ๊ฒฝ์šฐ
$ sudo python3.6 -m pip install requests

Elastic{ON}Tour

์ž‘๋…„์— ํŒ€์„ ์˜ฎ๊ธฐ๋ฉด์„œ ๋กœ๊น…์— ๋Œ€ํ•ด์„œ ๊ด€์‹ฌ์„ ๊ฐ–๊ธฐ ์‹œ์ž‘ ํ•˜์˜€๊ณ  ์ฐพ์•„๋ณด๋‹ค ElasticStack ์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ, ํŒ€ ๋‚ด์—์„œ ๋‚˜ํ™€๋กœ ์‚ฝ์งˆํ•ด๊ฐ€๋ฉฐ ์ง€๊ธˆ์˜ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค. ๊ทธ์— ElasticStack ์— ๊ด€์‹ฌ์„ ๊ฐ–๋˜ ์ฐฐ๋‚˜ ์ง€๋‚œ ํ™”์š”์ผ(12์›” 12์ผ)์— ์žˆ์—ˆ๋˜ Elastic On Tour์— ์ฐธ์„์„ ํ•˜์˜€๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์  ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ ๊ฐ๋™(?)์„ ์žƒ๊ธฐ ์‹ซ์–ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Registration + Partner Showcase

์ฝ”์—‘์Šค ์ธํ„ฐ์ปจํ‹ฐ๋„จํƒˆ ํ˜ธํ…”์—์„œ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ์—ญ์‹œ ์™ธ๊ตญ๊ณ„ ๊ธฐ์—…์ด์—ฌ์„œ ๊ทธ๋Ÿฐ์ง€ ํ–‰์‚ฌ ๊ทœ๋ชจ๊ฐ€ ์–ด๋งˆ์–ด๋งˆ ํ–ˆ๋‹ค. ์ด์ •ํ‘œ๋ฅผ ๋”ฐ๋ผ ์ง€ํ•˜๋กœ ๊ฐ€์„œ ๋“ฑ๋ก์„ ํ•˜๊ณ , ElasticStack ์„ ์ด์šฉํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ํŒŒํŠธ๋„ˆ์‚ฌ๋“ค์˜ ๋ถ€์Šค๋ฅผ ๊ธฐ์›ƒ๊ฑฐ๋ฆฌ๋ฉฐ ElasticStack์˜ ์ €๋ ฅ(?)์„ ๋‹ค์‹œํ•œ๋ฒˆ ์‹ค๊ฐ์„ ํ• ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ Elatic ๋ณธ์‚ฌ์—์„œ ๋‚˜์˜จ๋“ฏํ•œ ์™ธ๊ตญ์ธ๋“ค์ด Q&A ๊ฐ™์€๊ฑธ ํ•ด์คฌ๋Š”๋ฐ ๋‹ต๋ณ€์„ ํ•ด์ฃผ๋Š” ์™ธ๊ตญ์ธ๋„ ๋Œ€๋‹จํ•ด ๋ณด์˜€๋Š”๋ฐ ์งˆ๋ฌธ์„ ํ•˜๋Š” ํ•œ๊ตญ์‚ฌ๋žŒ(?)๋“ค์ด ๋” ๋Œ€๋‹จํ•˜๊ฒŒ ๋ณด์˜€๋‹ค. ๊ณผ์—ฐ ๋‚œ ์ €๋ ‡๊ฒŒ ์•„๋ฌด๋ ‡์ง€ ์•Š๊ณ  ํ”„๋กœํŽ˜์…”๋„(?)ํ•˜๊ฒŒ ์งˆ๋ฌธ์„ ํ• ์ˆ˜ ์žˆ์„๊นŒ?

/images/elastic-on-tour/people.jpg
Registration + Partner Showcase

Track 1 : Partner Sessions

Track 1 ๊ณผ 2๋กœ ๋‚˜๋‰˜์˜€๋Š”๋ฐ 2๋Š” Elastic Stack ์„ ๊ฒฝํ—˜ํ•˜์ง€ ๋ชปํ•ด๋ดค๊ฑฐ๋‚˜ ์†Œ๊ฐœํ•˜๋Š” ์ž๋ฆฌ๊ฐ™์•„์„œ Track 1๋ฅผ ๋“ฃ๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋‚ด๊ฐ€ ๋„์ž…์„ ํ• ๋•Œ๋งŒ ํ•ด๋„ ๊ด€๋ จ ์ž๋ฃŒ๊ฐ€ ์ž˜ ์—†์—ˆ๊ณ , ์ •๋ง ํŠน์ด ์ผ€์ด์Šค๊ฐ€ ์•„๋‹Œ ์ด์ƒ์—” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒ ๊ตฌ๋‚˜ ํ•˜๋Š” ๋А๋‚Œ์ด์˜€๋Š”๋ฐ ๋ฐœํ‘œํ•˜์‹œ๋Š” ๋ถ„๋“ค์„ ๋ณด๊ณ ์„œ๋Š” ์ƒ๊ฐ์ด 180๋„ ๋ฐ”๋€Œ์—ˆ๋‹ค. ๋„ˆ๋ฌด ํ™œ์šฉ๋“ค์„ ์ž˜ ํ•˜๋ฉฐ ์„œ๋น„์Šค๋ฅผ ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฒ€์ƒ‰์—”์ง„์ด ์•„๋‹Œ ์ƒํ™ฉ์— ๋งž๋Š” ์ปค์Šคํ„ฐ ๋งˆ์ด์ง•์ด๋‚˜ ๋‹ค๋ฅธ ๊ธฐ์ˆ  ์Šคํƒ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์‹œ๋„ˆ์ง€ ํšจ๊ณผ๋ฅผ ๋‚ด๊ณ  ์žˆ์—ˆ๋‹ค.

  • Microsoft
    • OpenSource ์— ์•ˆ์ข‹์€ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋‚˜ ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ํˆฌ์ž๋ฅผ ๋งŽ์ด ํ•ด์™”๋‹ค๊ณ  ์„ค๋ช…์„ ํ•˜๋ฉฐ Azure๋ผ๋Š” ์„œ๋น„์Šค์—์„œ Elastic Stack ์„ ์–ด๋–ค์‹์œผ๋กœ ํ™œ์šฉํ•˜๋Š”์ง€ ๋ฐœํ‘œ๋ฅผ ํ•˜์˜€๋‹ค.
    • ์ƒ๋‹นํžˆ ์‹ฌํ”Œํ•˜๊ณ  ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋„ ํด๋ฆญ ๋ช‡๋ฒˆ์œผ๋กœ ES Cluster๋ฅผ ๊ตฌ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด์˜€์œผ๋‚˜, ์œ ๋ฃŒ + ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ œํ•œ ์ด ์•„์‰ฌ์› ๋‹ค.
  • S-Core : ์—์Šค์ฝ”์–ด ๊ฒฝํ—˜์— ๊ธฐ๋ฐ˜ํ•œ Elastic ํ™œ์šฉ๋ฒ•
  • EZFarm
    • (์™ธ๋ชจ ๋น„ํ•˜๋Š” ์•„๋‹ˆ์ง€๋งŒ)๋†๋ถ€ ์ฒ˜๋Ÿผ ์ƒ๊ธฐ์‹  ๋ถ„์ด ๋‚˜์™€์„œ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ๋ง์”€ํ•˜์‹œ๋Š”๊ฒŒ ์‹ ๊ธฐํ•œ ๋ฐœํ‘œ์˜€๋‹ค.
    • ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๋ผ์ง€๊ฐ€ ๋ฌผ ๋จน๋Š” ๋Ÿ‰ ๋“ฑ ๋†์—…/์ถ•์‚ฐ์—…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ES์— ๋‹ด๊ณ  ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ†ตํ•˜์—ฌ ํšจ์œจํ™” ํ•˜๋Š” ๋ฐฉ์•ˆ ์ด์˜€๋˜๊ฒƒ ๊ฐ™๋‹ค.
  • MEGAZONE
    • ํŒŒํŠธ๋„ˆ ๋ถ€์Šค์—์„œ ํ‹ฐ์…”์ธ ๋ฅผ ์ค€(?) ๊ณณ์ด์˜€๋Š”๋ฐ Elastic Cloud Seoul ์„ ๋ฐœํ‘œํ•˜์˜€๋‹ค. (๋“œ๋””์–ด ํ•œ๊ตญ์—๋„ ์ด๋Ÿฐ ์„œ๋น„์Šค๊ฐ€!)
  • OpenBase
    • ํ‚ค๋ฐ”๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๊ณ  ์ปค์Šคํ…€ UI์˜ ์‚ฌ๋ก€๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค.
    • ํ‚ค๋ฐ”๋‚˜ ์†Œ์Šค์ค‘์— ์—‘์…€ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ํ•œ๊ธ€๋กœ ์•ˆ๋˜์–ด ๊ณ ์ณ๋ณธ๊ฒƒ ๋ง๊ณค ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•  ์ƒ๊ฐ์€ ์—†์—ˆ๋Š”๋ฐ ์ •๋ง ๊ฐœ๋ฐœ์ž ์Šค๋Ÿฌ์šด ๋ฐœํ‘œ์˜€๋‹ค.
  • DIREA
    • ๊ฒฐ์ œ ๊ด€๋ จ ์žฅ์• ์ถ”์  ๋ฐ ์˜ˆ์ธก ์‹œ์Šคํ…œ์„ ๋ฐœํ‘œํ•˜์˜€๋‹ค.
    • ๋งˆ์นจ ๋‚ด๊ฐ€ ํ•˜๊ณ ์žˆ๋Š” ์„œ๋น„์Šค์™€ ๋น„์Šทํ•˜๊ณ , ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋˜ ๋ถ€๋ถ„๊ณผ ๊ฑฐ์˜ ์ผ๋งฅ์ƒํ†ตํ•œ ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ์†Œ๋ฆ„์ด์˜€๋‹ค.
/images/elastic-on-tour/parter_Session.jpg
Track 1 : Partner Sessions

Opening Keynote

์•ž์„œ ์–ด๋–ค ๋ฐœํ‘œ์—์„œ ElasticSearch๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ๋œ ๊ณ„๊ธฐ๊ฐ€ ์–ด๋–ค ๋ถ„์ด ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋˜๋ ค๋Š” ์•„๋‚ด๋ฅผ ์œ„ํ•ด ์กฐ๋ฆฌ๋ฒ•์„ ๋” ๋นจ๋ฆฌ ๊ฒ€์ƒ‰ํ• ์ˆ˜ ์žˆ๋Š” ์—”์ง„์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ๊ทธ ์–ด๋–ค๋ถ„์ด ๋‚ด๋ˆˆ์•ž์— ๋‚˜ํƒ€๋‚˜ ๋ฐœํ‘œ๋ฅผ ํ•˜์…จ๋‹ค. ํ˜„ Elastic CEO ์ด์‹  Shay Banon ์ด์˜€๋‹ค. (์–ด์ƒ‰ํ•œ ๋™์‹œ ํ†ต์—ญ์œผ๋กœ ์ดํ•ดํ•˜์˜€์ง€๋งŒ) ๊ทธ๋ถ„์ด ๊ฐ•์กฐํ•˜์‹  Elastic ํšŒ์‚ฌ ์ •์‹ ์ธ “๊ฐ„๋‹จํ•œ๊ฑด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค.” ๊ฐ€ ์—ฐ์„ค์ค‘์— ๊ฐ€์žฅ ์ธ์ƒ์ ์ด์˜€๊ณ , ํ†ต์—ญํ•˜์‹  ์•„์ฃผ๋จธ๋‹˜(?)๋•Œ๋ฌธ์ด์˜€๋Š”์ง€ ์ „๋‹ฌํ•˜์‹œ๋Š” ์˜๋„๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ธด ์–ด๋ ค์› ์œผ๋‚˜ ์ผ๋‹จ CEO๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํšŒ์‚ฌ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ Š์–ด๋ณด์ธ๋‹ค๋Š”๊ฑธ ๋А๋‚„์ˆ˜ ์žˆ์—ˆ๋‹ค.

/images/elastic-on-tour/key_note.jpg
Shay Banon key note

Break (์‹์‚ฌ์‹œ๊ฐ„)

์ด๋Ÿฐ ์„ธ๋ฏธ๋‚˜? ์ปจํผ๋Ÿฐ์Šค? ๋ฅผ ๋งŽ์ด ๋‹ค๋…€๋ณธ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ์—ญ๋Œ€๊ธ‰์œผ๋กœ ์ข‹์•˜๋˜ ์ ์‹ฌ์‹์‚ฌ์˜€๋‹ค. ;) ์‚ฌ์‹ค ํ˜ผ์ž์™€์„œ ๋ฐฅ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜ ํ–ˆ๋Š”๋ฐ ์šฐ๋ฅด๋ฅด๋ฅด ํ˜ธํ…” ์ง์›๋ถ„๋“ค์ด ๊ฐ ์ž๋ฆฌ์— ๋„์‹œ๋ฝ์„ ๋Œ€๋ น(?)ํ•ด์ฃผ์…”์„œ ๋ง›์žˆ๊ฒŒ ๋จน์„์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฐธ ์‚ฌ๋žŒ์ด ๊ฐ„์‚ฌํ•œ๊ฒŒ, ์•„์นจ์— ์กธ๋ฆฐ๋ˆˆ ๋น„๋ฒผ๊ฐ€๋ฉฐ ์ง€์˜ฅ์ฒ  ๊ณ ์ƒ์„ ๋šซ๊ณ  ์™€์„œ ํž˜๋“ค์—ˆ์ง€๋งŒ ๋ฐฅ์„ ๋จน์œผ๋ฉด์„œ ์•„์นจ์˜ ๊ทธ ๊ณ ์ƒ์€ ๋ˆˆ๋…น๋“ฏ ์‚ฌ๋ผ์กŒ๋‹ค.

/images/elastic-on-tour/lunch.jpg
ํ˜ธํ…” ๋„์‹œ๋ฝ!!

Deep Dive (Elasticsearch, Ingest, Kibana, Machine Learning)

๊ฐ ์Šคํƒ(?)์— ๋Œ€ํ•ด์„œ ๋ณ€ํ™”๋œ ๋ถ€๋ถ„, ๊ทธ๋ฆฌ๊ณ  ํ™œ์šฉ๊ฐ€๋Šฅ์„ฑ๊ณผ ์ตœ๊ทผ ์ถœ์‹œํ•œ 6.X ๋ฒ„์ „์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•˜๋Š” ์‹œ๊ฐ„์ด์˜€๋‹ค. ์‚ฌ์‹ค ์•„์ง 2.4 ๋ฒ„์ „์„ ์šด์˜์ค‘์ด๋ผ์„œ์ธ์ง€ 6.X์˜ ๋ณ€ํ™”๋œ ๋ถ€๋ถ„, ๊ทธ๋ฆฌ๊ณ  5.x ๋ฒ„์ „์—์„œ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด์ฃผ๋Š”๋ฐ ํ™• ์™€๋‹ฟ์ง€๋Š” ๋ชปํ•˜์˜€๋‹ค. ์•„์ง 5.x ๋ฒ„์ „์˜ ํ•„์š”์„ฑ์„ ๋ชป๋А๊ปด์„œ ๋ฒ„์ „์—…์„ ์•ˆํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋ฐœํ‘œ๋ฅผ ๋“ฃ๊ณ  ๊ผญ ์œ ๋ฃŒ ๋ผ์ด์„ผ์Šค๋ฅผ ๊ตฌ๋งคํ•˜์ง€ ์•Š์•„๋„ ์šฉ๋Ÿ‰ ๋‹จ์ถ•์ด๋‚˜ ์•ˆ์ •์„ฑ, ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋“ฑ 5.X๋กœ์˜ ๋ฒ„์ „์—…์€ ํ•ด์„œ ๋‚˜์ ๊ฒƒ๋„ ์—†์„๋“ฏ ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. (๋‹จ, ๋ฌด์กฐ๊ฑด ์‹ ๋ฒ„์ „์ด ์ข‹์€๊ฒƒ์€ ์•„๋‹Œ๋“ฏ ์ž˜ ์•Œ์•„๋ณด๊ณ  ํ•ด์•ผ๊ฒ ์ง€…) ํŠนํžˆ ํ‚ค๋ฐ”๋‚˜๋ฅผ ํ™œ์šฉํ•ด ๋จธ์‹ ๋Ÿฌ๋‹์„ ๋ˆˆ์•ž์—์„œ ๋ณด์—ฌ์ค€๊ฑด ๋„ˆ๋ฌด ์ข‹์•˜๋‹ค. ์„ฑ๋Šฅ์ด ์ข‹์•„์„œ์ธ์ง€ ๋ฐ๋ชจ์‹œ์—ฐ ํ•˜๋Š”๋ฐ ์ „ํ˜€ ๋ง‰ํž˜์ด ์—†์—ˆ์œผ๋‹ˆ…