본문으로 건너뛰기
김신건의 로그

[AWS] Secrets Manager + Parameter Store

· 수정 · 📖 약 2분 · 868자/단어 #aws #secrets #parameter-store #security #cloud #rotation
AWS Secrets Manager, Secrets Manager, Parameter Store, SSM Parameter Store, SSM Parameter, secret rotation, 비밀 관리

정의

AWS Secrets Manager = 회전이 필요한 비밀 (DB 패스워드, API key) 을 안전하게 저장/관리하는 서비스. Lambda 기반 자동 회전과 aws-kms 암호화 내장.

Parameter Store (SSM) = 설정값 + 비밀값의 계층형 저장소. 대부분 무료, 간단한 구성 관리에 적합.

Secrets Manager vs Parameter Store

항목Secrets ManagerParameter Store
가격0.05/10k APIStandard 무료, Advanced $0.05/1만
자동 회전내장 (Lambda)아니오
버전 관리자동 (AWSPENDING / AWSCURRENT / AWSPREVIOUS)수동
크기 제한64 KB4 KB (standard) / 8 KB (advanced)
aws-kms 암호화기본 적용SecureString 타입만
타입JSON / 문자열String / StringList / SecureString
교차 계정가능제한적
RDS 통합내장 rotation수동

어떤 걸 언제 쓸까?

flowchart TD
    Q{"비밀의 종류"}
    Q -->|"DB password / API key (자동 회전 필요)"| SM["Secrets Manager"]
    Q -->|"앱 설정값, feature flag"| PS["Parameter Store Standard"]
    Q -->|"암호화 필요한 설정값"| PSSec["Parameter Store SecureString"]
    Q -->|"크기 > 4KB (인증서 등)"| SM
    SM --> Cost["$0.40/secret/월"]
    PS --> Free["무료"]
    PSSec --> KMSCost["KMS 비용만"]

Secrets Manager: 기본 사용

Secret 저장

# JSON 형식 (DB 자격증명)
aws secretsmanager create-secret \
  --name "prod/db/credentials" \
  --description "RDS Aurora production" \
  --secret-string '{"username":"admin","password":"s3cr3t"}'

# 회전 주기 설정 (30일)
aws secretsmanager rotate-secret \
  --secret-id "prod/db/credentials" \
  --rotation-rules AutomaticallyAfterDays=30

Secret 조회

import boto3, json

sm = boto3.client('secretsmanager', region_name='us-east-1')

def get_secret(secret_name: str) -> dict:
    response = sm.get_secret_value(SecretId=secret_name)
    return json.loads(response['SecretString'])

creds = get_secret('prod/db/credentials')
db_password = creds['password']

IMPORTANT

매 요청마다 API 호출 금지. 애플리케이션 시작 시 캐싱 후 TTL 기반 갱신 권장.

Secret 캐싱 패턴

from aws_secretsmanager_caching import SecretCache

cache = SecretCache()   # 기본 TTL 3600초

def get_cached_secret(name: str) -> str:
    return cache.get_secret_string(name)

aws-secretsmanager-caching 라이브러리가 공식 지원. Lambda 에서 전역 캐시로 콜드 스타트 이후 재사용.

자동 회전 흐름

sequenceDiagram
    participant SM as Secrets Manager
    participant L as Rotation Lambda
    participant DB as 데이터베이스
    participant App as 애플리케이션

    Note over SM: 30일 경과 / 수동 트리거
    SM->>L: createSecret (AWSPENDING 생성)
    L->>DB: 새 패스워드 생성 요청
    DB-->>L: OK
    SM->>L: setSecret (DB 에 새 패스워드 적용)
    L->>DB: ALTER USER ... PASSWORD
    SM->>L: testSecret (새 패스워드 검증)
    L->>DB: 로그인 테스트
    SM->>L: finishSecret (AWSCURRENT 교체)
    Note over SM: AWSPENDING -> AWSCURRENT
    Note over SM: 구 AWSCURRENT -> AWSPREVIOUS
    App->>SM: GetSecretValue (AWSCURRENT 조회)
    SM-->>App: 새 패스워드

버전 레이블

레이블의미
AWSPENDING회전 준비 중인 새 값
AWSCURRENT현재 활성 값
AWSPREVIOUS직전 값 (롤백 보험)

RDS 자동 회전 설정

# RDS MySQL 자동 회전 활성화
aws secretsmanager rotate-secret \
  --secret-id "prod/rds/mysql" \
  --rotation-lambda-arn "arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser" \
  --rotation-rules '{"AutomaticallyAfterDays": 30}'

AWS 가 지원하는 내장 rotation Lambda:

  • SecretsManagerRDSMySQLRotationSingleUser
  • SecretsManagerRDSPostgreSQLRotationSingleUser
  • SecretsManagerRDSAuroraRotation
  • SecretsManagerRedshiftRotation

IAM 접근 제어

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ReadSecretOnly",
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:us-east-1:123:secret:prod/*"
    }
  ]
}

CAUTION

secretsmanager:* 권한 금지. 최소 권한으로 GetSecretValue 만 부여. secret ARN 패턴으로 범위 제한.

Parameter Store: 계층 구조

# 계층형 경로로 환경별 설정 관리
/prod/app/db/host
/prod/app/db/port
/prod/app/api/key      # SecureString
/staging/app/db/host
/dev/app/db/host

# 경로 아래 모든 파라미터 조회
aws ssm get-parameters-by-path \
  --path /prod/app \
  --recursive \
  --with-decryption    # SecureString 복호화

Parameter 타입

# String (평문)
aws ssm put-parameter \
  --name "/prod/app/db/host" \
  --value "db.prod.internal" \
  --type String

# SecureString (KMS 암호화)
aws ssm put-parameter \
  --name "/prod/app/api/key" \
  --value "sk-xxxx" \
  --type SecureString \
  --key-id "alias/prod-params"

# StringList (쉼표 구분)
aws ssm put-parameter \
  --name "/prod/app/allowed-ips" \
  --value "10.0.0.1,10.0.0.2" \
  --type StringList

EKS 통합 패턴

패턴도구특징
K8s Secret 으로 syncExternal Secrets OperatorGitOps 친화
Pod 에 파일로 마운트Secrets Store CSI Driver파일 마운트
코드에서 직접 조회AWS SDK + IRSA단순, 캐싱 주의
# External Secrets Operator 예시
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: SecretStore
  target:
    name: db-credentials
  data:
    - secretKey: password
      remoteRef:
        key: prod/db/credentials
        property: password

Cross-region 복제

# Secret 을 다른 리전에 복제
aws secretsmanager replicate-secret-to-regions \
  --secret-id "prod/db/credentials" \
  --add-replica-regions '[{"Region":"eu-west-1"}]'

리전 장애 시에도 비밀 접근 유지. 복제된 시크릿은 읽기 전용 (쓰기는 primary 에만).

비용 최적화

방법절감 효과
Parameter Store Standard 사용비밀이 아닌 설정값에 무료
Secret 캐싱 라이브러리API 호출 수 대폭 감소
공유 Secret 사용여러 환경 값 JSON 으로 통합
TTL 기반 갱신불필요한 빈번 조회 방지

대안 비교

솔루션특성적합한 경우
Secrets Manager자동 회전, 관리형AWS 네이티브, 멀티 서비스
Parameter Store저렴, 계층형설정값, feature flag
HashiCorp Vault멀티 클라우드, 세밀한 정책멀티 클라우드, 복잡한 정책
환경 변수 (직접)단순개발 환경 한정

함정

WARNING

Hardcoded fallback 금지: 코드에 평문 비밀값 절대 금지. 코드베이스 검색으로 password = 같은 패턴 CI 차단.

WARNING

회전 실패 모니터링 부재: rotation Lambda 실패 시 AWSPENDING 상태 고착, 서비스 다운 위험. CloudWatch Alarm + SNS 알림 필수.

# 회전 실패 CloudWatch Alarm
aws cloudwatch put-metric-alarm \
  --alarm-name "secrets-rotation-failure" \
  --metric-name "RotationFailed" \
  --namespace "AWS/SecretsManager" \
  --statistic Sum \
  --period 300 \
  --evaluation-periods 1 \
  --threshold 1 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions "arn:aws:sns:us-east-1:123:alerts"

CAUTION

Cross-region 없이 단일 리전: Secret 은 리전별 서비스. 리전 장애 = 비밀 접근 불가. 크리티컬 서비스는 multi-region 복제.

WARNING

Parameter Store 4KB 한도: 인증서, 큰 JSON 설정은 Advanced (8KB) 또는 Secrets Manager (64KB) 사용.

CAUTION

매 요청마다 GetSecretValue 호출: Lambda 가 요청마다 API 호출 시 throttling + 비용 폭증. 전역 캐시 또는 공식 캐싱 라이브러리 필수.

WARNING

Secret 삭제 즉시 불가: DeleteSecret 기본 복구 기간 30일. 즉시 삭제는 --force-delete-without-recovery 옵션 필요.

관련 위키

이 글의 용어 (6개)
[AWS] Amazon RDS (Relational Database Service)cloud
정의 Amazon RDS (Relational Database Service) 는 AWS 가 관리하는 관계형 데이터베이스 서비스 입니다. 6개 엔진 (MySQL, PostgreS…
[AWS] CloudWatch: 메트릭, 로그, 알람cloud
정의 CloudWatch = AWS 의 모니터링 + 로그 + 알람 통합 서비스. 메트릭 수집, 로그 집계, 대시보드, 알람, 이상 감지를 하나의 서비스에서 제공. 사용 상황 | …
[AWS] IAM: User, Role, Policy, STScloud
정의 IAM (Identity and Access Management) = AWS 의 권한 관리 전부. User, Group, Role, Policy 로 구성. "누가 어떤 리소…
[AWS] KMS: 암호화 키 관리, envelope encryptioncloud
정의 KMS (Key Management Service) = 암호화 키 중앙 관리. envelope encryption + IAM 통합 + 감사 로그. 키 종류 | 종류 | 의미…
[AWS] Lambda: 서버리스 함수, 트리거, 동시성cloud
정의 AWS Lambda = 서버리스 함수 실행. 이벤트 트리거 → 함수 실행 → 결과 / 비동기 처리. 서버 관리 0. 사용 상황 | 상황 | Lambda 적합성 | |---|…
[K8s] ConfigMap & Secret: 설정과 비밀의 분리kubernetes
정의 ConfigMap 과 Secret 은 컨테이너 이미지에서 설정/비밀 값을 분리하기 위한 Kubernetes 리소스. | 항목 | ConfigMap | Secret | |:-…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기