Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

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

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

๋ฌด์—‡์„ ๋ฐ›๊ณ  ์‹ถ๋‚˜์š”?

๊ทธ๋ผ ํŒŒ๋‚˜ โ€” ๋ถ„์„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ตฌ์„ฑ์—์„œ๋Š” Grafana ์›น ์„œ๋ฒ„์™€ ๋ถ„์„์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(ClickHouse, InfluxDB ๋“ฑ)๊ฐ€ ์žˆ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์ž…๋‹ˆ๋‹ค.

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

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

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

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

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

๋‹ค์Œ์€ ์ตœ์ข… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธํ”„๋ผ์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

์†์œผ๋กœ ๋“ค์–ด์˜ฌ๋ฆฌ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ์ž

MySQL๊ณผ ํด๋ฆญํ•˜์šฐ์Šค

๋ฒ„ํŠผ ํด๋ฆญ๋งŒ์œผ๋กœ ์ด๋Ÿฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์„œ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋Š” L3 ๋ฐธ๋Ÿฐ์„œ, ClickHouse ๋ฐ MySQL์„ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋กœ ์ œ๊ณตํ•˜๋Š” Yandex.Cloud๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๋„์™€์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ”Œ๋žซํผ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ž‘๋™ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋“ฑ๋กํ•˜๊ณ  ํด๋ผ์šฐ๋“œ์™€ ๊ฒฐ์ œ ๊ณ„์ •์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ ํด๋ผ์šฐ๋“œ๋กœ ๊ฐ€์„œ ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ MySQL๊ณผ ClickHouse ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ์Šต๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌGrafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

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

๋ช…๋ฐฑํ•˜์ง€ ์•Š์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋งŽ์€ ํ˜ธ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Grafana์—๋Š” ์ž‘๋™ํ•˜๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธด ๋…์„œ ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜ ๊ตฌ๋ฆ„์ด ๋‚˜์—๊ฒŒ ๊ฒฐ์ •์„ ๋‚ด๋ ค์ฃผ์—ˆ๋‹ค. ์ข…์˜ ์ˆ™์ฃผ์ธ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. c-<cluster_id>.rw.mdb.yandexcloud.net ํ•ด๋‹น ID๋ฅผ ๊ฐ€์ง„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ํ™œ์„ฑ ๋งˆ์Šคํ„ฐ ํ˜ธ์ŠคํŠธ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ Grafana์—๊ฒŒ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์›น ์„œ๋ฒ„

์ด์ œ ์›น ์„œ๋ฒ„์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. Linux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๊ธฐ์— Grafana๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

SSH๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๊ณ  ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

๊ทธ๋Ÿฐ ๋‹ค์Œ systemctl์—์„œ Grafana๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ClickHouse ์ž‘์—…์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์˜ˆ, ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์—๋Š” ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

๊ทธ ๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์œผ๋กœ ๋์ž…๋‹ˆ๋‹ค

sudo service grafana-server start

์›น ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์— ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์™ธ๋ถ€ IP ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ํฌํŠธ 3000์„ ์ง€์ •ํ•˜๋ฉด ์•„๋ฆ„๋‹ค์šด ๊ทธ๋ž˜ํ”ฝ UI๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

๊ทธ๋Ÿฌ๋‚˜ ์„œ๋‘๋ฅด์ง€ ๋งˆ์‹ญ์‹œ์˜ค. Grafana๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ์„ค์ •์„ ์ €์žฅํ•  MySQL ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Grafana ์›น ์„œ๋ฒ„์˜ ์ „์ฒด ๊ตฌ์„ฑ์€ ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค. /etc/grafana/grafana.ini. ํ•„์ˆ˜ ์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

;url =

ํ˜ธ์ŠคํŠธ๋ฅผ MySQL ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŒŒ์ผ์—๋Š” ์œ„ ๊ทธ๋ฆผ์˜ Grafana์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๊ทธ์ธ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘˜ ๋‹ค ๋™์ผํ•ฉ๋‹ˆ๋‹ค. admin.

sed ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sudo sed -i "s#.*;url =.*#url = mysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${GRAFANA_USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${GRAFANA_PASSWORD}#" /etc/grafana/grafana.ini

์ด์ œ ์›น ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!

sudo service grafana-server restart

์ด์ œ Grafana UI์—์„œ ClickHouse๋ฅผ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ๊ตฌ์„ฑ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

URL๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

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

ํฌ์žฅ ๊ธฐ๊ณ„

Yandex.Cloud๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋””์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋กœ ๋™์ผํ•œ ๋จธ์‹  ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐ๋ฆฝํ•˜๋ ค๋ฉด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํฌ์žฅ ๊ธฐ๊ณ„ HashiCorp์—์„œ. ์ด๋ฏธ์ง€ ์กฐ๋ฆฝ ์ง€์นจ์ด ํฌํ•จ๋œ json ํŒŒ์ผ์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

json ํŒŒ์ผ์€ ๋นŒ๋”์™€ ํ”„๋กœ๋น„์ €๋„ˆ๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก์€ ์ด๋ฏธ์ง€ ์ž์ฒด์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์—”ํ„ฐํ‹ฐ๋กœ ์„ค๋ช…ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์€ ํ•„์š”ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์ฑ„์šฐ๋Š” ์ง€์นจ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋”

{
"builders": [
    {
      "type": "yandex",
      "endpoint": "{{user `endpoint`}}",
      "folder_id": "<folder_id>",
      "subnet_id": "{{user `subnet_id`}}",
      "zone": "{{user `zone`}}",
      "labels": {},
      "use_ipv4_nat": true,
      "use_internal_ip": false,
      "service_account_key_file": "<service_account_key_file>",
      "image_name": "grafana-{{timestamp}}",
      "image_family": "grafana",
      "image_labels": {},
      "image_description": "GRAFANA",
      "source_image_family": "ubuntu-1804-lts",
      "disk_size_gb": 3,
      "disk_type": "network-hdd",
      "ssh_username": "ubuntu"
    }
  ],
...
}

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

์ด ๊ตฌ์„ฑ์€ ๋””์Šคํฌ ์ด๋ฏธ์ง€๊ฐ€ ํ”Œ๋žซํผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ubuntu-1804-lts, ์ด๋ฏธ์ง€ ๊ณ„์—ด์˜ ์ ์ ˆํ•œ ์‚ฌ์šฉ์ž ์„น์…˜์— ๋ฐฐ์น˜ GRAFANA ์ด๋ฆ„์œผ๋กœ grafana-{{timestamp}}.

์ œ๊ณต์ž

์ด์ œ ๊ตฌ์„ฑ์˜ ๋” ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์ƒํƒœ๋ฅผ ๋””์Šคํฌ ์ด๋ฏธ์ง€๋กœ ๊ณ ์ •ํ•˜๊ธฐ ์ „์— ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

{
...,
"provisioners": [
    {
            "type": "shell",
            "pause_before": "5s",
            "scripts": [
                "prepare-ctg.sh"
            ]
        },
    {
            "type": "file",
            "source": "setup.sh",
            "destination": "/opt/grafana/setup.sh"
        },
        {
            "type": "shell",
        "execute_command": "sudo {{ .Vars }} bash '{{ .Path }}'",
            "pause_before": "5s",
            "scripts": [
                "install-packages.sh",
                "grafana-setup.sh",
                "run-setup-at-reboot.sh"
        ]
        }
  ]
}

์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์ž‘์—…์€ 3๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ๋ณด์กฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ค€๋น„-ctg.sh:

#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafana

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹œ์ž‘ํ•œ ํ›„ ์ฆ‰์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” Grafana ๊ตฌ์„ฑ์— ๋“ฑ๋กํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ณ€์ˆ˜๋ฅผ ๋„ฃ๊ณ  ์›น ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

setup.sh:

#!/bin/bash
CLUSTER_ID="<cluster_id>"
USERNAME="<username>"
PASSWORD="<password>"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@c-${CLUSTER_ID}.rw.mdb.yandexcloud.net#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

๊ทธ ํ›„์— ํ•ด์•ผ ํ•  ์ผ์ด 3๊ฐ€์ง€ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.
1) ํŒจํ‚ค์ง€ ์„ค์น˜
2) systemctl์—์„œ Grafana๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ClickHouse ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
3) ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ผ  ์งํ›„ setup.sh ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ํŒจํ‚ค์ง€.sh:

#!/bin/bash
sudo systemd-run --property='After=apt-daily.service apt-daily-upgrade.service' --wait /bin/true
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

grafana-setup.sh:

#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

์‹คํ–‰-์„ค์ •-at-reboot.sh:

#!/bin/bash
chmod +x /opt/grafana/setup.sh
cat > /etc/cron.d/first-boot <<EOF
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@reboot root /bin/bash /opt/grafana/setup.sh > /var/log/yc-setup.log 2>&1
EOF
chmod +x /etc/cron.d/first-boot;

์ด์ œ ๋‚จ์€ ๊ฒƒ์€ Packer๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •๋œ ์„น์…˜์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฅผ ๋ถ€ํŒ… ๋””์Šคํฌ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ–‰ ํ›„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ Grafana ์›น ์„œ๋ฒ„๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ
Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน ๋ฐ ๋ฐธ๋Ÿฐ์„œ

๋™์ผํ•œ Grafana ์›น ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋””์Šคํฌ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋ฉด ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Yandex.Cloud ํ”Œ๋žซํผ์—์„œ ์ด ์šฉ์–ด๋Š” ๋™์ผํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง„ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๊ฒฐํ•ฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•  ๋•Œ ์ด ๊ทธ๋ฃน์— ์žˆ๋Š” ๋ชจ๋“  ๋จธ์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๊ตฌ์„ฑ๋˜๊ณ  ๊ทธ๋ฃน ์ž์ฒด์˜ ํŠน์„ฑ(์˜ˆ: ํ™œ์„ฑ ๋จธ์‹ ์˜ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ์ˆ˜)์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน ์ž์ฒด๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋จธ์‹ ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ž์ฒด ์ด๋ฏธ์ง€์— ์ƒˆ ๋จธ์‹ ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์˜ ์ผํ™˜์œผ๋กœ ์ด์ „์— ์ƒ์„ฑ๋œ ๋””์Šคํฌ ์ด๋ฏธ์ง€์—์„œ ์ƒ์„ฑ๋  ์›น ์„œ๋ฒ„์˜ ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

์ •๋ง ๋†€๋ผ์šด ์ ์€ ๋งˆ์ง€๋ง‰ ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน ์„ค์ •์ž…๋‹ˆ๋‹ค. Load Balancer์™€ ํ†ตํ•ฉ๋œ ๋Œ€์ƒ ๊ทธ๋ฃน์€ ๋ช‡ ๊ฐœ์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ด ๊ทธ๋ฃน์˜ ๊ฐ€์ƒ ๋จธ์‹  ์œ„์— L3 ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

๋ฐธ๋Ÿฐ์„œ๋ฅผ ์„ค์ •ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํฌํŠธ 80์—์„œ ์‚ฌ์šฉ์ž ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๊ณ  ์ด๋ฅผ ์ •ํ™•ํžˆ Grafana๊ฐ€ ์žˆ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์˜ ํฌํŠธ 3000์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ํฌํŠธ 3000์— ํ•‘์„ ๋ณด๋‚ด ๋จธ์‹ ์˜ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

๋ฏธ๋‹ˆ ์š”์•ฝ

๋งˆ์ง€๋ง‰์œผ๋กœ ์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธํ”„๋ผ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ด์ œ ํƒ„๋ ฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ Grafana ์„œ๋น„์Šค๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด ClickHouse ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜ธ์ŠคํŠธ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์ธ ๋ฐธ๋Ÿฐ์„œ์˜ IP ์ฃผ์†Œ๋งŒ ์•Œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

Terraform ํ†ตํ•ฉ

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

Terraform์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์€ ๊ตฌ์„ฑ ํŒŒ์ผ(*.tf) ๋ฐ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜๋“ค

ํŒŒ์ผ ๋งจ ์ฒ˜์Œ์—๋Š” ํ–ฅํ›„ ์ธํ”„๋ผ๊ฐ€ ๋ฐฐํฌ๋  ์œ„์น˜์™€ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

variable "oauth_token" {
    type = string
    default = "<oauth-token>"
}
variable "cloud_id" {
    type = string
    default = "<cloud-id>"
}
variable "folder_id" {
    type = string
    default = "<folder_id>"
}
variable "service_account_id" {
    type = string
    default = "<service_account_id>"
}
variable "image_id" {
    type = string
    default = "<image_id>"
}
variable "username" {
    type = string
    default = "<username>"
}
variable "password" {
    type = string
    default = "<password>"
}
variable "dbname" {
    type = string
    default = "<dbname>"
}
variable "public_key_path" {
    type = string
    default = "<path to ssh public key>"
}

์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋Š” ๋””์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋ฌด์—‡์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

oauth_token โ€” ํด๋ผ์šฐ๋“œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ.
cloud_id โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ํด๋ผ์šฐ๋“œ ์‹๋ณ„์ž
ํด๋” ์•„์ด๋”” โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์„น์…˜ ์‹๋ณ„์ž
service_account_id โ€” ํด๋ผ์šฐ๋“œ์˜ ํ•ด๋‹น ์„น์…˜์— ์žˆ๋Š” ์„œ๋น„์Šค ๊ณ„์ • ์‹๋ณ„์ž.
์ด๋ฏธ์ง€_ID โ€” Packer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์€ ๋””์Šคํฌ ์ด๋ฏธ์ง€์˜ ์‹๋ณ„์ž
์‚ฌ์šฉ์ž ์ด๋ฆ„ ะธ ์•”ํ˜ธ โ€” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Grafana ์›น ์„œ๋ฒ„์— ๋ชจ๋‘ ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„ โ€” CH ๋ฐ MySQL ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„
๊ณต๊ฐœ_ํ‚ค_๊ฒฝ๋กœ โ€” ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐœ SSH ํ‚ค๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ ubuntu ์›น ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์—

์ œ๊ณต์—…์ฒด ์„ค์ •

์ด์ œ Terraform ๊ณต๊ธ‰์ž(์ด ๊ฒฝ์šฐ Yandex)๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

provider "yandex" {
  token     = var.oauth_token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
  zone      = "ru-central1-a"
}

์—ฌ๊ธฐ์„œ๋Š” ์œ„์—์„œ ์ •์˜ํ•œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ธํ”„๋ผ ์š”์†Œ๊ฐ€ ํ†ต์‹ ํ•˜๊ณ  XNUMX๊ฐœ์˜ ์„œ๋ธŒ๋„ท(๊ฐ ์ง€์—ญ์— ํ•˜๋‚˜์”ฉ)๊ณผ CH ๋ฐ MySQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ‚ค์šฐ๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


resource "yandex_vpc_network" "grafana_network" {}

resource "yandex_vpc_subnet" "subnet_a" {
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.1.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_b" {
  zone           = "ru-central1-b"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.2.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_c" {
  zone           = "ru-central1-c"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.3.0.0/24"]
}

resource "yandex_mdb_clickhouse_cluster" "ch_cluster" {
  name        = "grafana-clickhouse"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id

  clickhouse {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 16
    }
  }

  zookeeper {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 10
    }
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
    }
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

resource "yandex_mdb_mysql_cluster" "mysql_cluster" {
  name        = "grafana_mysql"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id
  version     = "8.0"

  resources {
    resource_preset_id = "s2.micro"
    disk_type_id       = "network-ssd"
    disk_size          = 16
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
      roles         = ["ALL"]
    }
  }

  host {
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }
  host {
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }
  host {
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

๋ณด์‹œ๋‹ค์‹œํ”ผ, ๋‘ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ๊ฐ์€ ์„ธ ๊ฐœ์˜ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์— ๋ฐฐ์น˜๋˜์–ด ๋‚ด๊ฒฐํ•จ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

์›น ์„œ๋ฒ„

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

Amazon์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ƒ ๋จธ์‹ ์— ์ „๋‹ฌํ•˜๊ณ  ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ Terraform ํŒŒ์ผ์— ์ง€์ •ํ•œ MySQL ํด๋Ÿฌ์Šคํ„ฐ ํ˜ธ์ŠคํŠธ ๋ฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„-๋น„๋ฐ€๋ฒˆํ˜ธ ๋’ค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ๋จธ์‹ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์„ ์‚ด์ง ๋ฐ”๊ฟ”๋ณด์ž setup.sh, ๊ฐ€์ƒ ๋จธ์‹ ์ด ์ผœ์งˆ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

setup.sh:

#!/bin/bash
CLUSTER_URI="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/mysql_cluster_uri)"
USERNAME="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/username)"
PASSWORD="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/password)"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@${CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน ๋ฐ ๋ฐธ๋Ÿฐ์„œ

์ƒˆ ๋””์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•œ ํ›„ ๋งˆ์นจ๋‚ด Terraform์šฉ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๋””์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

data "yandex_compute_image" "grafana_image" {
  image_id = var.image_id
}

์ด์ œ ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

resource "yandex_compute_instance_group" "grafana_group" {
  name               = "grafana-group"
  folder_id          = var.folder_id
  service_account_id = var.service_account_id
  instance_template {
    platform_id = "standard-v1"
    resources {
      memory = 1
      cores  = 1
    }
    boot_disk {
      mode = "READ_WRITE"
      initialize_params {
        image_id = data.yandex_compute_image.grafana_image.id
        size     = 4
      }
    }
    network_interface {
      network_id = yandex_vpc_network.grafana_network.id
      subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id, yandex_vpc_subnet.subnet_c.id]
      nat = "true"
    }
    metadata = {
      mysql_cluster_uri = "c-${yandex_mdb_mysql_cluster.mysql_cluster.id}.rw.mdb.yandexcloud.net:3306/${var.dbname}"
      username = var.username
      password = var.password
      ssh-keys = "ubuntu:${file("${var.public_key_path}")}"
    }
    network_settings {
      type = "STANDARD"
    }
  }

  scale_policy {
    fixed_scale {
      size = 6
    }
  }

  allocation_policy {
    zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"]
  }

  deploy_policy {
    max_unavailable = 2
    max_creating    = 2
    max_expansion   = 2
    max_deleting    = 2
  }

  load_balancer {
    target_group_name = "grafana-target-group"
  }
}

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ–ˆ๋Š”์ง€ ์ฃผ๋ชฉํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. cluster_uri, username ะธ password. ๊ฐ€์ƒ ๋จธ์‹ ์ด ์‹œ์ž‘ ์‹œ ๊บผ๋‚ด์„œ Grafana ๊ตฌ์„ฑ์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฐธ๋Ÿฐ์„œ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

resource "yandex_lb_network_load_balancer" "grafana_balancer" {
  name = "grafana-balancer"

  listener {
    name = "grafana-listener"
    port = 80
    target_port = 3000
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  attached_target_group {
    target_group_id = yandex_compute_instance_group.grafana_group.load_balancer.0.target_group_id

    healthcheck {
      name = "healthcheck"
      tcp_options {
        port = 3000
      }
    }
  }
}

์•ฝ๊ฐ„์˜ ์„คํƒ•

์กฐ๊ธˆ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ์ธํ”„๋ผ๊ฐ€ ๋ฐฐํฌ๋œ ํ›„์—๋Š” Grafana UI๋กœ ์ด๋™ํ•˜์—ฌ CH ํด๋Ÿฌ์Šคํ„ฐ(์•„์ง ID๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•จ)๋ฅผ ๋ฐ์ดํ„ฐ ์›๋ณธ์œผ๋กœ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Terraform์€ ํด๋Ÿฌ์Šคํ„ฐ ID๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ผ์„ ๊ทธ์—๊ฒŒ ๋งก๊ธฐ์ž.

์ƒˆ๋กœ์šด ๊ณต๊ธ‰์ž์ธ Grafana๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ๋…€์—๊ฒŒ ๋ฐธ๋Ÿฐ์„œ์˜ IP ์ฃผ์†Œ๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Terraform์ด ํ•ด๋‹น ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ๋จธ์‹ ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ MySQL์—์„œ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ๋จธ์‹ ์—์„œ๋„ ์ปค์ง‘๋‹ˆ๋‹ค.

provider "grafana" {
  url  = "http://${[for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0}"
  auth = "${var.username}:${var.password}"
}

resource "grafana_data_source" "ch_data_source" {
  type          = "vertamedia-clickhouse-datasource"
  name          = "grafana"
  url           = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
  basic_auth_enabled = "true"
  basic_auth_username = var.username
  basic_auth_password = var.password
  is_default = "true"
  access_mode = "proxy"
}

๋จธ๋ฆฌ๋ฅผ ๋น—์ž

ClickHouse ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐธ๋Ÿฐ์„œ IP ์ฃผ์†Œ์™€ ํ˜ธ์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

output "grafana_balancer_ip_address" {
  value = [for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0
}

output "clickhouse_cluster_host" {
  value = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
}

์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋ชจ๋‘! ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ค€๋น„๋˜์—ˆ์œผ๋ฉฐ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ Terraform์— ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ณผ์ •์€ ์•ฝ 15๋ถ„ ์ •๋„ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„๋ฆ„๋‹ค์šด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:

clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25

๊ทธ๋ฆฌ๊ณ  ํด๋ผ์šฐ๋“œ์—์„œ๋Š” ๊ฐ•ํ™”๋œ ์ธํ”„๋ผ์˜ ์š”์†Œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Grafana๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด Yandex.Cloud์— ๋ถ„์‚ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

ํ•ฉ๊ณ„ํ•˜๋‹ค

์ด์ œ Grafana๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ž๋Š” Yandex.Cloud ํ”Œ๋žซํผ์—์„œ ๊ด‘๋ฒ”์œ„ํ•œ ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…์ฒ˜๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Packer ๋ฐ Terraform๊ณผ ๊ฐ™์€ HashiCorp์˜ ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ์ด ์ž‘์—…์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๊ธ€์„ ์œ ์šฉํ•˜๊ฒŒ ์—ฌ๊ธฐ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค :)

PS ์•„๋ž˜์—๋Š” ์ด ๊ธฐ์‚ฌ์—์„œ ์ œ๊ณตํ•œ ๋‹จํŽธ์ธ Packer ๋ฐ Terraform์— ๋Œ€ํ•œ ๊ธฐ์„ฑ ๋ ˆ์‹œํ”ผ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €์žฅ์†Œ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€