/툴 리뷰/Vault vs AWS Secrets Manager vs SOPS: Cost Comparison and Selection Criteria
Tool Reviews시크릿관리HashiCorp Vault

Vault vs AWS Secrets Manager vs SOPS: Cost Comparison and Selection Criteria

We compared three secret-management tools by monthly cost formulas and operational burden—not feature checklists. Included: monthly bills for 30, 300, and 1,000 secrets, five SOPS age commands, ESO integration YAML, and how to judge Vault’s

Vault vs AWS Secrets Manager vs SOPS: Cost Comparison and Selection Criteria

Why “What do you use for secrets?” has no single right answer

Secret-management comparison posts are everywhere, but after reading them you end up right back where you started. Feature tables give Vault an overwhelming number of checkmarks, so it feels like you should adopt Vault—except your team has maybe 30 secrets and 1.5 infrastructure people.

The problem is the comparison criteria. The real cost of choosing a tool is monthly infrastructure bill + ops labor + recovery time when something breaks, yet most comparison tables don’t even calculate the first item. If a 30-secret team stands up a 3-node Vault HA cluster, the labor spent documenting unseal procedures and rehearsing Raft snapshot recovery will dwarf the EC2 bill.

This post judges the three tools on these criteria only:

  • Scenario-by-scenario monthly bills, with the formulas shown as-is
  • Blast radius when an incident hits at 3 a.m.
  • What evidence you can submit in an ISMS-P audit

If you want a deeper look at Kubernetes integration architecture itself, see How to Fully Manage Kubernetes Secret Security Vulnerabilities with Vault and the CSI Driver and Kubernetes Secret Management: Vault vs AWS Secrets Manager Comparison and Optimal Architecture Guide. This post focuses on money and people, not architecture.

These three are different kinds of things to begin with

First thing to get straight: SOPS is not a secret store; it is an encryption format. Vault and ASM are “servers that store secrets and serve them over an API,” while SOPS is “a CLI tool that encrypts only the value portions of YAML/JSON files.” Storage is your Git repository’s job. Miss this difference and the comparison doesn’t even hold.

AxisHashiCorp VaultAWS Secrets ManagerSOPS + age
Central serverRequired (self-hosted or HCP)Managed; no server opsNo server (files + Git)
Dynamic secretsSupported (DB/cloud credentials issued with TTL)Not supported (static values + rotation)Not supported
Audit logsaudit device (file/syslog/socket)CloudTrail eventsSubstituted by Git commit history
Automatic rotationBuilt-in (per-engine rotate)Lambda-based rotationManual (re-encrypt then commit)
K8s integrationVault Agent Injector sidecar injection / Secrets Store CSI DriverExternal Secrets Operator polls and creates Secretskustomize-sops decrypts at build time
Multi-cloudCloud-neutralAWS-boundCloud-neutral (choose KMS or age)

The decisive axis that splits the field is dynamic secrets. If you actually need “issue a one-hour DB login at request time and auto-revoke it,” there is effectively no choice besides Vault. If you don’t have that requirement, a large share of Vault’s feature-table advantage is value that never gets billed to your team.

Monthly cost: unit prices and formulas, shown as-is

Pricing snapshot: August 2026 / region: Seoul (ap-northeast-2) / on-demand. AWS unit prices can change, so reconfirm on the official AWS pricing page before making a final decision.

The core formulas are three lines:

  • AWS Secrets Manager: secret count × $0.40 + (API calls ÷ 10,000) × $0.05
  • SOPS + age: If you also use KMS, number of keys × $1.00 + decrypt API call cost. Using age keys only, infrastructure cost is $0
  • Vault self-hosted: EC2 instance + EBS + NLB + ops labor (hours/month × hourly rate)

Splitting ops labor into its own row is the point of this calculation. For convenience, hourly rate is set at ₩50,000 (about $36). Plug in your team’s actual labor cost and recalculate.

Scenario 1: 30 secrets / 50,000 API calls / 3 developers

ItemVault (self-hosted, single node)AWS Secrets ManagerSOPS + age
Infrastructure1× t3.small ≈ $19 + 20 GB EBS ≈ $2$0$0
Secrets/API-30 × $0.40 = $12 + (50,000÷10,000)×$0.05 = $0.25 → $12.25$0
Ops labor8 hours/month × $36 = $2881 hour/month = $361 hour/month = $36
Monthly total≈ $309≈ $48≈ $36

At 30 secrets, Vault’s ops labor ($288) is 13× the infrastructure cost ($21). Standing up Vault in this range is clearly over-investment.

Scenario 2: 300 secrets / 2 million API calls / 15 services

ItemVault (HA, 3 nodes)AWS Secrets ManagerSOPS + age
Infrastructure3× t3.medium ≈ $114 + EBS ≈ $9 + NLB ≈ $20 → $143$0$0
Secrets/API-300 × $0.40 = $120 + (2,000,000÷10,000)×$0.05 = $10 → $130$0
Ops labor20 hours/month × $36 = $7204 hours/month = $14416 hours/month = $576
Monthly total≈ $863≈ $274≈ $612

This is where it flips. SOPS infrastructure stays $0, but once you pass 300 secrets and 15 services, the burden of managing “who can decrypt what with which key” via creation_rules in .sops.yaml grows sharply. When a developer joins or leaves, you remove their key from the age recipient list and re-encrypt every file—and that work scales with the number of files.

Empirically, the break-even sits in the 100–150 secret range. ASM cost scales linearly with secret count ($0.40) while ops time barely grows; SOPS costs $0 but ops time grows almost linearly with secret count. You’re trading 150 × $0.40 = $60 for about 1.7 hours of labor—and a single re-encryption pass already exceeds that.

Scenario 3: 1,000 secrets / multi-region, multi-cloud

ItemVault (HA 3 nodes × 2 regions)AWS Secrets Manager (replication)SOPS + age
Infrastructure≈ $290$0$0
Secrets/API-1,000 × $0.40 = $400 + extra replica-region charges + API cost → $450+$0
Ops labor40 hours/month = $1,4408 hours/month = $288Effectively unmanageable
Monthly total≈ $1,730≈ $738Not recommended

In this range SOPS drops out not on cost but on operability. If you are AWS-only, ASM is still cheaper; if you are multi-cloud or dynamic credentials are mandatory, Vault’s $1,730 is justified.

Beyond money: learning curve and blast radius

ItemVaultAWS Secrets ManagerSOPS + age
Initial setup timeSeveral days for HAHalf a day (including ESO)30 minutes
Seal operationsUnseal keys must be stored separately; Auto-unseal (KMS) strongly recommendedN/AN/A
Blast radius on failureVault seal → all new deploys and restarts stopESO sync fails during an AWS region outage (existing Secrets remain)No impact on already-deployed workloads (decrypt at build time)
Backup & recoveryRaft snapshot save/restore rehearsal requiredManaged; recoverable within the deletion waiting periodBacking up the age private key is everything (if lost, nothing is recoverable)
Failure modeOperator error (seal, token expiry, policy mistakes)Permissions/limits (IAM, throttling)Key loss (irreversible)

On blast radius alone, SOPS is the safest. Decryption finishes in the deploy pipeline, so there is no runtime dependency. Vault has the largest runtime dependency, which is why Auto-unseal is not optional—it is effectively mandatory. If you run with manual unseal, a 3 a.m. incident means waking three people who each hold one of three unseal key shares at the same time.

Vault’s BSL switch: when it matters and when it doesn’t

In August 2023, HashiCorp changed the license of its major products from MPL 2.0 to the BSL (Business Source License). A community fork, OpenBao, later launched under the Linux Foundation and continues development under an MPL-family license.

The decision rule is surprisingly simple.

  • Doesn’t apply: You install Vault internally to manage in-house secrets for your own services → ordinary internal use is not restricted by BSL. Most startups and mid-size companies fall here.
  • Needs review: You offer secret-management as a service to customers on top of Vault, or resell it as a core feature of a SaaS product → this can fall under HashiCorp’s “competitive product” interpretation, so legal review is required.

Final interpretation of the license terms must follow the original text and legal review. This section only sketches the direction; confirm against the BSL text and in-house counsel before adopting. If license risk bothers you but you still need Vault’s dynamic secrets, OpenBao is a practical alternative.

Mapping to ISMS-P cryptographic-key management controls

Evidence commonly requested in Korean certification audits is “key generation, storage, rotation, and destruction history” plus “access-control records.”

Required evidenceVaultAWS Secrets ManagerSOPS + age
Access recordsaudit device JSON logs (requester, path, timestamp)CloudTrail events (GetSecretValue, etc.)Git commit log (who changed what, when) — no read/access log
Key rotation historyRotation logs + versionsVersion stamps + rotation historyRe-encryption commit history
Separation of dutiespolicy documentsIAM policies + resource policies.sops.yaml creation_rules

SOPS’s weakness is clear: it cannot record who read a secret. You have change history, not access history. If an audit item requires read-audit evidence, SOPS alone is likely insufficient—check the original control language first.

On region and support, AWS Secrets Manager is available in Seoul (ap-northeast-2) and offers Korean documentation plus Korean-language response via paid support plans. Vault and SOPS are community-centric; official docs are English-first.

Decision table: five questions

#QuestionYes →No →
1Must DB credentials be issued with a TTL at request time?Vault / OpenBaoGo to 2
2Multi-cloud or on-prem in parallel?Vault / OpenBaoGo to 3
3AWS-only and 150+ secrets?ASM + ESOGo to 4
4Want manifests and secrets together in Git (GitOps)?SOPS + ageGo to 5
5Is submitting read audit logs for secrets mandatory?ASM (CloudTrail)SOPS + age

There is also a realistic hybrid: keep application config in Git with SOPS, and put only rotation-needed items like DB passwords in ASM. In the 100–200 secret range, that mix balances cost and ops burden best.

Do this today: five lines to encrypt .env with SOPS

Bash
# 1. age 키 생성 (개인키는 절대 커밋 금지)
age-keygen -o ~/.config/sops/age/keys.txt

# 2. 공개키 확인 (age1... 로 시작하는 문자열)
grep "public key" ~/.config/sops/age/keys.txt

# 3. .sops.yaml 작성 — 복수 수신자로 키 분실 대비
cat > .sops.yaml <<'EOF'
creation_rules:
  - path_regex: secrets/.*\.yaml$
    age: >-
      age1abc...개발자A공개키,
      age1def...백업용공개키
EOF

# 4. 평문 YAML 암호화 (값만 암호화, 키 이름은 평문 유지)
sops -e secrets/prod.yaml > secrets/prod.enc.yaml && rm secrets/prod.yaml

# 5. 커밋
git add .sops.yaml secrets/prod.enc.yaml && git commit -m "chore: encrypt prod secrets with SOPS"

Expected result: open secrets/prod.enc.yaml and the key names are readable, values have become ENC[AES256_GCM,data:...], and a sops: metadata block is appended at the bottom. If values are still plaintext, path_regex in .sops.yaml doesn’t match the actual path—fix the path pattern first.

To verify decryption: sops -d secrets/prod.enc.yaml. A no matching creation rules error means a rule mismatch; failed to get the data key means SOPS_AGE_KEY_FILE does not point at the private-key path.

If you use ASM: minimal ESO YAML

YAML
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-secretsmanager
  namespace: prod
spec:
  provider:
    aws:
      service: SecretsManager
      region: ap-northeast-2
      auth:
        jwt:
          serviceAccountRef:
            name: external-secrets-sa
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: app-db-secret
  namespace: prod
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secretsmanager
    kind: SecretStore
  target:
    name: app-db-secret
  data:
    - secretKey: DB_PASSWORD
      remoteRef:
        key: prod/app/db
        property: password

After applying, if kubectl get externalsecret -n prod shows STATUS SecretSynced, you’re good. If you see SecretSyncedError, first check that the IRSA service account has secretsmanager:GetSecretValue.

Failure-path checklist (three cases)

1. Vault is sealed and deploys are fully stopped

Bash
vault status                      # Sealed: true 확인
vault operator unseal <key-share-1>
vault operator unseal <key-share-2>
vault operator unseal <key-share-3>   # threshold 만큼 반복

Prevention is switching to KMS Auto-unseal. After you configure it, a restart unseals without human intervention.

HCL
seal "awskms" {
  region     = "ap-northeast-2"
  kms_key_id = "arn:aws:kms:ap-northeast-2:<account-id>:key/<key-id>"
}

2. You lost the age private key

There is no recovery. Prevention is the only answer. Specify multiple recipients at encrypt time.

Bash
sops -e --age "age1개발자키,age1백업키,age1CI키" secrets/prod.yaml > secrets/prod.enc.yaml
# 이미 암호화된 파일에 수신자 추가
sops updatekeys secrets/prod.enc.yaml

3. You deleted an ASM secret and cannot recreate it under the same name

ASM uses a 7–30 day recovery window by default, so a name in that window cannot be reused.

Bash
# 복구 (권장)
aws secretsmanager restore-secret --secret-id prod/app/db --region ap-northeast-2

# 즉시 완전 삭제 후 재생성 — 복구 불가, 신중히
aws secretsmanager delete-secret --secret-id prod/app/db \
  --force-delete-without-recovery --region ap-northeast-2

FAQ

Q. At what secret count should you move to AWS Secrets Manager? A. On infrastructure cost alone SOPS is always cheaper, but once you convert ops time to labor cost the crossover is in the 100–150 secret range. At 150 secrets, ASM is 150 × $0.40 = $60; at that scale, SOPS re-encryption and key management already exceed two hours a month.

Q. Do we have to rip out Vault because of the BSL change? A. Internal use for running your own services is generally fine. Legal review is needed only if you provide or resell secret-management to customers on top of Vault. If you want to avoid license risk entirely, the OpenBao fork is the alternative.

Q. Can SOPS alone pass ISMS-P cryptographic-key management controls? A. You can submit change history (Git commits), but there is no read history. If a control requires access/read audit, SOPS alone may not be enough. Check the original control language and, if needed, consider pairing ASM (CloudTrail) or a Vault audit device.

확인 정보
✦ ✦ ✦
편집 검토 · Editorial Review

Nodelog는 모든 콘텐츠의 내용과 출처를 공개 전에 검토합니다. 환경(OS·버전)에 따라 결과가 달라질 수 있는 기술 정보는 공식 문서와 함께 확인하며, 검토 기준과 정정 원칙은 편집 정책에서 안내합니다. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.

편집 책임 · Nodelog 기술 편집팀·발행 · ·업데이트 ·

Comments

Be the first to comment.