ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ผ์คํฑ ์คํ ๊ธฐ๋ฐ์ ๋ก๊ทธ ๋ถ์: ๋น์ ๊ณต์๋ถํฐ ์ ๋ฌธ๊ฐ๊น์ง, ํต์ฌ ๊ฐ์ด๋
Code Brewer 2026. 1. 24. 15:00๐ก ์๋ก : ๋์งํธ ์๋์ ํ์ , ๋ก๊ทธ (Log)
์ฐ๋ฆฌ๊ฐ ์ด์๊ฐ๋ ๋์งํธ ์ธ์์ ๋ง์น ๊ฑฐ๋ํ ๋์์ ๊ฐ์ต๋๋ค. ์๋ง์ ์์คํ ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํ๊ฒ ์ฝํ ์ํธ์์ฉํ๋ฉฐ ๋์์์ด ์ ๋ณด๋ฅผ ์์ฐํด๋ ๋๋ค. ์น์ฌ์ดํธ์ ์ ์ํ๊ณ , ๋ชจ๋ฐ์ผ ์ฑ์ ์ฌ์ฉํ๋ฉฐ, ํด๋ผ์ฐ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๋ ์ด ๋ชจ๋ ๊ณผ์ ์ ๋์ ๋ณด์ด์ง ์๋ ๋์งํธ ํ์ ์ ๋จ๊น๋๋ค. ์ฐ๋ฆฌ๋ ์ด ํ์ ๋ค์ ๋ก๊ทธ(Log)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๋ก๊ทธ๋ ์์คํ ์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ด๋ฒคํธ์ ๊ธฐ๋ก์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์๋ฒ์ ์ฌ์ฉ์๊ฐ ์ ์ํ ์๊ฐ, ์ด๋ค ํ์ด์ง๋ฅผ ์์ฒญํ๋์ง, ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋์ง ์คํจํ๋์ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ด๋ค ์ฟผ๋ฆฌ๊ฐ ์คํ๋์๋์ง ๋ฑ, ๋ง ๊ทธ๋๋ก '๋ฐ์ํ๋ ์ผ'์ ๋ํ ์๊ณ์ด ๊ธฐ๋ก์ ๋๋ค. ์ด ๋ก๊ทธ๋ค์ ๋จ์ํ ํ ์คํธ ํ์ผ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฌ์ค์ ์์คํ ์ ๊ฑด๊ฐ ์ํ๋ฅผ ์ง๋จํ๊ณ , ๋ฌธ์ ์ ์์ธ์ ํ์ ํ๋ฉฐ, ์ฌ์ง์ด๋ ๋ฏธ๋๋ฅผ ์์ธกํ๋ ๋ฐ ํ์ํ ๊ท์คํ ์ ๋ณด์์ ๋๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ ์ด๋ฌํ ๋ก๊ทธ์ ์์ด ์ด๋ง์ด๋งํ๋ค๋ ๊ฒ์ ๋๋ค. ํ๋์ ๋ณต์กํ ์์คํ ์์๋ ๋จ ๋ช ์๊ฐ ๋ง์ ์ ๊ธฐ๊ฐ๋ฐ์ดํธ์์ ์ ํ ๋ผ๋ฐ์ดํธ์ ๋ฌํ๋ ๋ก๊ทธ๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋ฐฉ๋ํ๊ณ ๋ฌด์ง์ํ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋ถ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์ต๋๋ค. ๋ง์น ๊ฑฐ๋ํ ๋์๊ด์์ ์ํ๋ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ชจ๋ ์ฑ ์ ์ผ์ผ์ด ํผ์ณ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ๋ฐฐ๊ฒฝ์์ ์๋ผ์คํฑ ์คํ(Elastic Stack) ๊ธฐ๋ฐ์ ๋ก๊ทธ ์์คํ ์ ๋จ์ํ ๋ก๊ทธ ํ์ผ์ ๋์ด, ์ด ๊ฑฐ๋ํ ๋ฐ์ดํฐ ์์์ ์๋ฏธ ์๋ ํต์ฐฐ๋ ฅ์ ์ฐพ์๋ด๊ณ ์์คํ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ผ๋ก ๋ฑ์ฅํ์ต๋๋ค.
๋น์ ๊ณต์๋ถํฐ ํ์ ๊ฐ๋ฐ์๊น์ง, ์ด ๊ธ์ ํตํด ์๋ผ์คํฑ ์คํ ๊ธฐ๋ฐ์ ๋ก๊ทธ ๋ถ์์ด ๋ฌด์์ธ์ง, ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง์ ๋ํ ํต์ฌ ๋ด์ฉ์ ์ฝ๊ณ ๋ช ํํ๊ฒ ์ดํดํ์ค ์ ์๋๋ก ์๋ดํ๊ฒ ์ต๋๋ค.

์๋ผ์คํฑ ์คํ ๊ธฐ๋ฐ์ ๋ก๊ทธ ๋ถ์์ด๋ ๋ฌด์์ธ๊ฐ? ๊ธฐ๋ณธ ๊ฐ๋ ๋ฐ ์ค์์ฑ
๋ก๊ทธ(Log)์ ๋ณธ์ง๊ณผ ์์คํ ์ด์์ ํ์ ์์
๋ก๊ทธ(Log)๋ ๋ชจ๋ ์ปดํจํฐ ์์คํ , ์ ํ๋ฆฌ์ผ์ด์ , ๋คํธ์ํฌ ์ฅ์น์์ ๋ฐ์ํ๋ ์ฌ๊ฑด(event)์ ๋์งํธ ๊ธฐ๋ก์ ๋๋ค. ์ฝ๊ฒ ๋น์ ํ์๋ฉด, ๋ง์น ํญ๊ณต๊ธฐ์ '๋ธ๋๋ฐ์ค'๋ ๊ฑด๋ฌผ์ '๋ณด์ ๊ฐ์ ์นด๋ฉ๋ผ ๊ธฐ๋ก'๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ค ์ผ์ด ์ธ์ , ์ด๋์, ๋๊ตฌ์ ์ํด, ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ด ์ฆ๊ฒจ ์ฌ์ฉํ๋ ์น์ฌ์ดํธ์ ์ ์ํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์ด ์งง์ ์๊ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค.
- ์น ์๋ฒ ๋ก๊ทธ: "์ฌ์ฉ์ [IP ์ฃผ์]๊ฐ [์๊ฐ]์ [์นํ์ด์ง ์ฃผ์]๋ฅผ ์์ฒญํ๋ค."
- ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ: "์ฌ์ฉ์ [ID]๊ฐ [์๊ฐ]์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ค."
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊ทธ: "[์ฌ์ฉ์ ID]์ ์์ฒญ์ ๋ฐ๋ผ [ํน์ ๋ฐ์ดํฐ]๋ฅผ ์กฐํํ๋ค."
- ๋ณด์ ๋ก๊ทธ: "์ ์ ์๋ IP์์ [์๊ฐ]์ ๋ก๊ทธ์ธ ์๋ 5ํ ์คํจ."
์ด์ฒ๋ผ ๋ก๊ทธ๋ ์์คํ ์ ์ฌ์ฅ ๋ฐ๋๊ณผ ๊ฐ์์, ์์คํ ์ ๋ชจ๋ ํ๋์ ํฌ๋ช ํ๊ฒ ๊ธฐ๋กํฉ๋๋ค. ์ด ๊ธฐ๋ก์ด ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์์คํ ๋ด๋ถ์์ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ์ ํ ์ ์ ์์ ๊ฒ์ ๋๋ค.
์ ๋ก๊ทธ ๋ถ์์ด ํ์ํ๊ฐ? ์ ํต์ ์ธ ๋ฐฉ์์ ํ๊ณ
๊ทธ๋ ๋ค๋ฉด ์ด๋ ๊ฒ ์ค์ํ ๋ก๊ทธ๋ฅผ ์ ๋ถ์ํด์ผ ํ ๊น์? ๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์ ๋ฐฉ์์ผ๋ก๋ ๋ฌด์์ด ๋ถ์กฑํ์๊น์?
- ๋ฌธ์ ํด๊ฒฐ (Troubleshooting) ๋ฐ ์ฅ์ ์ง๋จ: ์์คํ ์์ ๊ฐ์์ค๋ฌ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋, ๋ก๊ทธ๋ ๋ฌธ์ ์ ์์ธ์ ์ฐพ์๋ด๋ ๊ฐ์ฅ ์ค์ํ ๋จ์์ ๋๋ค. "์ด๋ค ์์ ์, ์ด๋ค ์๋น์ค์์, ์ด๋ค ์ข ๋ฅ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง"๋ฅผ ๋ก๊ทธ๋ฅผ ํตํด ํ์ ํ๊ณ , ์ฌ๋ฌ ์์คํ ์ ๋ก๊ทธ๋ฅผ ์ํธ ๋น๊ตํจ์ผ๋ก์จ ๋ณต์กํ ๋ถ์ฐ ํ๊ฒฝ์์์ ๋ฌธ์ ๋ ์ ์ํ๊ฒ ์ง๋จํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์น์ฌ์ดํธ๊ฐ ๋๋ ค์ก์ ๋, ๋ก๊ทธ๋ฅผ ๋ถ์ํ๋ฉด ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๊ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋, ํน์ API ํธ์ถ์ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ์์ ์์๋ผ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ์ต์ ํ: ๋ก๊ทธ๋ ์์คํ ์ ์ฑ๋ฅ ์งํ๋ฅผ ๊ฐ์ ์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ, ์๋ต ์๊ฐ, ์์ ์ฌ์ฉ๋ ๋ฑ์ ๋ํ ์ ๋ณด๋ฅผ ํตํด ์์คํ ์ ๋ณ๋ชฉ ๊ตฌ๊ฐ์ ์๋ณํ๊ณ , ์ฑ๋ฅ ์ ํ์ ์งํ๋ฅผ ์กฐ๊ธฐ์ ๊ฐ์งํ์ฌ ์ ์ ์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค. "ํ์๋ณด๋ค ํน์ API์ ์๋ต ์๊ฐ์ด 2๋ฐฐ ๊ธธ์ด์ก๋ค"๋ ์ ๋ณด๋ฅผ ๋ก๊ทธ์์ ๋ฐ๊ฒฌํ๋ค๋ฉด, ํฐ ์ฅ์ ๋ก ์ด์ด์ง๊ธฐ ์ ์ ์์คํ ์ ๊ฐ์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ป๋ ๊ฒ์ ๋๋ค.
- ๋ณด์ ๊ฐ์ฌ ๋ฐ ์ํ ํ์ง: ๋ชจ๋ ๋ก๊ทธ์ธ ์๋, ํ์ผ ์ ๊ทผ, ์์คํ ์ค์ ๋ณ๊ฒฝ ๋ฑ์ ๋ก๊ทธ๋ก ๊ธฐ๋ก๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋น์ ์์ ์ธ ์ ๊ทผ ํจํด์ด๋ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ํ์งํ ์ ์์ต๋๋ค. "๊ฐ์๊ธฐ ํด์ธ IP์์ ์๋ฒฝ 3์์ ๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ์๋๊ฐ 100ํ ๋ฐ์ํ๋ค"๋ ๋ก๊ทธ๋ ์ฌ๊ฐํ ๋ณด์ ์นจํด์ ์ ํธ์ผ ์ ์์ต๋๋ค.
- ๋น์ฆ๋์ค ์ธ์ฌ์ดํธ ๋์ถ: ๋ก๊ทธ๋ 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์ ์ ๊ธฐ์ ์ธ ์๋ ๋ฐฉ์
์ด ์ธ ๊ฐ์ง ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ธฐ์ ์ผ๋ก ํ๋ ฅํ์ฌ ์์ ํ ๋ก๊ทธ ๋ถ์ ์์คํ ์ ๊ตฌ์ถํฉ๋๋ค.
- Logstash (๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ ): ๊ฐ ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํฉ๋๋ค. ์์ง๋ ๋ฐ์ดํฐ๋ Logstash์ ํํฐ๋ง ๊ธฐ๋ฅ์ ํตํด ํ์ํ ์ ๋ณด๋ง ์ถ์ถํ๊ณ , ์ผ๊ด๋ ํ์์ผ๋ก ์ ๊ทํ๋๋ฉฐ, ๋ถํ์ํ ์ ๋ณด๋ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ง์น ์์ ๋ฅผ ์ ์ ํ์ฌ ํ๋ฐ์ , ๊ฒฝ์ ๋ฑ์ผ๋ก ๋๋๋ ๊ณผ์ ๊ณผ ๊ฐ์ต๋๋ค.
- Elasticsearch (๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ฒ์): Logstash๋ฅผ ํตํด ์ ์ ๋ ๋ฐ์ดํฐ๋ Elasticsearch๋ก ์ ์ก๋์ด ํจ์จ์ ์ธ ๊ฒ์๊ณผ ๋ถ์์ ์ํด ์ธ๋ฑ์ฑ๋ฉ๋๋ค. Elasticsearch๋ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ํ๊ฒฝ์ ์ ์ฅํ์ฌ ๋๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋น ๋ฅธ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ ์ ๋ ํ๋ฐ์ ๋ฅผ ๋๊ท๋ชจ ์ ์ฅ์์ ํจ์จ์ ์ผ๋ก ๋ณด๊ดํ๋ ๊ฒ์ ๋น์ ํ ์ ์์ต๋๋ค.
- Kibana (๋ฐ์ดํฐ ํ์ ๋ฐ ์๊ฐํ): Elasticsearch์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ Kibana ์น ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ์ง๊ด์ ์ผ๋ก ์ ์๋ฉ๋๋ค. ์ฌ์ฉ์๋ Kibana์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ , ๋ค์ํ ๊ทธ๋ํ์ ์ฐจํธ๋ฅผ ํตํด ์๊ฐํํ๋ฉฐ, ์ข ํฉ์ ์ธ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ์ฌ ์์คํ ์ ์ํ๋ฅผ ํ๋์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ๋ง์น ํ๋ฐ์ ๋ก ์๋์ฐจ์ ์์ง์ ๊ตฌ๋ํ๊ณ , ์ด์ ์ ๊ณ๊ธฐํ์ ํตํด ์ฐจ๋์ ์ํ๋ฅผ ํ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฌํ ELK ์คํ์ ์กฐํฉ์ ๋ถ์ฐ๋ ํ๊ฒฝ์์ ๋๊ท๋ชจ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ถ์ํ๋ ๋ฐ ์์ด ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ๋ค์ ์น์ ์์๋ ์ด ELK ์คํ์ ์ง์ ๊ตฌ์ถํ๊ณ ๋ก๊ทธ๋ฅผ ์๊ฐํํ๋ ๊ฐ๋จํ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ค์ ์์ : ์๋ผ์คํฑ ์คํ ๊ธฐ๋ฐ์ ๋ก๊ทธ ์์ง ๋ฐ ์๊ฐํ ๊ฐ์ด๋
์ด๋ฒ ์น์ ์์๋ ELK ์คํ์ ํ์ฉํ์ฌ ์ค์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , Elasticsearch์ ์ ์ฅํ ๋ค์, Kibana๋ก ์๊ฐํํ๋ ๊ฐ๋จํ ์ค์ ์์ ๋ฅผ ์๊ฐํฉ๋๋ค. ๋น์ ๊ณต์๋ ์ฝ๊ฒ ๋ฐ๋ผ ํ ์ ์๋๋ก Docker Compose๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒฝ์ ๊ตฌ์ถํ๊ณ , ๊ฐ๋จํ ์น ์๋ฒ ๋ก๊ทธ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์งํํ๊ฒ ์ต๋๋ค.
1. ์ฌ์ ์ค๋น: Docker ์ค์น
์ด ์์ ๋ฅผ ์คํํ๋ ค๋ฉด ์ฌ๋ฌ๋ถ์ ์์คํ ์ Docker์ Docker Compose๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. ์์ง ์ค์น๋์ง ์์๋ค๋ฉด, ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ค์น๋ฅผ ์งํํด์ฃผ์ธ์.
- Docker ์ค์น ๊ฐ์ด๋: https://docs.docker.com/get-docker/
- Docker Compose ์ค์น ๊ฐ์ด๋: https://docs.docker.com/compose/install/
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์์ ๋ก๊ทธ ์๊ฐํํ๊ธฐ
- Kibana ์ ์: ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ
http://localhost:5601๋ก ์ ์ํฉ๋๋ค. Kibana UI๊ฐ ๋ํ๋ ๊ฒ์ ๋๋ค. - ์ธ๋ฑ์ค ํจํด ์์ฑ: Kibana ์ผ์ชฝ ๋ฉ๋ด์์
Stack Management->Index Patterns๋ก ์ด๋ํ ํCreate index pattern๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.Index pattern nameํ๋์web_access_logs-*๋ฅผ ์ ๋ ฅํฉ๋๋ค. (Logstash์์ ์ค์ ํ ์ธ๋ฑ์ค ํจํด๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.)Next step์ ํด๋ฆญํฉ๋๋ค.Time field๋๋กญ๋ค์ด์์@timestamp๋ฅผ ์ ํํ๊ณCreate index pattern์ ํด๋ฆญํฉ๋๋ค.
- ๋ก๊ทธ ํ์ (Discover): ์ผ์ชฝ ๋ฉ๋ด์์
Analytics->Discover๋ก ์ด๋ํฉ๋๋ค.- ์ด์ Elasticsearch์ ์ ์ฅ๋ ์น ์ ๊ทผ ๋ก๊ทธ๋ค์ด ์๊ฐ์์ผ๋ก ๋์ด๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- ์ค๋ฅธ์ชฝ ์๋จ์ ์๊ฐ ๋ฒ์ ์ ํ๊ธฐ์์
Last 15 minutes๋Last 1 hour๋ฑ์ผ๋ก ์๊ฐ์ ์กฐ์ ํ์ฌ ๋ชจ๋ ๋ก๊ทธ๊ฐ ๋ณด์ด๋๋ก ํ ์ ์์ต๋๋ค. - ์ข์ธก ํ๋ ๋ชฉ๋ก์์
client_ip,response_code,request,method๋ฑ Logstash์์ ์ถ์ถํ ํ๋๋ค์ด ์ ๋๋ก ๋ณด์ด๋์ง ํ์ธํฉ๋๋ค.
- ๊ฐ๋จํ ์๊ฐํ ๊ตฌ์ถ (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 ๋ฉ์๋๋ณ ์์ฒญ ๋ถํฌ๋ฅผ ํ์ด ์ฐจํธ๋ก ๋ณผ ์ ์์ต๋๋ค.
- ์๋ก์ด ์๊ฐํ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ์๊ฐํ๋ฅผ ์ ์ฅํ ํ ๋ค์
- ์ผ์ชฝ ๋ฉ๋ด์์
- ๋์๋ณด๋ ์์ฑ (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) ์์ ๊ตฌ์ถ๋ฉ๋๋ค.
- ๋ก๊ทธ (Logs):
- ์ ์: ํน์ ์์ ์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ ๋ถ๋ณ์ ์๊ณ์ด ๋ฐ์ดํฐ. "์ด๋ค ์ผ์ด ์ผ์ด๋ฌ๋์ง(What happened)".
- ์ญํ : ๋ฌธ์ ๋ฐ์ ์ ์์ธํ ์ปจํ ์คํธ์ ์์ธ ํ์ ์ ์ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง, ์คํ ํธ๋ ์ด์ค, ์ฌ์ฉ์ ID, ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
- ์๋ผ์คํฑ ์คํ: Logstash์ Filebeat(๊ฒฝ๋ ๋ก๊ทธ ์์ง๊ธฐ)๋ฅผ ํตํด ์์ง๋๊ณ Elasticsearch์ ์ ์ฅ๋๋ฉฐ Kibana๋ก ์๊ฐํ๋ฉ๋๋ค.
- ๋ฉํธ๋ฆญ (Metrics):
- ์ ์: ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์์คํ ์ ์ธก์ ๊ฐ๋ฅํ ์ซ์ ๋ฐ์ดํฐ. "์ผ๋ง๋ ์์ฃผ, ์ผ๋ง๋ ๋ง์ด(How often, How much)".
- ์ญํ : ์์คํ ์ฑ๋ฅ์ ์ ๋ฐ์ ์ธ ์ถ์ธ์ ์ํ๋ฅผ ํ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. CPU ์ฌ์ฉ๋ฅ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋คํธ์ํฌ ํธ๋ํฝ, ์์ฒญ ์ฒ๋ฆฌ๋, ์๋ฌ์จ ๋ฑ์ด ๋ํ์ ์ ๋๋ค. ๋ก๊ทธ์ ๋ฌ๋ฆฌ ์ง๊ณ๋ ํํ๋ก ์ ์ฅ๋์ด ์๊ณ์ด ๋ถ์์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ์๋ผ์คํฑ ์คํ: Metricbeat(์์คํ ๋ฉํธ๋ฆญ), Heartbeat(์ ํ์ ๋ชจ๋ํฐ๋ง), APM(์ ํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ)์ ํตํด ์์ง๋๊ณ Elasticsearch์ ์ ์ฅ๋๋ฉฐ Kibana์ ์๊ฐํ ๋๊ตฌ๋ก ๋์๋ณด๋์์ ์ถ์ด๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ํธ๋ ์ด์ค (Traces):
- ์ ์: ๋ถ์ฐ ์์คํ ๋ด์์ ๋จ์ผ ์์ฒญ์ ์์๋ถํฐ ๋๊น์ง ์ ์ฒด ํ๋ฆ์ ์ถ์ ํ๋ ๋ฐ์ดํฐ. "์ด๋ป๊ฒ ์ผ์ด๋ฌ๋์ง(How it happened)".
- ์ญํ : ์ฌ๋ฌ ์๋น์ค์ ๊ฑธ์ณ ๋ณต์กํ๊ฒ ์ฒ๋ฆฌ๋๋ ์์ฒญ์ ์ง์ฐ ์๊ฐ, ๋ณ๋ชฉ ํ์, ์ค๋ฅ ์ง์ ๋ฑ์ ์๊ฐ์ ์ผ๋ก ํ์ ํ๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์ ๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ํนํ ์ค์ํฉ๋๋ค.
- ์๋ผ์คํฑ ์คํ: Elastic APM(Application Performance Monitoring) ์์ด์ ํธ๋ฅผ ํตํด ์์ง๋๊ณ Elasticsearch์ ์ ์ฅ๋๋ฉฐ Kibana APM UI์์ ์๋น์ค ๋งต, ์คํฌ ํธ๋ ์ด์ค ๋ฑ์ ์๊ฐํํฉ๋๋ค.
์ด ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์ ์๋ก ๋ณด์์ ์ธ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ค. ๋ฉํธ๋ฆญ์ผ๋ก '๋ฌด์์ธ๊ฐ ์๋ชป๋์๋ค'๋ ๊ฒ์ ๊ฐ์งํ๊ณ , ํธ๋ ์ด์ค๋ก '์ด๋ ์๋น์ค์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง'๋ฅผ ํ์ ํ๋ฉฐ, ๋ก๊ทธ๋ก '์ ๊ทธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง'์ ๋ํ ์์ธํ ์์ธ์ ๋ถ์ํ๋ ๊ฒ์ ๋๋ค.
์๋ผ์คํฑ ์คํ๊ณผ ํตํฉ Observability
์๋ผ์คํฑ ์คํ์ ์ด๋ฌํ ์ต์ ๋ฒ๋น๋ฆฌํฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ชจ๋ ๋จ์ผ ํ๋ซํผ ๋ด์์ ์ง์ํ๊ณ ํตํฉํฉ๋๋ค. ์ฆ, ํ๋์ ELK ์คํ์ผ๋ก ๋ก๊ทธ, ๋ฉํธ๋ฆญ, ํธ๋ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์์ง, ์ ์ฅ, ๋ถ์, ์๊ฐํํ ์ ์์ต๋๋ค.
์๋ผ์คํฑ ์คํ์ด ์ ๊ณตํ๋ ํตํฉ Observability ๊ธฐ๋ฅ:
- ํตํฉ ๋ฐ์ดํฐ ์์ง:
- Filebeat: ๋ก๊ทธ ํ์ผ ์์ง.
- Metricbeat: ์์คํ , ๋คํธ์ํฌ, ์๋น์ค ๋ฉํธ๋ฆญ ์์ง.
- Auditbeat: ๊ฐ์ฌ ๋ก๊ทธ ๋ฐ ๋ณด์ ์ด๋ฒคํธ ์์ง.
- Heartbeat: ์๋น์ค ์ ํ์(๊ฐ๋ ์๊ฐ) ๋ชจ๋ํฐ๋ง.
- Elastic APM ์์ด์ ํธ: ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ ์งํ ๋ฐ ํธ๋ ์ด์ค ์์ง.
์ด๋ฌํ Beat ์์ด์ ํธ๋ค์ ๊ฒฝ๋์ด๋ฉฐ ํจ์จ์ ์ผ๋ก ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ Logstash(ํ์์)๋ฅผ ๊ฑฐ์ณ Elasticsearch๋ก ์ ์กํฉ๋๋ค.
- ํตํฉ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๋ถ์:
- ๋ชจ๋ ๋ก๊ทธ, ๋ฉํธ๋ฆญ, ํธ๋ ์ด์ค ๋ฐ์ดํฐ๋ Elasticsearch์ ํตํฉ๋์ด ์ ์ฅ๋ฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ฌ์ผ๋ก(Silo) ํ์์ ๋ฐฉ์งํ๊ณ , ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธ ์ฐ๊ด ์ง์ด ๋ถ์ํ ์ ์๋ ๊ธฐ๋ฐ์ ๋ง๋ จํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์๊ฐ๋์ CPU ์ฌ์ฉ๋์ด ๊ธ์ฆ(๋ฉํธ๋ฆญ)ํ ์์ ์ ์ด๋ค ์๋ฌ ๋ก๊ทธ(๋ก๊ทธ)๊ฐ ๋๋์ผ๋ก ๋ฐ์ํ๊ณ , ๊ทธ ์๋ฌ๊ฐ ํน์ ์๋น์ค์ ์๋ต ์๊ฐ ์ง์ฐ(ํธ๋ ์ด์ค)์ผ๋ก ์ด์ด์ก๋์ง ํ๋์ ํ์ ํ ์ ์์ต๋๋ค.
- ํตํฉ ์๊ฐํ ๋ฐ ๋์๋ณด๋:
- Kibana๋ ๋ก๊ทธ, ๋ฉํธ๋ฆญ, APM ํธ๋ ์ด์ค๋ฅผ ์ํ ์ ์ฉ UI์ ๋์๋ณด๋๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ์ธํฐํ์ด์ค์์ ํ์ํ๊ณ ์๊ฐํํ ์ ์๋๋ก ํฉ๋๋ค.
- Observability ๊ฐ์ ํ์ด์ง: Kibana์ Observability ์น์ ์์๋ ๋ก๊ทธ, ๋ฉํธ๋ฆญ, APM ๋ฐ์ดํฐ๋ฅผ ํ๋์ ํตํฉ๋ ํ๋ฉด์์ ๋ณผ ์ ์๋ ๋์๋ณด๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์คํ ์ ๋ฐ์ ์ํ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ ํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ง์ ์์ ๋๋ฆด๋ค์ดํ์ฌ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- APM UI: ์๋น์ค ๋งต์ ํตํด ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ๊ด๊ณ์ ์ฑ๋ฅ์ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ , ๊ฐ๋ณ ํธ๋์ญ์ ์ ์์ธํ ํธ๋ ์ด์ค ์ ๋ณด๋ฅผ ๋ถ์ํ์ฌ ๋ณ๋ชฉ ์ง์ ์ ์ ํํ ์ฐพ์๋ ๋๋ค.
- Uptime ๋ชจ๋ํฐ๋ง: Heartbeat๋ก ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ํตํด ์๋น์ค์ ๊ฐ์ฉ์ฑ(์ ํ์)์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๋ค์ดํ์์ ์๊ฐํํฉ๋๋ค.
- ๊ฐํ๋ ๋ณด์ ๊ธฐ๋ฅ:
- ์๋ผ์คํฑ ์คํ์ SIEM(Security Information and Event Management) ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ๋ณด์ ๋ก๊ทธ๋ฅผ ์์ง, ๋ถ์, ์๊ฐํํ๊ณ ์ํ์ ํ์งํ๋ ๋ฐ ํ์ฉ๋ ์ ์์ต๋๋ค. Auditbeat์ Filebeat๋ฅผ ํตํด ์์ง๋ ๋ณด์ ๋ก๊ทธ๋ Kibana Security UI์์ ์ค์๊ฐ์ผ๋ก ๋ถ์๋์ด ์ ์ฌ์ ์ธ ๊ณต๊ฒฉ ์๋๋ ๋น์ ์์ ์ธ ํ๋์ ์๋ณํฉ๋๋ค.
๊ฒฐ๋ก : ์๋ผ์คํฑ ์คํ, ๋ฏธ๋ ์งํฅ์ ์ธ ์์คํ ์ด์์ ์ํ ํต์ฌ ์ ํ
์๋ผ์คํฑ ์คํ ๊ธฐ๋ฐ์ ๋ก๊ทธ ๋ถ์์ ํฌํจํ ์๋ผ์คํฑ ์คํ์ ๋จ์ํ ๋ก๊ทธ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ๋์ด, ํ๋์ ์ด๊ณ ๋ณต์กํ IT ์์คํ ์ ์ํ ํตํฉ ์ต์ ๋ฒ๋น๋ฆฌํฐ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค. ๋ก๊ทธ, ๋ฉํธ๋ฆญ, ํธ๋ ์ด์ค๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ์์คํ ์ ์ ๋ฐ์ ์ธ ๊ฑด๊ฐ ์ํ๋ฅผ ๊น์ด ์๊ฒ ์ดํดํ๊ณ , ์ ์ ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๋ฉฐ, ์ฅ์ ๋ฐ์ ์ ์ ์ํ๊ฒ ์์ธ์ ํ์ ํ์ฌ ํด๊ฒฐํ ์ ์๋ ๊ฐ๋ ฅํ ๋ฅ๋ ฅ์ ๋ถ์ฌํฉ๋๋ค.
ํด๋ผ์ฐ๋ ํ๊ฒฝ, ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ, ์ปจํ ์ด๋ ๊ธฐ์ ์ด ๋ณดํธํ๋ ์ค๋๋ , ์์คํ ์ ํฌ๋ช ์ฑ์ ํ๋ณดํ๊ณ ์ด์ ํจ์จ์ฑ์ ๊ทน๋ํํ๋ ๊ฒ์ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ค์ํฉ๋๋ค. ์๋ผ์คํฑ ์คํ์ ์ด๋ฌํ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํค๋ฉฐ, ๋น์ ๊ณต์๋ถํฐ ์ ๋ฌธ๊ฐ๊น์ง ๋ชจ๋ IT ๊ด๊ณ์๊ฐ ์์คํ ์ ๋ ์ ์ดํดํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ๋๋ ๋ฏธ๋ ์งํฅ์ ์ธ ์๋ฃจ์ ์ ๋๋ค.
์ง๊ธ ๋ฐ๋ก ์๋ผ์คํฑ ์คํ์ ์์ํ์ฌ ์ฌ๋ฌ๋ถ์ ์์คํ ์ด ๋ค๋ ค์ฃผ๋ ์ด์ผ๊ธฐ๋ฅผ ๊ฒฝ์ฒญํ๊ณ , ๋ ์์ ์ ์ด๊ณ ํจ์จ์ ์ธ ๋์งํธ ํ๊ฒฝ์ ๋ง๋ค์ด๋๊ฐ์๊ธธ ๋ฐ๋๋๋ค.
'DEV' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ํ๋กฌํํธ์์ง๋์ด๋ง
- ์น๊ฐ๋ฐ
- ํด๋ผ์ฐ๋์ปดํจํ
- LLM
- AI๊ธฐ์
- ๊ฐ๋ฐ์์ฐ์ฑ
- AI
- ์๋ฐ๊ฐ๋ฐ
- springai
- ๋ก๋๋ฐธ๋ฐ์ฑ
- ์น๋ณด์
- ์ฑ๋ฅ์ต์ ํ
- ๊ฐ๋ฐ๊ฐ์ด๋
- ๊ฐ๋ฐ์๊ฐ์ด๋
- Java
- ์ธ๊ณต์ง๋ฅ
- ๋ฐฐ๋ฏผ
- ๋ฏธ๋ai
- ๋ฐฑ์๋๊ฐ๋ฐ
- ๋ง์ดํฌ๋ก์๋น์ค
- ํด๋ฆฐ์ฝ๋
- ํ๋ก ํธ์๋๊ฐ๋ฐ
- ์ ๋ฌด์๋ํ
- SEO์ต์ ํ
- ๊ฐ๋ฐ์์ฑ์ฅ
- ์์ฑํAI
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- AI๋ฐ๋์ฒด
- n8n
- restapi
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |