Moien alleguer! Als Deel vu menger Coursaarbecht hunn ech d'FĂ€higkeiten vun esou enger Haus Cloud Plattform wĂ©i . D'Plattform bitt verschidde Servicer fir praktesch Problemer ze lĂ©isen. WĂ©i och Ă«mmer, heiansdo musst Dir Ăr eege Cloud-Applikatioun mat enger zimlech extensiv Infrastruktur opbauen op Basis vun dĂ«se Servicer. An dĂ«sem Artikel wĂ«ll ech meng Erfahrung deelen beim Ofbau vun esou enger Applikatioun.

Wat wëllt Dir kréien?
- e mÀchtegt Tool fir analytesch Probleemer ze léisen oder Probleemer vun all System ze iwwerwaachen. A senger Basiskonfiguratioun ass dëst eng virtuell Maschinn mat engem Grafana Webserver, souwéi eng Datebank (ClickHouse, InfluxDB, asw.) mat engem Dataset op deem d'Analyse baséiert.
Nodeems Dir eng virtuell Maschinn mat engem Webserver lancéiert hutt, kënnt Dir op sÀi Host goen an e schéine UI kréien, Datenbanken als Quelle fir weider Aarbecht spezifizéieren, Dashboards a Grafike erstellen.

Der Basis Versioun huet e groussen Nodeel - et ass guer net Feeler-tolerant. Dat ass, déi ganz Funktionalitéit vun der Applikatioun hÀnkt vun der Viabilitéit vun enger virtueller Maschinn of. Wann et refuséiert oder 10 Leit d'UI zur selwechter ZÀit opmaachen, da komme Problemer.
Si kĂ«nnen einfach gelĂ©ist ginn: Dir musst just ... vill identesch virtuell Maschinnen mat engem Webserver ofsetzen an se Ă«nner engem L3 Balancer setzen. Awer net alles ass hei sou kloer. Grafana spĂ€ichert d'Benotzer Astellunge (WeeĂ«r zu Datenbanken, Dashboards, Grafiken, etc.) direkt op der Scheif vu senger virtueller Maschinn. Also, wa mir e puer Astellungen an der UI Ă€nneren, ginn dĂ«s Ănnerungen nĂ«mmen op der virtueller Maschinn reflektĂ©iert wou de Balancer eis geschĂ©ckt huet. DĂ«st wĂ€ert zu inkonsistente Astellunge fir eis Applikatioun fĂ©ieren, wat Problemer mam Start a Gebrauch verursaacht.
Hei kĂ«nnt eng aner Datebank zur Rettung, zum Beispill MySQL oder seng Ăquivalent. Mir soen Grafana datt si Benotzer Astellungen an dĂ«ser "Ersatzspiller" Datebank spĂ€ichere soll. Duerno ass et genuch fir de Wee zu dĂ«ser Datebank eemol op all Maschinn ze spezifizĂ©ieren, an all aner Benotzer-Astellungen op eng vun de virtuelle Maschinnen z'Ă€nneren; si ginn op dĂ©i aner verlĂ€ngert.
Hei ass en Diagramm vun der definitiver Applikatiounsinfrastruktur:

Loosst eis léieren mat eisen HÀnn opzehiewen
MySQL a ClickHouse
Ier Dir esou eng Applikatioun mat engem Klick op de KnÀppchen deployéiert, war et néideg ze léieren wéi ee vu senge Komponenten handelt an se mateneen integréiert.
Hei hëlleft Yandex.Cloud eis, déi L3 Balancer, ClickHouse a MySQL als verwaltete Servicer ubitt. De Benotzer brauch nëmmen d'Parameteren ze spezifizéieren a waart bis d'Plattform alles an d'Aarbechtsplaz bréngt.
Ech hunn mech ugemellt, eng Wollek an e Bezuelkonto erstallt. Duerno sinn ech an d'Wollek gaang an hunn MySQL a ClickHouse Cluster mat minimalen Astellungen opgestallt. Ech hunn gewaart bis se aktiv ginn.


Dir musst och drun erënneren datt Dir eng Datebank an all StÀrekoup erstellt an den Zougang dozou konfiguréiert mat engem Login a Passwuert. Ech ginn net an Detailer hei - alles ass ganz offensichtlech an der Interface.
Den net offensichtlechen Detail war datt dës Datenbanken vill Hosten hunn, déi hir Feeler Toleranz garantéieren. Wéi och ëmmer, Grafana erfuerdert genau een Host fir all Datebank mat deem se funktionnéiert. Laang liesen D'Wolleken hunn mech zu enger Entscheedung bruecht. Et stellt sech eraus datt de Host vun der Spezies c-<cluster_id>.rw.mdb.yandexcloud.net op den aktuellen aktive Masterhost vum Cluster mat der entspriechender ID kartéiert. Dëst ass wat mir Grafana ginn.
Webserver
Elo ass et ZÀit fir de Webserver. Loosst eis eng normal virtuell Maschinn opstellen mat Linux an mir wÀerten Grafana mat eisen HÀnn drop opstellen.


Loosst eis iwwer ssh verbannen an déi néideg Packagen installéieren.
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
Duerno, loosst eis Grafana ënner systemctl lafen an de Plugin installéieren fir mat ClickHouse ze schaffen (jo, et gëtt net am Basispaket geliwwert).
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasourceDat ass et, duerno mat engem einfachen Kommando
sudo service grafana-server startmir starten de Webserver. Elo kënnt Dir déi extern IP Adress vun der virtueller Maschinn am Browser aginn, port 3000 spezifizéieren an de schéine Grafana UI gesinn.

Awer net presséiert, ier Dir Grafana opstellt, musst Dir drun erënneren et de Wee op MySQL ze soen fir d'Astellungen do ze spÀicheren.
Déi ganz Konfiguratioun vum Grafana Webserver ass an der Datei /etc/grafana/grafana.ini. Déi erfuerderlech Linn gesÀit esou aus:
;url =Mir setzen den Host op de MySQL Cluster. Déi selwecht Datei enthÀlt de Login a Passwuert fir Zougang zu Grafana am Bild hei uewen, déi als Standard allebéid glÀich sinn admin.
Dir kënnt sed Kommandoen benotzen:
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
Et ass ZĂ€it de Webserver nei ze starten!
sudo service grafana-server restartElo an der Grafana UI spezifizéiere mir ClickHouse als DataSource.
Ech konnt eng Aarbechtskonfiguratioun mat de folgenden Astellungen erreechen:

Ech uginn als URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443
Alles! Mir hunn eng funktionéierend virtuell Maschinn mat engem Webserver verbonne mat CH a MySQL. Dir kënnt d'Dateset schonn op ClickHouse eroplueden an Dashboards bauen. Mir hunn eist Zil awer nach net erreecht an hunn keng vollwÀerteg Infrastruktur agesat.
Packer
Yandex.Cloud erlaabt Iech e Scheifbild vun enger existéierender virtueller Maschinn ze kreéieren, an op senger Basis - all Zuel vu Maschinnen identesch mateneen. Dëst ass genau wat mir wÀerte benotzen. Fir d'Bild bequem ze sammelen, huelt de Tool vun HashiCorp. Et hëlt als Input eng json Datei mat Instruktioune fir d'Bild ze montéieren.
Eis json Datei besteet aus zwee Blocken: Builder a Provisioner. Den éischte Block beschreift d'Parameter vum Bild selwer als Entitéit, an den zweete Block beschreift d'Instruktioune fir et mat dem néidegen Inhalt ze fëllen.
BUILDERS
{
"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"
}
],
...
}An dëser Schabloun musst Dir den Identifizéierer vun der Sektioun an der Wollek setzen, wou Dir d'Bild erstellen wëllt, wéi och de Wee fir d'Datei mat de Schlësselen aus dem Servicekonto, dee virdrun an dëser Sektioun erstallt gouf. Dir kënnt méi iwwer d'Erstelle vu Servicekonten a Schlësselen a Form vun enger Datei an der entspriechender Rubrik liesen .
Dës Konfiguratioun seet datt d'Disk Image baséiert op der Plattform gebaut gëtt ubuntu-1804-lts, an der entspriechender Benotzersektioun an der Bildfamill gesat GRAFANA ënner dem Numm grafana-{{timestamp}}.
Provisoren
Elo kĂ«nnt de mĂ©i interessanten Deel vun der Konfiguratioun. Et wĂ€ert d'Sequenz vun Aktiounen beschreiwen, dĂ©i op der virtueller Maschinn ausgefĂŒhrt musse ginn ier se sĂ€in Zoustand an e Scheifbild afrĂ©ieren.
{
...,
"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"
]
}
]
}Hei sinn all Aktiounen an 3 Etappen opgedeelt. Op der éischter Etapp gëtt en einfache Skript ausgefouert deen en Hilfsverzeechnes erstellt.
preparéieren-ctg.sh:
#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafanaOp der nÀchster Stuf setzen mir e Skript an dësem Verzeichnis, deen direkt no der Start vun der virtueller Maschinn lancéiert muss ginn. Dëse Skript wÀert d'Benotzervariablen setzen déi an der Grafana Konfiguratioun registréiert musse ginn an de Webserver nei starten.
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 restartDuerno bleiwen nach 3 Saachen ze maachen:
1) Packagen installéieren
2) lafen Grafana ënner systemctl an installéiert de ClickHouse Plugin
3) setzt de setup.sh Skript an der Startschlaang direkt nodeems Dir d'virtuell Maschinn aktivéiert.
install-packages.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-datasourcerun-setup-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;Elo bleift alles fir Packer ze lafen an d'Ausgabbild an der spezifizéierter Sektioun ze kréien. Wann Dir eng virtuell Maschinn erstellt, kënnt Dir se als Bootdisk auswielen an nom Start kritt Dir e fÀerdege Grafana Webserver.


Instanz Grupp a Balancer
Wann mir en Disk Image hunn, deen eis erlaabt vill identesch Grafana Webserver ze kreéieren, kënne mir eng Instanzgrupp erstellen. Op der Yandex.Cloud Plattform bezitt dëse Begrëff op d'Gewerkschaft vu virtuelle Maschinnen, déi déiselwecht Charakteristiken hunn. Wann Dir eng Instanzgrupp erstellt, gëtt de Prototyp vun alle Maschinnen an dëser Grupp konfiguréiert, an dann d'Charakteristike vun der Grupp selwer (zum Beispill d'Mindest- a Maximalzuel vun aktive Maschinnen). Wann déi aktuell Zuel dës CritÚren net entsprécht, da wÀert d'Instanzgrupp selwer onnéideg Maschinnen ewechhuelen oder nei a sengem eegene Bild erstellen.
Als Deel vun eiser Aufgab wÀerte mir eng Instanzgrupp vu Webserver erstellen, déi aus dem virdru erstallte Disk Image generéiert ginn.


Wat wierklech bemierkenswÀert ass ass déi lescht Instanz Grupp Setup. D'Zilgrupp an der Integratioun mam Load Balancer hëlleft Iech fir e L3 Balancer uewen op de virtuelle Maschinnen vun dëser Grupp ze konfiguréieren andeems Dir e puer KnÀppercher klickt.

Beim Astellung vum Balancer hunn ech zwee wichteg Punkten ëmgesat:
- Ech hunn de Balancer de Benotzerverkéier um Hafen 80 akzeptéiert an et op den Hafen 3000 vun de virtuelle Maschinnen ëmgeleet, genau wou Grafana wunnt.
- Ech hunn opgestallt d'Viabilitéit vu Maschinnen ze kontrolléieren andeems se se op den Hafen 3000 pingelen.

Mini Resumé
Schlussendlech konnte mir déi gewënscht Applikatiounsinfrastruktur manuell ofsetzen, an elo hu mir en héich elastesche Grafana Service. Dir braucht nëmmen d'IP Adress vum Balancer ze kennen als Entrée fir d'Applikatioun an den Host vum ClickHouse Cluster fir d'Dateset an et ze lueden.
Et géif schéngen wéi eng Victoire? Jo, Victoire. Mee eppes duercherneen mech nach. De ganze Prozess hei uewen erfuerdert vill manuell Schrëtt an ass guer net skalierbar; Ech wéilt et automatiséieren wa méiglech. Dëst ass wat déi nÀchst Sektioun gewidmet ass.
Terraform Integratioun
Mir wÀerten erëm en Outil vun HashiCorp benotzen genannt . Et hëlleft Iech déi ganz Applikatiounsinfrastruktur mat engem Klick op e KnÀppchen z'installéieren, baséiert op verschidde Variabelen, déi vum Benotzer passéiert sinn. Loosst eis e Rezept schreiwen dat e puer Mol a verschiddene Sektioune vu verschiddene Benotzer ka lafen.
All Aarbecht mat Terraform geet erof op d'Schreiwen vun enger Konfiguratiounsdatei (*.tf) an d'Schafe vun Infrastrukturen op der Basis.
VerÀnnerlechen
Ganz am Ufank vum Fichier wĂ€erte mir Variablen enthalen dĂ©i bestĂ«mmen wou a wĂ©i dĂ©i zukĂŒnfteg Infrastruktur agesat gĂ«tt.
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>"
}De ganze Applikatiouns-Deploymentprozess wÀert erofgoen fir en Disk Image ze bauen an dës Variablen ze setzen. Loosst mech erklÀre fir wat se verantwortlech sinn:
oauth_token - en Token fir Zougang zu der Wollek. Kann duerch kritt ginn .
cloud_id - Cloud Identifizéierer wou mir d'Applikatioun ofsetzen
folder_id - Sektioun Identifizéierer wou mir d'Applikatioun ofsetzen
service_account_id - Service Account Identifizéierer an der entspriechender Sektioun vun der Wollek.
image_id - Identifizéierer vum Disk Image kritt mat Packer
Benotzernumm О Passwuert - Benotzernumm a Passwuert fir Zougang zu béid Datenbanken an de Grafana Webserver
dbnumm - Datebank Numm bannent CH a MySQL Cluster
public_key_path - Wee op d'Datei mat Ărem Ă«ffentleche ssh SchlĂ«ssel, deen Dir benotze kĂ«nnt fir Ă«nner dem Numm ze verbannen ubuntu zu virtuelle Maschinnen mat Webserver
Provider Setup
Elo musst Dir den Terraform Provider konfiguréieren - an eisem Fall, Yandex:
provider "yandex" {
token = var.oauth_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
Dir wÀert feststellen datt hei mir d'Variabelen benotzen déi hei uewen definéiert sinn.
Netzwierk a StÀrekéip
Elo wÀerte mir en Netz erstellen an deem Elementer vun eiser Infrastruktur kommunizéieren, drÀi Subnets (een an all Regioun) an CH an MySQL Cluster erhéijen.
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
}
}Wéi Dir kënnt gesinn, ass jidderee vun deenen zwee StÀrekéip zimmlech Feelertolerant erstallt andeems se an drÀi Disponibilitéitszonen lokaliséiert sinn.
Web Serveren
Et géif schéngen datt mir am selwechte Geescht weiderfuere kënnen, awer ech sinn a Schwieregkeeten gerannt. Virun dësem hunn ech fir d'éischt e MySQL Cluster opgeworf an eréischt duerno, well ech seng ID kennen, hunn ech e Disk Image mat der erfuerderter Konfiguratioun gesammelt, wou ech den Host an de Cluster spezifizéiert hunn. Awer elo kennen mir d'Cluster ID net ier Dir Terraform lancéiert, och zum ZÀitpunkt vum Bau vum Bild. Dofir hunn ech missen op déi folgend zréckgrÀifen .
Mat Amazon's Metadatenservice benotze mir e puer Parameteren un déi virtuell Maschinn, déi se akzeptéiert a veraarbecht. Mir brauchen d'Maschinn fir op d'Metadaten hannert dem MySQL Clusterhost a Benotzernumm-Passwuert ze goen, wat de Benotzer an der Terraform-Datei spezifizéiert huet, nom Start. Loosst eis den Inhalt vun der Datei liicht Ànneren setup.sh, déi leeft wann déi virtuell Maschinn ageschalt ass.
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 restartIntanz Grupp a Balancer
Nodeems mir en neit Disk Image nei opgebaut hunn, kënne mir endlech eis Datei fir Terraform derbÀisetzen.
Loosst eis uginn datt mir en existent Disk Image benotze wëllen:
data "yandex_compute_image" "grafana_image" {
image_id = var.image_id
}Loosst eis elo eng Instanzgrupp erstellen:
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"
}
}Et ass derwÀert opmierksam ze maachen wéi mir et an d'Metadaten iwwerginn hunn cluster_uri, username О password. Et ass dës déi d'virtuell Maschinn beim Start eraushëlt an an d'Grafana Config setzt.
Et ass un de Balancer.
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
}
}
}
}E bësse Zocker
Et bleift nëmmen e bëssen. Nodeems d'Infrastruktur ofgesat ass, musst Dir op d'Grafana UI goen an den CH Cluster manuell addéieren (d'ID vun deem nach ëmmer kritt muss ginn) als Datenquell. Awer Terraform weess de Cluster ID. Loosst eis him uvertraut d'Saach op d'Been ze bréngen.
Loosst eis en neie Provider addĂ©ieren - Grafana, a gitt hir d'IP Adress vum Balancer als Host. All Ănnerungen dĂ©i Terraform op der Maschinn mĂ©cht, wou sĂ€i Balancer bestĂ«mmt, wĂ€erten am MySQL wuessen, an dofir op all aner Maschinnen.
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"
}Komm mir kÀmmen eis Hoer
Loosst eis d'Balancer IP Adress an den Host vum ClickHouse Cluster weisen
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"
}Dir kënnt lafen
Alles! Eis Konfiguratiounsdatei ass prett a mir kënnen, andeems Dir d'Variabelen setzt, Terraform soen fir alles z'erhéijen wat mir hei uewen beschriwwen hunn. De ganze Prozess huet mech ongeféier 15 Minutten gedauert.
Um Enn kënnt Dir e schéine Message gesinn:
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.25An an der Wollek wÀerten Elementer vun der opgehuewe Infrastruktur siichtbar sinn:

Loosst eis d'Resultater summen
Elo, mat Grafana als Beispill, kann jidderee vun iech Uwendungen mat enger verbreeter Cloudarchitektur op der Yandex.Cloud Plattform ofsetzen. Nëtzlech Tools vun HashiCorp wéi Packer an Terraform kënnen Iech mat dësem hëllefen. Ech hoffen, datt een dësen Artikel nëtzlech fënnt :)
PS Hei drënner wÀert ech e Link op de Repository befestegt wou Dir fÀerdeg Rezepter fir Packer an Terraform fannt, Fragmenter vun deenen ech an dësem Artikel geliwwert hunn.
Source: will.com
