Mengelola Elasticsearch sebagai code: versioning index template, ILM policy, dan ingest pipeline; automated testing query dan schema validation; deployment otomatis dengan Terraform, Ansible, dan GitOps; serta deteksi configuration drift.

Kalian pernah "melakukan setup manual" yang berulang-ulang? Konfigurasi Elasticsearch yang dibuat dengan klik dan ketik di console tidak terdokumentasi, tidak bisa di-review, dan tidak bisa di-rollback. Di organisasi yang sehat, semua konfigurasi diperlakukan seperti kode: versioned, di-review, diuji, dan di-deploy lewat pipeline. Episode 28 membahas cara ini — index management as code, CI/CD untuk menguji dan men-deploy perubahan Elasticsearch, serta infrastructure as code dengan Terraform, Ansible, dan GitOps, ditutup dengan deteksi configuration drift.
Semua yang kita bahas sebagai "request manual" di episode sebelumnya bisa disimpan sebagai file dalam repository:
File-file ini direview lewat pull request, dites di cluster staging, lalu diterapkan ke production. Contoh template sebagai file YAML:
---
index_patterns: ["logs-*"]
data_stream: {}
template:
settings: { number_of_shards: 2, number_of_replicas: 1, index.lifecycle.name: logs-policy }
mappings:
properties:
"@timestamp": { type: date }
level: { type: keyword }
message: { type: text }Tip
Prinsip versioning yang jelas: setiap perubahan schema diberi nomor versi (misalnya logs-template-v2), perubahan yang butuh reindex dibuat sebagai migration script terpisah, dan semua dijalankan berurutan di pipeline. Deployment Elasticsearch yang baik menyerupai migration database — bertahap, teruji, dan bisa rollback.
CI bisa menjalankan serangkaian test terhadap instance Elasticsearch sementara (misalnya memakai docker compose cluster lab, episode 27) — pastikan cluster sehat dulu dengan curl -s localhost:9200/_cluster/health:
steps:
- name: Setup cluster test
run: docker compose up -d
- name: Terapkan template
run: curl -sS -X PUT localhost:9200/_index_template/logs-template --data-binary @index-template-log.yaml
- name: Jalankan integration test
run: python3 -m pytest tests/test_search.pyTest yang masuk akal:
Ukur baseline dengan dataset tetap, lalu bandingkan: jika query yang tadinya 50 ms menjadi 500 ms setelah perubahan mapping, pipeline harus gagal sebelum perubahan sampai ke production. Ini memerlukan cluster benchmark dengan data yang representatif — bukan hanya "bisa jalan".
Deployment perubahan Elasticsearch ke production mengikuti urutan aman:
Terraform mendeklarasikan infrastruktur — termasuk Elasticsearch — sebagai code. Provider komunitas elastic/elasticsearch mendukung resource index, template, ILM, dan user/role:
terraform {
required_providers {
elasticsearch = { source = "elastic/elasticsearch", version = "~> 8.0" }
}
}
provider "elasticsearch" {
url = "https://node1:9200"
username = "terraform"
password = var.es_password
insecure = false
}
resource "elasticsearch_index_template" "logs" {
name = "logs-template"
body = jsonencode({
index_patterns = ["logs-*"]
template = { settings = { number_of_shards = 2, number_of_replicas = 1 } }
})
}Dengan terraform plan, kalian melihat exactly apa yang akan berubah sebelum terraform apply — dan Terraform state mendeteksi kalau ada yang berbeda dari yang dideklarasikan (drift).
Ansible bagus untuk konfigurasi mesin dan bootstrap — misalnya menyetel vm.max_map_count, memasang plugin, dan menerapkan elasticsearch.yml:
- name: Siapkan node Elasticsearch
hosts: es_nodes
become: yes
tasks:
- name: Set vm.max_map_count
sysctl: { name: vm.max_map_count, value: "262144" }
- name: Pasang repository Elastic
yum_repository: { name: elastic, state: present }
- name: Install elasticsearch
dnf: { name: elasticsearch, state: present }
- name: Terapkan elasticsearch.yml
template: { src: elasticsearch.yml.j2, dest: /etc/elasticsearch/elasticsearch.yml }
notify: restart elasticsearchPola templating elasticsearch.yml.j2 membuat satu playbook melayani banyak environment dengan nilai yang berbeda-beda.
GitOps memperlakukan git sebagai satu-satunya sumber kebenaran: perubahan dilakukan via pull request, dan tool (Argo CD, Flux, atau pipeline custom) menyinkronkan state git ke lingkungan hidup. Keuntungannya: semua perubahan tercatat di git, ada review, ada audit trail, dan drift langsung terdeteksi karena sinkronisasi otomatis.
Untuk Elasticsearch, GitOps berarti: repository berisi template, ILM, pipeline, role — dan pipeline menerapkannya ke cluster saat ada commit di main branch. Perubahan manual di cluster yang tidak ada di git akan di-revert oleh sinkronisasi berikutnya.
Configuration drift terjadi ketika cluster melenceng dari yang dideklarasikan — misalnya seseorang mengubah settings via console manual. Cara mendeteksinya:
GET /_index_template/logs-template?filter_path=*.index_patterns,*.templatePola yang umum: pipeline rutin mengambil state cluster (template, ILM, roles) dan membandingkannya dengan file di git — jika berbeda, pipeline gagal atau mengembalikannya. Terraform (terraform plan) dan GitOps sync keduanya menyediakan mekanisme ini.
Warning
Drift bukan selalu kesalahan manusia — bisa juga efek samping upgrade atau reindex yang wajar. Yang penting: drift yang tidak diketahui. Terapkan mekanisme deteksi rutin dan dokumentasikan perubahan yang memang disengaja, sehingga perbedaan "tidak dikenal" segera menarik perhatian.
Konfigurasi hanya di console. Tidak terdokumentasi dan tidak bisa di-review — perlakukan sebagai code.
Deploy breaking change langsung. Mapping baru harus lewat reindex + alias, bukan timpa langsung.
Tanpa performance regression test. Query yang melambat lolos ke production tanpa disadari.
Tanpa drift detection. Cluster melenceng dari git tanpa ada yang tahu.
Secret di repository. Password dan API keys di git = kebocoran — gunakan secret manager dan variable pipeline.
Di episode 28 kalian menguasai CI/CD dan infrastructure as code: index templates, ILM policies, dan ingest pipelines sebagai file yang di-version; automated testing (schema validation, query tests, performance regression) di pipeline; strategi deployment bertahap; serta Terraform, Ansible, GitOps, dan deteksi configuration drift.
Inti yang harus dibawa pulang:
Konfigurasi yang terdokumentasi dan teruji membuat sistem lebih tangguh. Tapi ketangguhan sejati butuh satu lapisan lagi. Di episode 29 kita bahas high availability dan disaster recovery: desain multi-node dengan master quorum anti split-brain, redundansi data node, zone-aware replica allocation; strategi multi-region, perencanaan RPO dan RTO, prosedur failover, dan testing DR berkala. Sampai jumpa!