HashiCorp Vault vs AWS Secrets Manager: Perbandingan Mendalam + Contoh Implementasi di Golang
3 min read

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

AspekHashiCorp VaultAWS Secrets Manager
DeploymentSelf-hosted / HCPFully managed AWS
Dynamic Secret✅ Ya❌ Tidak
Lease / TTL✅ Ya❌ Tidak
Rotasi SecretFlexibleBuilt-in (Lambda)
Policy EngineVault Policy (HCL)IAM Policy
Multi-Cloud✅ Ya❌ AWS only
Operational OverheadTinggiRendah

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

SkalaRekomendasi
Small AWS-onlyAWS Secrets Manager
Medium (AWS + K8s)Vault (Self-host / HCP)
EnterpriseVault + 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.