์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ! ์ ๋ ์์
๊ณผ์ ์ ์ผํ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตญ๋ด ํด๋ผ์ฐ๋ ํ๋ซํผ์ ๊ธฐ๋ฅ์ ์ฐ๊ตฌํ์ต๋๋ค.
๋ฌด์์ ๋ฐ๊ณ ์ถ๋์?
์น ์๋ฒ๊ฐ ํฌํจ๋ ๊ฐ์ ๋จธ์ ์ ์์ํ ํ ํด๋น ํธ์คํธ๋ก ์ด๋ํ์ฌ ์๋ฆ๋ค์ด UI๋ฅผ ์ป๊ณ , ์ถ๊ฐ ์์ ์ ์ํ ์์ค๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ํ๊ณ , ๋์๋ณด๋์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ฒ์ ์๋ ํ ๊ฐ์ง ์ค์ํ ๋จ์ ์ด ์์ต๋๋ค. ์ฆ, ๋ด๊ฒฐํจ์ฑ์ด ์ ํ ์์ต๋๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๊ธฐ๋ฅ์ ํ๋์ ๊ฐ์ ๋จธ์ ์ ์คํ ๊ฐ๋ฅ์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ฑฐ๋ถํ๊ฑฐ๋ 10๋ช ์ด ๋์์ UI๋ฅผ ์ด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์น ์๋ฒ์ ํจ๊ป ๋์ผํ ๊ฐ์ ๋จธ์ ์ ๋ง์ด ๋ฐฐํฌํ๊ณ L3 ๋ฐธ๋ฐ์ ์๋์ ๋ฐฐ์นํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋ช ํํ์ง๋ ์์ต๋๋ค. Grafana๋ ์ฌ์ฉ์ ์ค์ (๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋์๋ณด๋, ๊ทธ๋ํ ๋ฑ์ ๋ํ ๊ฒฝ๋ก)์ ๊ฐ์ ๋จธ์ ์ ๋์คํฌ์ ์ง์ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ผ์ UI์์ ์ผ๋ถ ์ค์ ์ ๋ณ๊ฒฝํ๋ฉด ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐธ๋ฐ์๊ฐ ๋ณด๋ธ ๊ฐ์ ๋จธ์ ์๋ง ๋ฐ์๋ฉ๋๋ค. ์ด๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์ด ์ผ๊ด๋์ง ์๊ณ ์คํ ๋ฐ ์ฌ์ฉ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์๋ MySQL ๋๋ ์ด์ ๋๋ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ตฌ์ถ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ Grafana์๊ฒ ์ด "์๋น" ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ์ค์ ์ ์ ์ฅํด์ผ ํ๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ ํ์๋ ๊ฐ ๋จธ์ ์์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ํ ๋ฒ ์ง์ ํ๊ณ ๊ฐ์ ๋จธ์ ์ค ํ๋์์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์ ์ค์ ์ ํธ์งํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
๋ค์์ ์ต์ข ์ ํ๋ฆฌ์ผ์ด์ ์ธํ๋ผ์ ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค.
์์ผ๋ก ๋ค์ด์ฌ๋ฆฌ๋ ๋ฒ์ ๋ฐฐ์ฐ์
MySQL๊ณผ ํด๋ฆญํ์ฐ์ค
๋ฒํผ ํด๋ฆญ๋ง์ผ๋ก ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋ก ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์์ผ ํ์ต๋๋ค.
์ฌ๊ธฐ์์๋ L3 ๋ฐธ๋ฐ์, ClickHouse ๋ฐ MySQL์ ๊ด๋ฆฌํ ์๋น์ค๋ก ์ ๊ณตํ๋ Yandex.Cloud๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋์์ค ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๊ณ ํ๋ซํผ์ด ๋ชจ๋ ๊ฒ์ ์๋ ์์๋๋ก ๊ฐ์ ธ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ฑ๋กํ๊ณ ํด๋ผ์ฐ๋์ ๊ฒฐ์ ๊ณ์ ์ ๋ง๋ค์์ต๋๋ค. ๊ทธ ํ ํด๋ผ์ฐ๋๋ก ๊ฐ์ ์ต์ํ์ ์ค์ ์ผ๋ก MySQL๊ณผ ClickHouse ํด๋ฌ์คํฐ๋ฅผ ์ค์ ํ์ต๋๋ค. ํ์ฑํ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ์ต๋๋ค.
๋ํ ๊ฐ ํด๋ฌ์คํฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๊ณ ๋ก๊ทธ์ธ ๋ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ธํ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค. ์ธํฐํ์ด์ค์์๋ ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๋ช ํํฉ๋๋ค.
๋ช
๋ฐฑํ์ง ์์ ์ธ๋ถ ์ฌํญ์ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด๊ฒฐํจ์ฑ์ ๋ณด์ฅํ๋ ๋ง์ ํธ์คํธ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ Grafana์๋ ์๋ํ๋ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ ํํ ํ๋์ ํธ์คํธ๊ฐ ํ์ํฉ๋๋ค. ๊ธด ๋
์ c-<cluster_id>.rw.mdb.yandexcloud.net
ํด๋น ID๋ฅผ ๊ฐ์ง ํด๋ฌ์คํฐ์ ํ์ฌ ํ์ฑ ๋ง์คํฐ ํธ์คํธ์ ๋งคํ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ Grafana์๊ฒ ์ค ๊ฒ์
๋๋ค.
์น ์๋ฒ
์ด์ ์น ์๋ฒ์ ๋ฌ๋ ค ์์ต๋๋ค. Linux๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ๊ฐ์ ๋จธ์ ์ ์์ฑํ๊ณ ์ฌ๊ธฐ์ Grafana๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
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๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ์ค์ ์ ์ ์ฅํ 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๋ฅผ ๋ฐ์ดํฐ ์์ค๋ก ์ง์ ํ๊ฒ ์ต๋๋ค.
๋ค์ ์ค์ ์ ์ฌ์ฉํ์ฌ ์์ ๊ตฌ์ฑ์ ๋ฌ์ฑํ ์ ์์์ต๋๋ค.
URL๋ก ์ง์ ํ์ต๋๋ค https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443
๋ชจ๋! CH ๋ฐ MySQL์ ์ฐ๊ฒฐ๋ ์น ์๋ฒ๊ฐ ์๋ ์๋ํ๋ ๊ฐ์ ๋จธ์ ์ด ํ๋ ์์ต๋๋ค. ์ด๋ฏธ ClickHouse์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๋ก๋ํ๊ณ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์์ง ๋ชฉํ๋ฅผ ๋ฌ์ฑํ์ง ๋ชปํ๊ณ ๋ณธ๊ฒฉ์ ์ธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ์ง ๋ชปํ์ต๋๋ค.
ํฌ์ฅ ๊ธฐ๊ณ
Yandex.Cloud๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ๊ฐ์ ๋จธ์ ์ ๋์คํฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก ๋์ผํ ๋จธ์ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ์ด๋ฏธ์ง๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐ๋ฆฝํ๋ ค๋ฉด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
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 ํ๋ซํผ์์ ์ด ์ฉ์ด๋ ๋์ผํ ํน์ฑ์ ๊ฐ์ง ๊ฐ์ ๋จธ์ ์ ๊ฒฐํฉ์ ๋ํ๋ ๋๋ค. ์ธ์คํด์ค ๊ทธ๋ฃน์ ์์ฑํ ๋ ์ด ๊ทธ๋ฃน์ ์๋ ๋ชจ๋ ๋จธ์ ์ ํ๋กํ ํ์ ์ด ๊ตฌ์ฑ๋๊ณ ๊ทธ๋ฃน ์์ฒด์ ํน์ฑ(์: ํ์ฑ ๋จธ์ ์ ์ต์ ๋ฐ ์ต๋ ์)์ด ๊ตฌ์ฑ๋ฉ๋๋ค. ํ์ฌ ์ซ์๊ฐ ์ด๋ฌํ ๊ธฐ์ค์ ์ถฉ์กฑํ์ง ์์ผ๋ฉด ์ธ์คํด์ค ๊ทธ๋ฃน ์์ฒด๊ฐ ๋ถํ์ํ ๋จธ์ ์ ์ ๊ฑฐํ๊ฑฐ๋ ์์ฒด ์ด๋ฏธ์ง์ ์ ๋จธ์ ์ ์์ฑํฉ๋๋ค.
์์ ์ ์ผํ์ผ๋ก ์ด์ ์ ์์ฑ๋ ๋์คํฌ ์ด๋ฏธ์ง์์ ์์ฑ๋ ์น ์๋ฒ์ ์ธ์คํด์ค ๊ทธ๋ฃน์ ์์ฑํฉ๋๋ค.
์ ๋ง ๋๋ผ์ด ์ ์ ๋ง์ง๋ง ์ธ์คํด์ค ๊ทธ๋ฃน ์ค์ ์ ๋๋ค. Load Balancer์ ํตํฉ๋ ๋์ ๊ทธ๋ฃน์ ๋ช ๊ฐ์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ด ๊ทธ๋ฃน์ ๊ฐ์ ๋จธ์ ์์ L3 ๋ฐธ๋ฐ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฐธ๋ฐ์๋ฅผ ์ค์ ํ ๋ ๋ ๊ฐ์ง ์ค์ํ ์ฌํญ์ ๊ตฌํํ์ต๋๋ค.
- ๋ฐธ๋ฐ์๊ฐ ํฌํธ 80์์ ์ฌ์ฉ์ ํธ๋ํฝ์ ํ์ฉํ๊ณ ์ด๋ฅผ ์ ํํ Grafana๊ฐ ์๋ ๊ฐ์ ๋จธ์ ์ ํฌํธ 3000์ผ๋ก ๋ฆฌ๋๋ ์ ํ๋๋ก ํ์ต๋๋ค.
- ํฌํธ 3000์ ํ์ ๋ณด๋ด ๋จธ์ ์ ์คํ ๊ฐ๋ฅ์ฑ์ ํ์ธํ๋๋ก ์ค์ ํ์ต๋๋ค.
๋ฏธ๋ ์์ฝ
๋ง์ง๋ง์ผ๋ก ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธํ๋ผ๋ฅผ ์๋์ผ๋ก ๋ฐฐํฌํ ์ ์์๊ณ ์ด์ ํ๋ ฅ์ฑ์ด ๋ฐ์ด๋ 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 ํ๋ซํผ์์ ๊ด๋ฒ์ํ ํด๋ผ์ฐ๋ ์ํคํ ์ฒ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. Packer ๋ฐ Terraform๊ณผ ๊ฐ์ HashiCorp์ ์ ์ฉํ ๋๊ตฌ๊ฐ ์ด ์์ ์ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ด ๊ธ์ ์ ์ฉํ๊ฒ ์ฌ๊ธฐ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค :)
PS ์๋์๋ ์ด ๊ธฐ์ฌ์์ ์ ๊ณตํ ๋จํธ์ธ Packer ๋ฐ Terraform์ ๋ํ ๊ธฐ์ฑ ๋ ์ํผ๋ฅผ ์ฐพ์ ์ ์๋ ์ ์ฅ์์ ๋ํ ๋งํฌ๋ฅผ ์ฒจ๋ถํ๊ฒ ์ต๋๋ค.
์ถ์ฒ : habr.com