AWS Secrets Manager

AWS Secrets Manager란?

DB 비밀번호, API 키, 접속 정보 등 민감한 정보(시크릿)를 중앙에서 안전하게 저장·관리하는 AWS 서비스다.

코드나 환경변수에 직접 자격증명을 박아넣는 대신, Secrets Manager에 저장해두고 애플리케이션이 필요할 때 API로 가져간다.


주요 특징

  • 중앙 관리: DB 접속정보, 캐시 비밀번호, 외부 API 키 등을 한 곳에서 관리
  • 버전 관리: 시크릿 변경 이력이 남고, 이전 버전으로 롤백 가능
  • 자동 교체(Rotation): Lambda를 이용한 자동 비밀번호 교체 지원
  • IAM 기반 접근 제어: 어떤 역할/서비스가 어떤 시크릿에 접근할 수 있는지 세밀하게 제어
  • 암호화: KMS(Key Management Service)로 저장 시 암호화

시크릿 구조

시크릿은 키-값 JSON 형태로 저장된다.

{
  "host": "my-db.cluster.ap-northeast-2.rds.amazonaws.com",
  "port": "5432",
  "username": "app_user",
  "password": "s3cr3tP@ssw0rd",
  "dbname": "mydb"
}

시크릿 이름은 경로 형태로 계층화해서 관리하는 경우가 많다.

/prod/myapp/db
/prod/myapp/redis
/staging/myapp/db

Kubernetes와 연동 방법

External Secrets Operator (ESO)

쿠버네티스에서 Secrets Manager의 값을 자동으로 가져와 Kubernetes Secret으로 동기화해주는 오퍼레이터.

Secrets Manager
  ↓ (ESO가 주기적으로 동기화)
Kubernetes Secret
  ↓
파드 환경변수 또는 볼륨으로 마운트
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: my-app-secret
spec:
  refreshInterval: 1h          # 동기화 주기
  secretStoreRef:
    name: aws-secrets-store
    kind: SecretStore
  target:
    name: my-app-secret        # 생성될 Kubernetes Secret 이름
  data:
    - secretKey: db-password   # K8s Secret의 키
      remoteRef:
        key: /prod/myapp/db    # Secrets Manager의 시크릿 이름
        property: password     # JSON 내 필드

SecretStore

ESO가 AWS에 접근할 때 사용할 인증 정보를 정의한다.

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-secrets-store
spec:
  provider:
    aws:
      service: SecretsManager
      region: ap-northeast-2
      auth:
        jwt:
          serviceAccountRef:
            name: external-secrets-sa   # IRSA로 AWS 권한 부여

파드에서 사용

Kubernetes Secret으로 동기화된 값을 파드 환경변수나 볼륨으로 주입한다.

env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: my-app-secret
        key: db-password

IAM 권한 설정

파드(서비스 어카운트)가 Secrets Manager에 접근하려면 IAM 정책이 필요하다. IRSA(IAM Roles for Service Accounts)로 파드에 역할을 부여한다.

{
  "Effect": "Allow",
  "Action": [
    "secretsmanager:GetSecretValue",
    "secretsmanager:DescribeSecret"
  ],
  "Resource": "arn:aws:secretsmanager:ap-northeast-2:123456789:secret:/prod/myapp/*"
}

AWS Parameter Store와의 차이

Secrets ManagerParameter Store
용도민감한 자격증명설정값, 비민감 정보도 포함
자동 교체지원미지원
비용유료 (시크릿당 과금)기본 무료 (Advanced는 유료)
주로 쓰는 경우DB 비밀번호, API 키앱 설정, 기능 플래그

주의사항

  • 시크릿 이름은 삭제 후 7~30일간 복구 대기 상태가 되며, 그 기간에는 같은 이름으로 재생성 불가
  • ESO의 refreshInterval이 있어도 즉각 반영은 아님. 파드 재시작이 필요한 경우 별도 트리거 필요
  • Secrets Manager는 시크릿 수와 API 호출 수 기준으로 과금됨