ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์„œ๋ก : ๋””์ง€ํ„ธ ์‹œ๋Œ€์˜ ํ”์ , ๋กœ๊ทธ (Log)

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

๋กœ๊ทธ๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์„œ๋ฒ„์— ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•œ ์‹œ๊ฐ„, ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ–ˆ๋Š”์ง€, ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์‹คํŒจํ–ˆ๋Š”์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์–ด๋–ค ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ๋“ฑ, ๋ง ๊ทธ๋Œ€๋กœ '๋ฐœ์ƒํ–ˆ๋˜ ์ผ'์— ๋Œ€ํ•œ ์‹œ๊ณ„์—ด ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์ด ๋กœ๊ทธ๋“ค์€ ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค์€ ์‹œ์Šคํ…œ์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ง„๋‹จํ•˜๊ณ , ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๋ฉฐ, ์‹ฌ์ง€์–ด๋Š” ๋ฏธ๋ž˜๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ท€์ค‘ํ•œ ์ •๋ณด์›์ž…๋‹ˆ๋‹ค.

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

๋น„์ „๊ณต์ž๋ถ€ํ„ฐ ํ˜„์—… ๊ฐœ๋ฐœ์ž๊นŒ์ง€, ์ด ๊ธ€์„ ํ†ตํ•ด ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ๋ถ„์„์ด ๋ฌด์—‡์ธ์ง€, ์™œ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ํ•ต์‹ฌ ๋‚ด์šฉ์„ ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก ์•ˆ๋‚ดํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ๋ถ„์„์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ๊ธฐ๋ณธ ๊ฐœ๋… ๋ฐ ์ค‘์š”์„ฑ

๋กœ๊ทธ(Log)์˜ ๋ณธ์งˆ๊ณผ ์‹œ์Šคํ…œ ์šด์˜์˜ ํ•„์ˆ˜ ์š”์†Œ

๋กœ๊ทธ(Log)๋Š” ๋ชจ๋“  ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋„คํŠธ์›Œํฌ ์žฅ์น˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๊ฑด(event)์˜ ๋””์ง€ํ„ธ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋น„์œ ํ•˜์ž๋ฉด, ๋งˆ์น˜ ํ•ญ๊ณต๊ธฐ์˜ '๋ธ”๋ž™๋ฐ•์Šค'๋‚˜ ๊ฑด๋ฌผ์˜ '๋ณด์•ˆ ๊ฐ์‹œ ์นด๋ฉ”๋ผ ๊ธฐ๋ก'๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ผ์ด ์–ธ์ œ, ์–ด๋””์„œ, ๋ˆ„๊ตฌ์— ์˜ํ•ด, ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ๋ถ„์ด ์ฆ๊ฒจ ์‚ฌ์šฉํ•˜๋Š” ์›น์‚ฌ์ดํŠธ์— ์ ‘์†ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด ์งง์€ ์ˆœ๊ฐ„์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์›น ์„œ๋ฒ„ ๋กœ๊ทธ: "์‚ฌ์šฉ์ž [IP ์ฃผ์†Œ]๊ฐ€ [์‹œ๊ฐ„]์— [์›นํŽ˜์ด์ง€ ์ฃผ์†Œ]๋ฅผ ์š”์ฒญํ–ˆ๋‹ค."
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ: "์‚ฌ์šฉ์ž [ID]๊ฐ€ [์‹œ๊ฐ„]์— ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ–ˆ๋‹ค."
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ๊ทธ: "[์‚ฌ์šฉ์ž ID]์˜ ์š”์ฒญ์— ๋”ฐ๋ผ [ํŠน์ • ๋ฐ์ดํ„ฐ]๋ฅผ ์กฐํšŒํ–ˆ๋‹ค."
  • ๋ณด์•ˆ ๋กœ๊ทธ: "์•Œ ์ˆ˜ ์—†๋Š” IP์—์„œ [์‹œ๊ฐ„]์— ๋กœ๊ทธ์ธ ์‹œ๋„ 5ํšŒ ์‹คํŒจ."

์ด์ฒ˜๋Ÿผ ๋กœ๊ทธ๋Š” ์‹œ์Šคํ…œ์˜ ์‹ฌ์žฅ ๋ฐ•๋™๊ณผ ๊ฐ™์•„์„œ, ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ™œ๋™์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ก์ด ์—†๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋Š”์ง€ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ ๋กœ๊ทธ ๋ถ„์„์ด ํ•„์š”ํ•œ๊ฐ€? ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์˜ ํ•œ๊ณ„

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ•œ ๋กœ๊ทธ๋ฅผ ์™œ ๋ถ„์„ํ•ด์•ผ ํ• ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์˜ ๋ฐฉ์‹์œผ๋กœ๋Š” ๋ฌด์—‡์ด ๋ถ€์กฑํ–ˆ์„๊นŒ์š”?

  1. ๋ฌธ์ œ ํ•ด๊ฒฐ (Troubleshooting) ๋ฐ ์žฅ์•  ์ง„๋‹จ: ์‹œ์Šคํ…œ์—์„œ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋กœ๊ทธ๋Š” ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•„๋‚ด๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ์„œ์ž…๋‹ˆ๋‹ค. "์–ด๋–ค ์‹œ์ ์—, ์–ด๋–ค ์„œ๋น„์Šค์—์„œ, ์–ด๋–ค ์ข…๋ฅ˜์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€"๋ฅผ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ํŒŒ์•…ํ•˜๊ณ , ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์˜ ๋กœ๊ทธ๋ฅผ ์ƒํ˜ธ ๋น„๊ตํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๋ฌธ์ œ๋„ ์‹ ์†ํ•˜๊ฒŒ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋А๋ ค์กŒ์„ ๋•Œ, ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜, ํŠน์ • API ํ˜ธ์ถœ์— ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ตœ์ ํ™”: ๋กœ๊ทธ๋Š” ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„, ์‘๋‹ต ์‹œ๊ฐ„, ์ž์› ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์„ ์‹๋ณ„ํ•˜๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ง•ํ›„๋ฅผ ์กฐ๊ธฐ์— ๊ฐ์ง€ํ•˜์—ฌ ์„ ์ œ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "ํ‰์†Œ๋ณด๋‹ค ํŠน์ • API์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด 2๋ฐฐ ๊ธธ์–ด์กŒ๋‹ค"๋Š” ์ •๋ณด๋ฅผ ๋กœ๊ทธ์—์„œ ๋ฐœ๊ฒฌํ•œ๋‹ค๋ฉด, ํฐ ์žฅ์• ๋กœ ์ด์–ด์ง€๊ธฐ ์ „์— ์‹œ์Šคํ…œ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. ๋ณด์•ˆ ๊ฐ์‚ฌ ๋ฐ ์œ„ํ˜‘ ํƒ์ง€: ๋ชจ๋“  ๋กœ๊ทธ์ธ ์‹œ๋„, ํŒŒ์ผ ์ ‘๊ทผ, ์‹œ์Šคํ…œ ์„ค์ • ๋ณ€๊ฒฝ ๋“ฑ์€ ๋กœ๊ทธ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น„์ •์ƒ์ ์ธ ์ ‘๊ทผ ํŒจํ„ด์ด๋‚˜ ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ˜‘์„ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๊ฐ‘์ž๊ธฐ ํ•ด์™ธ IP์—์„œ ์ƒˆ๋ฒฝ 3์‹œ์— ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ์‹œ๋„๊ฐ€ 100ํšŒ ๋ฐœ์ƒํ–ˆ๋‹ค"๋Š” ๋กœ๊ทธ๋Š” ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์นจํ•ด์˜ ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋น„์ฆˆ๋‹ˆ์Šค ์ธ์‚ฌ์ดํŠธ ๋„์ถœ: ๋กœ๊ทธ๋Š” IT ์šด์˜์ ์ธ ์ธก๋ฉด ์™ธ์—๋„ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์˜ ์„œ๋น„์Šค ์ด์šฉ ํŒจํ„ด, ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ, ํŠน์ • ์‹œ๊ฐ„๋Œ€์— ์ง‘์ค‘๋˜๋Š” ์„œ๋น„์Šค ๋“ฑ์„ ๋ถ„์„ํ•˜์—ฌ ๋งˆ์ผ€ํŒ… ์ „๋žต ์ˆ˜๋ฆฝ์ด๋‚˜ ์„œ๋น„์Šค ๊ฐœ์„  ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๊ฐ€์žฅ ๋งŽ์ด ํด๋ฆญ๋˜๋Š” ๋ฒ„ํŠผ์€ ๋ฌด์—‡์ด๊ณ , ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค ๋‹จ๊ณ„์—์„œ ์ดํƒˆํ•˜๋Š”๊ฐ€?"์™€ ๊ฐ™์€ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ๋กœ๊ทธ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ๋กœ๊ทธ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„์ :

๊ณผ๊ฑฐ์—๋Š” ๊ฐ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. grep, tail ๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ง์ ‘ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์ฃ . ๊ทธ๋Ÿฌ๋‚˜ ํ˜„๋Œ€์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹ฌ๊ฐํ•œ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • ๋ฐฉ๋Œ€ํ•œ ๋กœ๊ทธ ์–‘: ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๋Œ€์˜ ์„œ๋ฒ„์—์„œ ๋งค์ดˆ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋กœ๊ทธ๊ฐ€ ์Ÿ์•„์ ธ ๋‚˜์˜ค๋ฉด, ์‚ฌ๋žŒ์ด ์ˆ˜๋™์œผ๋กœ ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ํฉ์–ด์ ธ ์žˆ๋Š” ๋กœ๊ทธ๋ฅผ ํ•œ๋ฐ ๋ชจ์•„ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
  • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ: ๋กœ๊ทธ๋Š” ์ •ํ˜•ํ™”๋˜์ง€ ์•Š์€ ํ…์ŠคํŠธ ํ˜•ํƒœ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์‹œ์„ฑ ๋ถ€์กฑ: ํ…์ŠคํŠธ ํŒŒ์ผ๋งŒ์œผ๋กœ๋Š” ๋กœ๊ทธ์˜ ์ „์ฒด์ ์ธ ์ถ”์„ธ๋‚˜ ํŒจํ„ด์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐํ™”๊ฐ€ ๋’ท๋ฐ›์นจ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ์˜ ์‹ฌ๊ฐ์„ฑ์„ ์ธ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ ๋ถ€์กฑ: ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์†๋„๊ฐ€ ํ˜„์ €ํžˆ ๋А๋ ค์ง‘๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ๋ฐฉ๋Œ€ํ•œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜์ง‘, ์ €์žฅ, ๋ถ„์„, ์‹œ๊ฐํ™”ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ํˆฌ๋ช…์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ์šด์˜ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ (ELK Stack): ๋กœ๊ทธ ๋ถ„์„์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ(Elastic Stack), ํ”ํžˆ ELK ์Šคํƒ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด ๊ธฐ์ˆ  ์กฐํ•ฉ์€ ๋กœ๊ทธ ๋ถ„์„ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ถ„์•ผ์—์„œ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. ELK๋Š” Elasticsearch, Logstash, Kibana ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์•ฝ์ž์ด๋ฉฐ, ์ด๋“ค์€ ์œ ๊ธฐ์ ์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ์‹œ๊ฐํ™” ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์—ญํ• ๊ณผ ์ด๋“ค์ด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Logstash: ๋ฐ์ดํ„ฐ์˜ ์—ฐ๊ธˆ์ˆ ์‚ฌ (์ˆ˜์ง‘ ๋ฐ ์ •์ œ)

Logstash๋Š” ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ, ์›ํ•˜๋Š” ๋ชฉ์ ์ง€๋กœ ์ „์†กํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ์„œ๋ฒ„์ธก ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, ์„ธ์ƒ ๊ณณ๊ณณ์— ํฉ์–ด์ ธ ์žˆ๋Š” ์ง€์ €๋ถ„ํ•˜๊ณ  ๋ฌด์งˆ์„œํ•œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๊นจ๋—ํ•˜๊ฒŒ ์ •์ œํ•˜๊ณ , ๋ถ„์„ํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•˜์—ฌ Elasticsearch๋กœ ๋ณด๋‚ด๋Š” '๋ฐ์ดํ„ฐ์˜ ์—ฐ๊ธˆ์ˆ ์‚ฌ' ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • ๋‹ค์–‘ํ•œ ์ž…๋ ฅ(Input) ์†Œ์Šค ์ง€์›: ํŒŒ์ผ, Syslog, HTTP, Kafka, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋˜๋Š” access.log ํŒŒ์ผ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ์ „์†กํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ•๋ ฅํ•œ ํ•„ํ„ฐ(Filter) ๊ธฐ๋Šฅ: Logstash์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ˆ˜์ง‘๋œ ์›์‹œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ณ€ํ˜•ํ•˜์—ฌ ์˜๋ฏธ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜, ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ํ’๋ถ€ํ•˜๊ฒŒ(enrich) ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Grok: ๋น„์ •ํ˜• ํ…์ŠคํŠธ๋ฅผ ์ •ํ˜•ํ™”๋œ ๊ตฌ์กฐ๋กœ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ•๋ ฅํ•œ ํŒจํ„ด ๋งค์นญ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„ ๋กœ๊ทธ์™€ ๊ฐ™์ด ๋ณต์žกํ•œ ํ…์ŠคํŠธ์—์„œ IP ์ฃผ์†Œ, ์š”์ฒญ ๊ฒฝ๋กœ, ์‘๋‹ต ์ฝ”๋“œ ๋“ฑ์„ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Mutate: ํ•„๋“œ์˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ, ํƒ€์ž… ๋ณ€ํ™˜ (๋ฌธ์ž์—ด -> ์ˆซ์ž), ํ•„๋“œ ์ œ๊ฑฐ, ๋ฌธ์ž์—ด ์น˜ํ™˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ˜• ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Geoip: IP ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€๋ฆฌ ์ •๋ณด(๊ตญ๊ฐ€, ๋„์‹œ, ์œ„๋„, ๊ฒฝ๋„ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ๊ทธ์— ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
    • Date: ๋กœ๊ทธ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ Elasticsearch๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋‚ ์งœ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ(Output) ๋ชฉ์ ์ง€ ์ง€์›: ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ Elasticsearch ์™ธ์—๋„ Kafka, Redis, S3 ๋“ฑ ๋‹ค์–‘ํ•œ ์ €์žฅ์†Œ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Logstash๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์›์‹œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•˜์—ฌ Elasticsearch๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.

2. Elasticsearch: ์ดˆ๊ณ ์† ๋ฐ์ดํ„ฐ ๋„์„œ๊ด€ (์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰)

Elasticsearch๋Š” ๋ถ„์‚ฐํ˜• RESTful ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์ž…๋‹ˆ๋‹ค. Logstash๋ฅผ ํ†ตํ•ด ์ •์ œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋†€๋ผ์šด ์†๋„๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” '์ดˆ๊ณ ์† ๋ฐ์ดํ„ฐ ๋„์„œ๊ด€'์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹ญ์–ต ๊ฑด์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์†์—์„œ๋„ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹จ ๋ช‡ ์ดˆ ๋งŒ์— ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • ์ „๋ฌธ ๊ฒ€์ƒ‰ (Full-text Search): ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ์—”์ง„์ฒ˜๋Ÿผ ํ…์ŠคํŠธ ํ•„๋“œ ๋‚ด์˜ ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ์ธ๋ฑ์‹ฑํ•˜์—ฌ ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋‚˜ ์‚ฌ์šฉ์ž ID๋ฅผ ํฌํ•จํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ์ฆ‰์‹œ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ„์‚ฐ ์•„ํ‚คํ…์ฒ˜: ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ์†์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šค๊ฐ€ ๊ณ„์†๋˜๋ฏ€๋กœ ์•ˆ์ •์„ฑ๋„ ๋†’์Šต๋‹ˆ๋‹ค.
  • JSON ๋ฌธ์„œ ๊ธฐ๋ฐ˜: ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ JSON(JavaScript Object Notation) ๋ฌธ์„œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. JSON์€ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ, ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์  ์Šคํ‚ค๋งˆ (Dynamic Schema): ์‚ฌ์ „์— ์—„๊ฒฉํ•œ ์Šคํ‚ค๋งˆ(๋ฐ์ดํ„ฐ ๊ตฌ์กฐ)๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ถ”๋ก ํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋น„์ •ํ˜•์ ์ด๊ณ  ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ์— ํŠนํžˆ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ๋ถ„์„: ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋™์‹œ์— ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์— ์‹œ์Šคํ…œ์˜ ํ˜„ํ™ฉ์„ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง‘๊ณ„(Aggregation) ๊ธฐ๋Šฅ: ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ฑฐ๋‚˜, ํ‰๊ท ๊ฐ’์„ ๊ตฌํ•˜๊ฑฐ๋‚˜, ์ตœ๋Œ€/์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๋“ฑ ๋ณต์žกํ•œ ํ†ต๊ณ„ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด "์ง€๋‚œ 1์‹œ๊ฐ„ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ๋ฌด์—‡์ธ๊ฐ€?", "ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๊ธด API๋Š”?"๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Elasticsearch๋Š” ๊ฐ•๋ ฅํ•œ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๋‹จ์ˆœํžˆ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ๋ฐ์ดํ„ฐ์—์„œ ์˜๋ฏธ ์žˆ๋Š” ํŒจํ„ด๊ณผ ํ†ต์ฐฐ๋ ฅ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

3. Kibana: ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ† ๋ฆฌ๋กœ ๋งŒ๋“œ๋Š” ์‹œ๊ฐํ™” ๋„๊ตฌ (ํƒ์ƒ‰ ๋ฐ ์‹œ๊ฐํ™”)

Kibana๋Š” Elasticsearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•˜๋ฉฐ ๊ด€๋ฆฌํ•˜๋Š” ์›น ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. Logstash์™€ Elasticsearch๊ฐ€ ์ˆ˜์ง‘ํ•˜๊ณ  ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ฆ„๋‹ต๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”ํ•˜์—ฌ, '๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ† ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์‹œ๊ฐํ™” ๋„๊ตฌ' ๋˜๋Š” '์‹œ์Šคํ…œ์˜ ์กฐ์ข…์„ ๊ณ„๊ธฐํŒ' ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Kibana๊ฐ€ ์—†๋‹ค๋ฉด Elasticsearch์˜ ๊ฐ•๋ ฅํ•œ ๋ถ„์„ ๊ฒฐ๊ณผ๋Š” ๋‹จ์ˆœํ•œ ์ˆซ์ž์— ๋ถˆ๊ณผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • ๋ฐ์ดํ„ฐ ํƒ์ƒ‰ (Discover): Elasticsearch์— ์ €์žฅ๋œ ์›์‹œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐํšŒํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋ฉฐ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ์‹œ๊ฐ„ ๋ฒ”์œ„ ์ง€์ •, ํ•„๋“œ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์›ํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์‹œ๊ฐํ™” ์œ ํ˜•: ๋ง‰๋Œ€ ์ฐจํŠธ, ํŒŒ์ด ์ฐจํŠธ, ๋ผ์ธ ์ฐจํŠธ, ํžˆํŠธ๋งต, ์ง€๋ฆฌ์  ์ง€๋„ ๋“ฑ ๋‹ค์ฑ„๋กœ์šด ์‹œ๊ฐํ™” ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ถ”์„ธ, ๋ถ„ํฌ, ํŒจํ„ด ๋“ฑ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Metrics: ํŠน์ • ์ง€ํ‘œ(์˜ˆ: ์—๋Ÿฌ ๋ฐœ์ƒ๋ฅ , ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„)์˜ ํ˜„์žฌ ๊ฐ’์ด๋‚˜ ์ถ”์„ธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    • Data Table: ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • Maps: ์ง€๋ฆฌ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋กœ๊ทธ(์˜ˆ: ์‚ฌ์šฉ์ž ์ ‘์† IP์˜ ์œ„์น˜)๋ฅผ ์ง€๋„ ์œ„์— ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์‹œ๋ณด๋“œ (Dashboard): ์—ฌ๋Ÿฌ ์‹œ๊ฐํ™”๋ฅผ ํ•˜๋‚˜์˜ ํ™”๋ฉด์— ํ†ตํ•ฉํ•˜์—ฌ ์ข…ํ•ฉ์ ์ธ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„์˜ ํŠธ๋ž˜ํ”ฝ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—๋Ÿฌ์œจ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋“ฑ์„ ํ•œ ๊ณณ์—์„œ ๋™์‹œ์— ํ™•์ธํ•˜๋ฉฐ ์‹œ์Šคํ…œ ์ „๋ฐ˜์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Canvas: ํ”„๋ ˆ์  ํ…Œ์ด์…˜์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ† ๋ฆฌํ…”๋ง ํ˜•์‹์œผ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • Alerting & Machine Learning (์œ ๋ฃŒ ๊ธฐ๋Šฅ ํฌํ•จ): ํŠน์ • ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์˜ ๋น„์ •์ƒ์ ์ธ ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ํƒ์ง€ํ•˜๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Kibana๋Š” ๋ณต์žกํ•œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๊ด€์ ์ธ ๊ทธ๋ž˜ํ”„์™€ ์ฐจํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ, ๋น„๊ธฐ์ˆ ์ ์ธ ์‚ฌ์šฉ์ž๋“ค๋„ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ , ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

ELK Stack์˜ ์œ ๊ธฐ์ ์ธ ์ž‘๋™ ๋ฐฉ์‹

์ด ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ๊ธฐ์ ์œผ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ์™„์ „ํ•œ ๋กœ๊ทธ ๋ถ„์„ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

  1. Logstash (๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์ •์ œ): ๊ฐ ์„œ๋ฒ„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋Š” Logstash์˜ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ถ”์ถœํ•˜๊ณ , ์ผ๊ด€๋œ ํ˜•์‹์œผ๋กœ ์ •๊ทœํ™”๋˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋Š” ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์›์œ ๋ฅผ ์ •์ œํ•˜์—ฌ ํœ˜๋ฐœ์œ , ๊ฒฝ์œ  ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  2. Elasticsearch (๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰): Logstash๋ฅผ ํ†ตํ•ด ์ •์ œ๋œ ๋ฐ์ดํ„ฐ๋Š” Elasticsearch๋กœ ์ „์†ก๋˜์–ด ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰๊ณผ ๋ถ„์„์„ ์œ„ํ•ด ์ธ๋ฑ์‹ฑ๋ฉ๋‹ˆ๋‹ค. Elasticsearch๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์— ์ €์žฅํ•˜์—ฌ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ •์ œ๋œ ํœ˜๋ฐœ์œ ๋ฅผ ๋Œ€๊ทœ๋ชจ ์ €์žฅ์†Œ์— ํšจ์œจ์ ์œผ๋กœ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Kibana (๋ฐ์ดํ„ฐ ํƒ์ƒ‰ ๋ฐ ์‹œ๊ฐํ™”): Elasticsearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” Kibana ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง๊ด€์ ์œผ๋กœ ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Kibana์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„์™€ ์ฐจํŠธ๋ฅผ ํ†ตํ•ด ์‹œ๊ฐํ™”ํ•˜๋ฉฐ, ์ข…ํ•ฉ์ ์ธ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ํ•œ๋ˆˆ์— ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ ํœ˜๋ฐœ์œ ๋กœ ์ž๋™์ฐจ์˜ ์—”์ง„์„ ๊ตฌ๋™ํ•˜๊ณ , ์šด์ „์„ ๊ณ„๊ธฐํŒ์„ ํ†ตํ•ด ์ฐจ๋Ÿ‰์˜ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ELK ์Šคํƒ์˜ ์กฐํ•ฉ์€ ๋ถ„์‚ฐ๋œ ํ™˜๊ฒฝ์—์„œ ๋Œ€๊ทœ๋ชจ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ELK ์Šคํƒ์„ ์ง์ ‘ ๊ตฌ์ถ•ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹ค์ „ ์˜ˆ์ œ: ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ์‹œ๊ฐํ™” ๊ฐ€์ด๋“œ

์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ELK ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , Elasticsearch์— ์ €์žฅํ•œ ๋‹ค์Œ, Kibana๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์‹ค์ „ ์˜ˆ์ œ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋น„์ „๊ณต์ž๋„ ์‰ฝ๊ฒŒ ๋”ฐ๋ผ ํ•  ์ˆ˜ ์žˆ๋„๋ก Docker Compose๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ , ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

1. ์‚ฌ์ „ ์ค€๋น„: Docker ์„ค์น˜

์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ์— Docker์™€ Docker Compose๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์„ค์น˜๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”.

2. ELK ์Šคํƒ ํ™˜๊ฒฝ ์„ค์ • (docker-compose.yml)

์ƒˆ๋กœ์šด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  docker-compose.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ Elasticsearch, Kibana, Logstash ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ƒํ˜ธ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

# docker-compose.yml
version: '3.8' # Docker Compose ํŒŒ์ผ ํ˜•์‹ ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - xpack.security.enabled=false # ๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ ๋ณด์•ˆ ๋น„ํ™œ์„ฑํ™” (์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํ™œ์„ฑํ™”)
      - discovery.type=single-node # ๋‹จ์ผ ๋…ธ๋“œ ํ™˜๊ฒฝ ์„ค์ •
      - ES_JAVA_OPTS=-Xms512m -Xmx512m # Elasticsearch ํž™ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ • (์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฐ๋ผ ์กฐ์ ˆ)
    ports:
      - "9200:9200" # Elasticsearch HTTP API ํฌํŠธ
      - "9300:9300" # Elasticsearch TCP ํ†ต์‹  ํฌํŠธ
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data # ๋ฐ์ดํ„ฐ ์˜์†์„ฑ์„ ์œ„ํ•œ ๋ณผ๋ฅจ
    networks:
      - elk-network

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # Elasticsearch ์—ฐ๊ฒฐ ์ฃผ์†Œ
    ports:
      - "5601:5601" # Kibana ์›น UI ํฌํŠธ
    networks:
      - elk-network
    depends_on:
      - elasticsearch # Elasticsearch ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋จผ์ € ์‹œ์ž‘๋˜๋„๋ก ์„ค์ •

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    container_name: logstash
    environment:
      - xpack.monitoring.enabled=false # ๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„ํ™œ์„ฑํ™”
      - LS_JAVA_OPTS="-Xms256m -Xmx256m" # Logstash ํž™ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
    volumes:
      - ./logstash/config:/usr/share/logstash/config # Logstash ์„ค์ • ํŒŒ์ผ ๋งˆ์šดํŠธ
      - ./logstash/pipeline:/usr/share/logstash/pipeline # Logstash ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • ํŒŒ์ผ ๋งˆ์šดํŠธ
      - ./sample_logs:/usr/share/logstash/sample_logs # ์ƒ˜ํ”Œ ๋กœ๊ทธ ํŒŒ์ผ ๋งˆ์šดํŠธ
    networks:
      - elk-network
    ports:
      - "5044:5044" # Filebeat ๋“ฑ ์™ธ๋ถ€ ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ ์—ฐ๊ฒฐ ํฌํŠธ (์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ ์•ˆํ•จ)
    depends_on:
      - elasticsearch # Elasticsearch ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋จผ์ € ์‹œ์ž‘๋˜๋„๋ก ์„ค์ •

volumes:
  elasticsearch-data: # Elasticsearch ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ์ •์˜

networks:
  elk-network: # ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ ์ •์˜

์ฝ”๋“œ ์„ค๋ช…:

  • version: Docker Compose ํŒŒ์ผ ํ˜•์‹ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.
  • services: ์‹คํ–‰ํ•  ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • elasticsearch:
      • image: Elastic์‚ฌ์˜ ๊ณต์‹ Elasticsearch 8.11.0 ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • environment: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •. xpack.security.enabled=false๋Š” ๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณด์•ˆ ์„ค์ •์„ ๋ฐ˜๋“œ์‹œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. discovery.type=single-node๋Š” ๋‹จ์ผ ๋…ธ๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ports: ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ 9200 ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 9200 ํฌํŠธ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
      • volumes: elasticsearch-data๋ผ๋Š” Docker ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ Elasticsearch ๋ฐ์ดํ„ฐ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์œ ์ง€๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • kibana:
      • image: Kibana 8.11.0 ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • environment: ELASTICSEARCH_HOSTS๋ฅผ ์„ค์ •ํ•˜์—ฌ Kibana๊ฐ€ Elasticsearch ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. elasticsearch๋Š” Docker Compose ๋„คํŠธ์›Œํฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
      • ports: ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ 5601 ํฌํŠธ๋ฅผ Kibana ์›น UI ํฌํŠธ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
      • depends_on: Elasticsearch๊ฐ€ ๋จผ์ € ์‹œ์ž‘๋˜๋„๋ก ์˜์กด์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • logstash:
      • image: Logstash 8.11.0 ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • volumes:
        • ./logstash/config: ํ˜ธ์ŠคํŠธ์˜ logstash/config ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์„ค์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
        • ./logstash/pipeline: ํ˜ธ์ŠคํŠธ์˜ logstash/pipeline ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
        • ./sample_logs: ์˜ˆ์ œ ๋กœ๊ทธ ํŒŒ์ผ์„ Logstash ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•ด ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
      • depends_on: Elasticsearch๊ฐ€ ๋จผ์ € ์‹œ์ž‘๋˜๋„๋ก ์˜์กด์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • volumes: Docker ๋ณผ๋ฅจ์„ ์ •์˜ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • networks: ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

3. Logstash ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • (logstash/pipeline/logstash.conf)

docker-compose.yml ํŒŒ์ผ์ด ์žˆ๋Š” ๋™์ผํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— logstash ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— pipeline ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  logstash/pipeline ํด๋” ์•ˆ์— logstash.conf ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ Logstash๊ฐ€ ๋กœ๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# logstash/pipeline/logstash.conf
input {
  # ํ˜ธ์ŠคํŠธ์˜ ./sample_logs/web_access.log ํŒŒ์ผ์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
  # Logstash ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๊ฒฝ๋กœ: /usr/share/logstash/sample_logs/web_access.log
  file {
    path => "/usr/share/logstash/sample_logs/web_access.log"
    start_position => "beginning" # Logstash ์‹œ์ž‘ ์‹œ ํŒŒ์ผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ๊ธฐ
    sincedb_path => "/dev/null" # ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด sincedb (์ฝ์€ ์œ„์น˜ ๊ธฐ๋ก) ๋น„ํ™œ์„ฑํ™”
    codec => plain { charset => "UTF-8" } # ์ธ์ฝ”๋”ฉ ์„ค์ •
  }
}

filter {
  # ์›น ์„œ๋ฒ„ ๋กœ๊ทธ ํ˜•์‹์„ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: Apache Common Log Format)
  grok {
    match => { "message" => '%{IPORHOST:client_ip} %{HTTPUSERID:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:bytes_sent}' }
    # ํƒ€์ž„์Šคํƒฌํ”„ ํ•„๋“œ๋ฅผ Logstash ํ‘œ์ค€ @timestamp ํ•„๋“œ๋กœ ๋ณ€ํ™˜
    remove_field => ["@version"]
  }

  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] # ๊ทธ๋ก์œผ๋กœ ์ถ”์ถœํ•œ ํƒ€์ž„์Šคํƒฌํ”„ ํ˜•์‹ ์ง€์ •
    target => "@timestamp" # Logstash์˜ ๊ธฐ๋ณธ ํƒ€์ž„์Šคํƒฌํ”„ ํ•„๋“œ๋กœ ์„ค์ •
  }

  # ์ถ”์ถœ๋œ response_code์™€ bytes_sent๋ฅผ ๋ฌธ์ž์—ด์—์„œ ์ˆซ์ž๋กœ ๋ณ€ํ™˜
  mutate {
    convert => { "response_code" => "integer" }
    convert => { "bytes_sent" => "integer" }
  }

  # IP ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ์ง€๋ฆฌ ์ •๋ณด ์ถ”๊ฐ€ (์˜ต์…˜)
  # ์ฐธ๊ณ : ์ƒ˜ํ”Œ ๋กœ๊ทธ์— ์‚ฌ์šฉ๋œ 192.168.x.x ๋Œ€์—ญ์€ ์‚ฌ์„ค IP์ด๋ฏ€๋กœ, GeoIP ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  # ๊ณต์šฉ IP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ GeoIP ํ•„ํ„ฐ์˜ ํšจ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  geoip {
    source => "client_ip"
    target => "geoip"
  }
}

output {
  # Elasticsearch๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  elasticsearch {
    hosts => ["elasticsearch:9200"] # Elasticsearch ์ปจํ…Œ์ด๋„ˆ ์ฃผ์†Œ
    index => "web_access_logs-%{+YYYY.MM.dd}" # ๋‚ ์งœ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค ์ƒ์„ฑ
    # user => "elastic" # ๋ณด์•ˆ ํ™œ์„ฑํ™” ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด
    # password => "changeme" # ๋ณด์•ˆ ํ™œ์„ฑํ™” ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ
  }
  # ๊ฐœ๋ฐœ ๋ฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์ฝ˜์†”์—๋„ ์ถœ๋ ฅ
  stdout { codec => rubydebug }
}

์ฝ”๋“œ ์„ค๋ช…:

  • input ์„น์…˜:
    • file ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ web_access.log ํŒŒ์ผ์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
    • path: Logstash ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋กœ๊ทธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • start_position => "beginning": Logstash๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํŒŒ์ผ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋กœ๊ทธ๋ฅผ ์ฝ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (ํ…Œ์ŠคํŠธ์šฉ)
    • sincedb_path => "/dev/null": Logstash๊ฐ€ ํŒŒ์ผ์˜ ์–ด๋””๊นŒ์ง€ ์ฝ์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” sincedb ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.)
    • codec => plain { charset => "UTF-8" }: ์ธ์ฝ”๋”ฉ ์„ค์ •.
  • filter ์„น์…˜:
    • grok: ์›น ์„œ๋ฒ„์˜ Common Log Format๊ณผ ์œ ์‚ฌํ•œ ํŒจํ„ด์œผ๋กœ message ํ•„๋“œ๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค. IPORHOST, HTTPUSERID, HTTPDATE, WORD, URIPATHPARAM, NUMBER ๋“ฑ ๋ฏธ๋ฆฌ ์ •์˜๋œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ client_ip, method, request, response_code ๋“ฑ์˜ ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
    • date: grok์œผ๋กœ ์ถ”์ถœํ•œ timestamp ํ•„๋“œ๋ฅผ Logstash๊ฐ€ ์ธ์‹ํ•˜๋Š” ํ‘œ์ค€ ์‹œ๊ฐ„ ํ˜•์‹(@timestamp)์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Kibana์—์„œ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๋ฐ ์‹œ๊ฐํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • mutate: response_code์™€ bytes_sent ํ•„๋“œ์˜ ํƒ€์ž…์„ string์—์„œ integer๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ˆซ์ž ๊ธฐ๋ฐ˜์˜ ํ†ต๊ณ„ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • geoip: client_ip ํ•„๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ IP ์ฃผ์†Œ์˜ ์ง€๋ฆฌ์  ์œ„์น˜ ์ •๋ณด(๊ตญ๊ฐ€, ๋„์‹œ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‚˜์ค‘์— Kibana ์ง€๋„ ์‹œ๊ฐํ™”์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋‹จ, ์‚ฌ์„ค IP๋Š” ์ง€๋ฆฌ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
  • output ์„น์…˜:
    • elasticsearch: ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ Elasticsearch ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • hosts: Elasticsearch ์ปจํ…Œ์ด๋„ˆ์˜ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.
    • index: ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  Elasticsearch ์ธ๋ฑ์Šค ์ด๋ฆ„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. web_access_logs-%{+YYYY.MM.dd}๋Š” ๋งค์ผ ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: web_access_logs-2023.10.27).
    • stdout: ๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ Logstash๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋กœ๊ทธ๋ฅผ ํ„ฐ๋ฏธ๋„์—๋„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

4. ์ƒ˜ํ”Œ ๋กœ๊ทธ ํŒŒ์ผ ์ƒ์„ฑ (sample_logs/web_access.log)

logstash ํด๋”์™€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— sample_logs ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— web_access.log ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‚ด์šฉ์„ ํŒŒ์ผ์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.

# sample_logs/web_access.log
192.168.1.1 - admin [26/Oct/2023:10:05:01 +0900] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - guest [26/Oct/2023:10:05:05 +0900] "GET /products/category/electronics HTTP/1.1" 200 5678
192.168.1.3 - - [26/Oct/2023:10:05:10 +0900] "POST /api/order HTTP/1.1" 201 120
192.168.1.4 - user1 [26/Oct/2023:10:05:15 +0900] "GET /images/logo.png HTTP/1.1" 200 345
192.168.1.5 - admin [26/Oct/2023:10:05:20 +0900] "PUT /api/users/123 HTTP/1.1" 403 0
192.168.1.1 - guest [26/Oct/2023:10:05:25 +0900] "GET /contact.html HTTP/1.1" 200 987
192.168.1.6 - - [26/Oct/2023:10:05:30 +0900] "GET /nonexistent HTTP/1.1" 404 250
192.168.1.7 - user2 [26/Oct/2023:10:05:35 +0900] "GET /products/item/apple-watch HTTP/1.1" 200 7890
192.168.1.8 - - [26/Oct/2023:10:05:40 +0900] "GET /index.html HTTP/1.1" 200 1100
192.168.1.9 - user1 [26/Oct/2023:10:05:45 +0900] "GET /admin HTTP/1.1" 401 0
192.168.1.10 - guest [26/Oct/2023:10:05:50 +0900] "GET /about.html HTTP/1.1" 200 400

5. ELK ์Šคํƒ ์‹คํ–‰

๋ชจ๋“  ์„ค์ • ํŒŒ์ผ ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด, docker-compose.yml ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

docker compose up -d

์ด ๋ช…๋ น์–ด๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ Elasticsearch, Kibana, Logstash ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ๋ชจ๋‘ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋ช‡ ๋ถ„ ์ •๋„ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. docker compose ps ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. Kibana์—์„œ ๋กœ๊ทธ ์‹œ๊ฐํ™”ํ•˜๊ธฐ

  1. Kibana ์ ‘์†: ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:5601๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. Kibana UI๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ธ๋ฑ์Šค ํŒจํ„ด ์ƒ์„ฑ: Kibana ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ Stack Management -> Index Patterns๋กœ ์ด๋™ํ•œ ํ›„ Create index pattern ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    • Index pattern name ํ•„๋“œ์— web_access_logs-*๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. (Logstash์—์„œ ์„ค์ •ํ•œ ์ธ๋ฑ์Šค ํŒจํ„ด๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)
    • Next step์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    • Time field ๋“œ๋กญ๋‹ค์šด์—์„œ @timestamp๋ฅผ ์„ ํƒํ•˜๊ณ  Create index pattern์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๋กœ๊ทธ ํƒ์ƒ‰ (Discover): ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ Analytics -> Discover๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ œ Elasticsearch์— ์ €์žฅ๋œ ์›น ์ ‘๊ทผ ๋กœ๊ทธ๋“ค์ด ์‹œ๊ฐ„์ˆœ์œผ๋กœ ๋‚˜์—ด๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ ์‹œ๊ฐ„ ๋ฒ”์œ„ ์„ ํƒ๊ธฐ์—์„œ Last 15 minutes๋‚˜ Last 1 hour ๋“ฑ์œผ๋กœ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•˜์—ฌ ๋ชจ๋“  ๋กœ๊ทธ๊ฐ€ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ขŒ์ธก ํ•„๋“œ ๋ชฉ๋ก์—์„œ client_ip, response_code, request, method ๋“ฑ Logstash์—์„œ ์ถ”์ถœํ•œ ํ•„๋“œ๋“ค์ด ์ œ๋Œ€๋กœ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฐ„๋‹จํ•œ ์‹œ๊ฐํ™” ๊ตฌ์ถ• (Visualize):
    • ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ Analytics -> Visualize๋กœ ์ด๋™ํ•œ ํ›„ Create visualization์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    • Vertical bar ์ฐจํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • Source๋กœ web_access_logs-* ์ธ๋ฑ์Šค ํŒจํ„ด์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • Y-axis์— Count (๊ธฐ๋ณธ๊ฐ’)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์š”์ฒญ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • X-axis์— Date Histogram์„ ์„ ํƒํ•˜๊ณ  Field๋Š” @timestamp (๊ธฐ๋ณธ๊ฐ’)๋ฅผ, Interval์€ Auto๋‚˜ 1 minute๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์š”์ฒญ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • Response Code๋ณ„ ์š”์ฒญ ์ˆ˜:
      • Buckets ์„น์…˜์—์„œ Add๋ฅผ ํด๋ฆญํ•˜๊ณ  Split series๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      • Aggregation์„ Terms๋กœ ์„ค์ •ํ•˜๊ณ  Field๋ฅผ response_code.keyword๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • Order by๋Š” Term์œผ๋กœ, Size๋Š” 5๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • Update ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ๊ฐ ์‘๋‹ต ์ฝ”๋“œ(200, 404, 401 ๋“ฑ)๋ณ„ ์š”์ฒญ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ง‰๋Œ€ ์ฐจํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์œ ํ˜•์˜ ์‘๋‹ต์ด ๊ฐ€์žฅ ๋งŽ์€์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์š”์ฒญ ๋ฉ”์„œ๋“œ(GET, POST)๋ณ„ ๋ถ„ํฌ:
      • ์ƒˆ๋กœ์šด ์‹œ๊ฐํ™”๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ์‹œ๊ฐํ™”๋ฅผ ์ €์žฅํ•œ ํ›„ ๋‹ค์‹œ Create visualization์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      • Pie ์ฐจํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  web_access_logs-* ์ธ๋ฑ์Šค ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • Slice ๋ฒ„ํ‚ท์„ ์ถ”๊ฐ€ํ•˜๊ณ  Aggregation์„ Terms๋กœ, Field๋ฅผ method.keyword๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • Update๋ฅผ ํด๋ฆญํ•˜๋ฉด, GET, POST, PUT ๋“ฑ HTTP ๋ฉ”์„œ๋“œ๋ณ„ ์š”์ฒญ ๋ถ„ํฌ๋ฅผ ํŒŒ์ด ์ฐจํŠธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ (Dashboard):
    • ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ Analytics -> Dashboard๋กœ ์ด๋™ํ•œ ํ›„ Create dashboard๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    • Add an existing ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์‹œ๊ฐํ™”๋“ค์„ ๋Œ€์‹œ๋ณด๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹œ๊ฐํ™”๋“ค์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ ๋ชจ๋‹ˆํ„ฐ๋ง ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

7. ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ

์˜ˆ์ œ ์‹ค์Šต์„ ๋งˆ์ณค๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ELK ์Šคํƒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

docker compose down

docker compose down -v๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Elasticsearch ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ๊นŒ์ง€ ์‚ญ์ œ๋˜์–ด ๋‹ค์Œ ์‹คํ–‰ ์‹œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ Logstash๋กœ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ •์ œํ•˜๋ฉฐ, Elasticsearch์— ์ €์žฅํ•˜๊ณ , Kibana๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์˜ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ๋กœ๊ทธ ํ˜•์‹๊ณผ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒ ์ง€๋งŒ, ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ Observability: ํ™•์žฅ๋œ ํ™œ์šฉ ๋ฐฉ์•ˆ

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

Observability(๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ๋Š” ์‹œ์Šคํ…œ์˜ ์™ธ๋ถ€ ์ถœ๋ ฅ(๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค)์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฒ™๋„์ž…๋‹ˆ๋‹ค. ์ฆ‰, "์‹œ์Šคํ…œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€"๋ฅผ ๋‹จ์ˆœํžˆ '๋ชจ๋‹ˆํ„ฐ๋ง(Monitoring)'ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, "์™œ ๊ทธ๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€"๊นŒ์ง€ ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์ด '์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ์‹คํŒจ'์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ๋Š” '์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‹คํŒจ'๊นŒ์ง€๋„ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ๋Š” ์ฃผ๋กœ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ธฐ๋‘ฅ(Three Pillars) ์œ„์— ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค.

  1. ๋กœ๊ทธ (Logs):
    • ์ •์˜: ํŠน์ • ์‹œ์ ์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•œ ๋ถˆ๋ณ€์˜ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ. "์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€(What happened)".
    • ์—ญํ• : ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ƒ์„ธํ•œ ์ปจํ…์ŠคํŠธ์™€ ์›์ธ ํŒŒ์•…์„ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค, ์‚ฌ์šฉ์ž ID, ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ: Logstash์™€ Filebeat(๊ฒฝ๋Ÿ‰ ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ)๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘๋˜๊ณ  Elasticsearch์— ์ €์žฅ๋˜๋ฉฐ Kibana๋กœ ์‹œ๊ฐํ™”๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฉ”ํŠธ๋ฆญ (Metrics):
    • ์ •์˜: ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์‹œ์Šคํ…œ์˜ ์ธก์ • ๊ฐ€๋Šฅํ•œ ์ˆซ์ž ๋ฐ์ดํ„ฐ. "์–ผ๋งˆ๋‚˜ ์ž์ฃผ, ์–ผ๋งˆ๋‚˜ ๋งŽ์ด(How often, How much)".
    • ์—ญํ• : ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์˜ ์ „๋ฐ˜์ ์ธ ์ถ”์„ธ์™€ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. CPU ์‚ฌ์šฉ๋ฅ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ, ์š”์ฒญ ์ฒ˜๋ฆฌ๋Ÿ‰, ์—๋Ÿฌ์œจ ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ์™€ ๋‹ฌ๋ฆฌ ์ง‘๊ณ„๋œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์‹œ๊ณ„์—ด ๋ถ„์„์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ: Metricbeat(์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ), Heartbeat(์—…ํƒ€์ž„ ๋ชจ๋‹ˆํ„ฐ๋ง), APM(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”ํŠธ๋ฆญ)์„ ํ†ตํ•ด ์ˆ˜์ง‘๋˜๊ณ  Elasticsearch์— ์ €์žฅ๋˜๋ฉฐ Kibana์˜ ์‹œ๊ฐํ™” ๋„๊ตฌ๋กœ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ถ”์ด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠธ๋ ˆ์ด์Šค (Traces):
    • ์ •์˜: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋‹จ์ผ ์š”์ฒญ์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ „์ฒด ํ๋ฆ„์„ ์ถ”์ ํ•˜๋Š” ๋ฐ์ดํ„ฐ. "์–ด๋–ป๊ฒŒ ์ผ์–ด๋‚ฌ๋Š”์ง€(How it happened)".
    • ์—ญํ• : ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ๊ฑธ์ณ ๋ณต์žกํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ์š”์ฒญ์˜ ์ง€์—ฐ ์‹œ๊ฐ„, ๋ณ‘๋ชฉ ํ˜„์ƒ, ์˜ค๋ฅ˜ ์ง€์  ๋“ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ: Elastic APM(Application Performance Monitoring) ์—์ด์ „ํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘๋˜๊ณ  Elasticsearch์— ์ €์žฅ๋˜๋ฉฐ Kibana APM UI์—์„œ ์„œ๋น„์Šค ๋งต, ์ŠคํŒฌ ํŠธ๋ ˆ์ด์Šค ๋“ฑ์„ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ๊ธฐ๋‘ฅ์€ ์„œ๋กœ ๋ณด์™„์ ์ธ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ '๋ฌด์—‡์ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค'๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ , ํŠธ๋ ˆ์ด์Šค๋กœ '์–ด๋А ์„œ๋น„์Šค์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€'๋ฅผ ํŒŒ์•…ํ•˜๋ฉฐ, ๋กœ๊ทธ๋กœ '์™œ ๊ทธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€'์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์›์ธ์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ๊ณผ ํ†ตํ•ฉ Observability

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์€ ์ด๋Ÿฌํ•œ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ์˜ ์„ธ ๊ธฐ๋‘ฅ์„ ๋ชจ๋‘ ๋‹จ์ผ ํ”Œ๋žซํผ ๋‚ด์—์„œ ์ง€์›ํ•˜๊ณ  ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ELK ์Šคํƒ์œผ๋กœ ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ˆ˜์ง‘, ์ €์žฅ, ๋ถ„์„, ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์ด ์ œ๊ณตํ•˜๋Š” ํ†ตํ•ฉ Observability ๊ธฐ๋Šฅ:

  1. ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘:
    • Filebeat: ๋กœ๊ทธ ํŒŒ์ผ ์ˆ˜์ง‘.
    • Metricbeat: ์‹œ์Šคํ…œ, ๋„คํŠธ์›Œํฌ, ์„œ๋น„์Šค ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘.
    • Auditbeat: ๊ฐ์‚ฌ ๋กœ๊ทธ ๋ฐ ๋ณด์•ˆ ์ด๋ฒคํŠธ ์ˆ˜์ง‘.
    • Heartbeat: ์„œ๋น„์Šค ์—…ํƒ€์ž„(๊ฐ€๋™ ์‹œ๊ฐ„) ๋ชจ๋‹ˆํ„ฐ๋ง.
    • Elastic APM ์—์ด์ „ํŠธ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋ฐ ํŠธ๋ ˆ์ด์Šค ์ˆ˜์ง‘.
      ์ด๋Ÿฌํ•œ Beat ์—์ด์ „ํŠธ๋“ค์€ ๊ฒฝ๋Ÿ‰์ด๋ฉฐ ํšจ์œจ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ Logstash(ํ•„์š”์‹œ)๋ฅผ ๊ฑฐ์ณ Elasticsearch๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  2. ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋ถ„์„:
    • ๋ชจ๋“  ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค ๋ฐ์ดํ„ฐ๋Š” Elasticsearch์— ํ†ตํ•ฉ๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์ผ๋กœ(Silo) ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํ˜ธ ์—ฐ๊ด€ ์ง€์–ด ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์‹œ๊ฐ„๋Œ€์— CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰์ฆ(๋ฉ”ํŠธ๋ฆญ)ํ•œ ์‹œ์ ์— ์–ด๋–ค ์—๋Ÿฌ ๋กœ๊ทธ(๋กœ๊ทธ)๊ฐ€ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ฐœ์ƒํ–ˆ๊ณ , ๊ทธ ์—๋Ÿฌ๊ฐ€ ํŠน์ • ์„œ๋น„์Šค์˜ ์‘๋‹ต ์‹œ๊ฐ„ ์ง€์—ฐ(ํŠธ๋ ˆ์ด์Šค)์œผ๋กœ ์ด์–ด์กŒ๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ†ตํ•ฉ ์‹œ๊ฐํ™” ๋ฐ ๋Œ€์‹œ๋ณด๋“œ:
    • Kibana๋Š” ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, APM ํŠธ๋ ˆ์ด์Šค๋ฅผ ์œ„ํ•œ ์ „์šฉ UI์™€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํƒ์ƒ‰ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • Observability ๊ฐœ์š” ํŽ˜์ด์ง€: Kibana์˜ Observability ์„น์…˜์—์„œ๋Š” ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, APM ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ ํ™”๋ฉด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์ „๋ฐ˜์˜ ์ƒํƒœ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ง€์ ์—์„œ ๋“œ๋ฆด๋‹ค์šดํ•˜์—ฌ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • APM UI: ์„œ๋น„์Šค ๋งต์„ ํ†ตํ•ด ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์˜ ๊ด€๊ณ„์™€ ์„ฑ๋Šฅ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ๊ฐœ๋ณ„ ํŠธ๋žœ์žญ์…˜์˜ ์ƒ์„ธํ•œ ํŠธ๋ ˆ์ด์Šค ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ •ํ™•ํžˆ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
    • Uptime ๋ชจ๋‹ˆํ„ฐ๋ง: Heartbeat๋กœ ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์˜ ๊ฐ€์šฉ์„ฑ(์—…ํƒ€์ž„)์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋‹ค์šดํƒ€์ž„์„ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฐ•ํ™”๋œ ๋ณด์•ˆ ๊ธฐ๋Šฅ:
    • ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์€ SIEM(Security Information and Event Management) ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ๋ณด์•ˆ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘, ๋ถ„์„, ์‹œ๊ฐํ™”ํ•˜๊ณ  ์œ„ํ˜‘์„ ํƒ์ง€ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Auditbeat์™€ Filebeat๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘๋œ ๋ณด์•ˆ ๋กœ๊ทธ๋Š” Kibana Security UI์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„๋˜์–ด ์ž ์žฌ์ ์ธ ๊ณต๊ฒฉ ์‹œ๋„๋‚˜ ๋น„์ •์ƒ์ ์ธ ํ–‰๋™์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก : ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ, ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ ์ธ ์‹œ์Šคํ…œ ์šด์˜์„ ์œ„ํ•œ ํ•ต์‹ฌ ์„ ํƒ

์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ๋ถ„์„์„ ํฌํ•จํ•œ ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์€ ๋‹จ์ˆœํ•œ ๋กœ๊ทธ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ๋„˜์–ด, ํ˜„๋Œ€์ ์ด๊ณ  ๋ณต์žกํ•œ IT ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ํ†ตํ•ฉ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ณ , ์„ ์ œ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉฐ, ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์‹ ์†ํ•˜๊ฒŒ ์›์ธ์„ ํŒŒ์•…ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋Šฅ๋ ฅ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

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

์ง€๊ธˆ ๋ฐ”๋กœ ์—˜๋ผ์Šคํ‹ฑ ์Šคํƒ์„ ์‹œ์ž‘ํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ์ด ๋“ค๋ ค์ฃผ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๊ฒฝ์ฒญํ•˜๊ณ , ๋” ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ๋””์ง€ํ„ธ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.


๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€