HashiCorp Vault vs AWS Secrets Manager: Perbandingan Mendalam + Contoh Implementasi di Golang
Dalam arsitektur modern, secret management bukan lagi sekadar menyimpan password di environment variable. API key, database credential, token OAuth, certificate, hingga encryption key harus dikelola dengan aman, bisa di-rotate, dan terkontrol dengan baik.
Dua solusi yang paling sering dibandingkan adalah HashiCorp Vault dan AWS Secrets Manager. Artikel ini akan membahas:
- Perbedaan filosofis Vault vs AWS Secrets Manager
- Kapan sebaiknya menggunakan masing-masing
- Contoh penggunaan di Golang (real-world oriented)
Filosofi Dasar
HashiCorp Vault
Vault dibangun dengan filosofi:
Secrets should be short-lived, dynamic, and tightly controlled.
Ciri utama:
- Dynamic secrets (credential dibuat on-demand)
- Lease + TTL (secret bisa expired otomatis)
- Identity-based access (Kubernetes, OIDC, LDAP, dll)
- Vendor agnostic (multi-cloud / on-prem)
Vault bukan hanya secret store, tapi security broker.
AWS Secrets Manager
AWS Secrets Manager dibangun dengan filosofi:
Managed, simple, and tightly integrated with AWS.
Ciri utama:
- Fully managed service
- Secret bersifat static, tapi bisa di-rotate
- Akses berbasis IAM
- Native integration dengan RDS, Lambda, ECS, EKS
Secrets Manager adalah secure key-value store dengan rotasi.
Perbandingan Fitur Utama
| Aspek | HashiCorp Vault | AWS Secrets Manager |
|---|---|---|
| Deployment | Self-hosted / HCP | Fully managed AWS |
| Dynamic Secret | ✅ Ya | ❌ Tidak |
| Lease / TTL | ✅ Ya | ❌ Tidak |
| Rotasi Secret | Flexible | Built-in (Lambda) |
| Policy Engine | Vault Policy (HCL) | IAM Policy |
| Multi-Cloud | ✅ Ya | ❌ AWS only |
| Operational Overhead | Tinggi | Rendah |
Contoh Kasus Nyata
Database Credential
- Vault: Aplikasi meminta credential → Vault generate user DB baru → TTL 1 jam → expired otomatis.
- Secrets Manager: Password DB disimpan → di-rotate periodik (misal 30 hari).
Implikasi penting:
- Vault cocok untuk zero-trust & high security.
- Secrets Manager cocok untuk simplicity & AWS-native.
Contoh Implementasi HashiCorp Vault di Golang
Setup Singkat
Misal:
- Vault sudah running
- Auth method: Token (untuk contoh sederhana)
- Secret disimpan di path:
secret/data/myapp/db
Isi secret:
{
"username": "dbuser",
"password": "supersecret"
}
Install Dependency
go get github.com/hashicorp/vault/api
Mengambil Secret dari Vault
package main
import (
"fmt"
"log"
vault "github.com/hashicorp/vault/api"
)
func main() {
config := vault.DefaultConfig()
config.Address = "http://127.0.0.1:8200"
client, err := vault.NewClient(config)
if err != nil {
log.Fatal(err)
}
client.SetToken("VAULT_TOKEN")
secret, err := client.Logical().Read("secret/data/myapp/db")
if err != nil {
log.Fatal(err)
}
if secret == nil {
log.Fatal("secret not found")
}
data := secret.Data["data"].(map[string]interface{})
username := data["username"].(string)
password := data["password"].(string)
fmt.Println("Username:", username)
fmt.Println("Password:", password)
}
Dynamic Database Credential (Nilai Tambah Vault)
Vault bisa meng-generate credential DB secara dinamis:
secret, err := client.Logical().Read("database/creds/my-role")
username := secret.Data["username"].(string)
password := secret.Data["password"].(string)
🔑 Credential ini:
- Dibuat otomatis
- Memiliki TTL
- Akan di-revoke otomatis saat expired
Ini tidak bisa dilakukan oleh AWS Secrets Manager.
Contoh Implementasi AWS Secrets Manager di Golang
Setup Dependency
go get github.com/aws/aws-sdk-go-v2
Mengambil Secret
Misal secret bernama: prod/myapp/db
{
"username": "dbuser",
"password": "supersecret"
}
Golang Code
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/secretsmanager"
)
type DBSecret struct {
Username string `json:"username"`
Password string `json:"password"`
}
func main() {
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
log.Fatal(err)
}
client := secretsmanager.NewFromConfig(cfg)
input := &secretsmanager.GetSecretValueInput{
SecretId: aws.String("prod/myapp/db"),
}
result, err := client.GetSecretValue(context.TODO(), input)
if err != nil {
log.Fatal(err)
}
var secret DBSecret
err = json.Unmarshal([]byte(*result.SecretString), &secret)
if err != nil {
log.Fatal(err)
}
fmt.Println("Username:", secret.Username)
fmt.Println("Password:", secret.Password)
}
Perbandingan dari Sudut Pandang Engineer Backend
Kapan Vault Cocok
- Menggunakan Kubernetes secara intensif
- Multi-cloud / hybrid
- Ingin short-lived credential
- Security adalah prioritas utama
Kapan AWS Secrets Manager Cocok
- 100% AWS
- Tim kecil / startup
- Tidak ingin overhead operasional
- Aplikasi serverless
Anti-Pattern yang Sering Terjadi
- ❌ Menggunakan Vault hanya sebagai key-value store statis
- ❌ Menggunakan Secrets Manager untuk kebutuhan dynamic credential
- ❌ Hardcode secret name tanpa environment abstraction
Rekomendasi Arsitektur
| Skala | Rekomendasi |
|---|---|
| Small AWS-only | AWS Secrets Manager |
| Medium (AWS + K8s) | Vault (Self-host / HCP) |
| Enterprise | Vault + IAM Integration |
Kesimpulan
HashiCorp Vault dan AWS Secrets Manager bukan kompetitor langsung, tapi menyasar problem yang berbeda.
- Vault = Security platform
- Secrets Manager = Managed secret store
Jika kamu butuh kontrol, fleksibilitas, dan dynamic secret, Vault adalah pilihan tepat. Jika kamu butuh kecepatan, kemudahan, dan AWS-native, Secrets Manager lebih masuk akal.