[AWS] SSM Parameter Store: 계층적 구성/비밀 저장
정의
AWS SSM Parameter Store 는 구성 값 (configuration) 과 경량 비밀 (secret) 을 계층적 이름으로 저장하는 관리형 키-값 저장소. /prod/db/host 처럼 슬래시로 계층을 만들고, 문자열 (String) / 문자열 리스트 (StringList) / KMS 로 암호화된 비밀 (SecureString) 세 타입을 저장한다. 표준 파라미터는 무료.
핵심 정체성: “환경 변수 / config 파일 / 비밀번호를 하드코딩하지 말고 여기에 넣어라” 를 위한 서비스.
왜 Parameter Store 인가
하드코딩의 문제
# 안티패턴 (하드코딩)
DB_HOST = "prod-db.abc.us-east-1.rds.amazonaws.com"
DB_PASSWORD = "s3cret" # git 에 올라감
API_KEY = "sk-xxxxx" # 유출 위험
# 환경 변수 (조금 나음)
DB_HOST = os.environ["DB_HOST"] # 배포 시점 결정
문제:
- 코드에 값 포함 -> git leak
- 환경 변수는 프로세스 시작 시점만
- 값 변경 시 재배포 필요
- 감사 이력 없음
- 회전 (rotation) 어려움
Parameter Store 의 답
import boto3
ssm = boto3.client('ssm')
# 실행 시점 조회 (변경 사항 즉시 반영)
DB_HOST = ssm.get_parameter(Name='/prod/db/host')['Parameter']['Value']
DB_PASSWORD = ssm.get_parameter(Name='/prod/db/password', WithDecryption=True)['Parameter']['Value']
이점:
- 코드에 값 없음
- IAM 으로 접근 제어
- 값 변경 시 재배포 불필요 (실행 시점 조회)
- CloudTrail 로 접근 감사
- KMS 로 비밀 암호화
- 버전 관리 (parameter version)
계층 구조
파라미터 이름에 슬래시 (/) 로 계층을 표현.
/ (root)
├── /prod/
│ ├── /prod/db/
│ │ ├── /prod/db/host
│ │ ├── /prod/db/port
│ │ └── /prod/db/password (SecureString)
│ ├── /prod/api/
│ │ ├── /prod/api/endpoint
│ │ └── /prod/api/key (SecureString)
│ └── /prod/features/
│ └── /prod/features/dark-mode (String: "true")
├── /staging/
│ └── /staging/db/host
└── /dev/
└── /dev/db/host
계층의 이점:
- IAM 정책 접두사 매칭:
/prod/*만 접근 가능한 role - 일괄 조회:
GetParametersByPath('/prod/db/', recursive=true)로 모든 하위 조회 - 환경별 격리:
/prod/,/staging/,/dev/완전 분리
파라미터 타입 3가지
| 타입 | 저장 방식 | 대표 용도 |
|---|---|---|
| String | 평문 | 엔드포인트, ID, 플래그 |
| StringList | 콤마 구분 문자열 | 여러 허용 IP, 여러 도메인 |
| SecureString | KMS 로 암호화 | 비밀번호, API 키 |
String
aws ssm put-parameter \
--name /prod/api/endpoint \
--value "https://api.example.com" \
--type String \
--description "API 게이트웨이 endpoint"
StringList
aws ssm put-parameter \
--name /prod/cors/allowed-origins \
--value "https://app1.com,https://app2.com,https://admin.com" \
--type StringList
Python 사용 시 value.split(',') 로 리스트 복원.
SecureString (KMS 암호화)
aws ssm put-parameter \
--name /prod/db/password \
--value "s3cret" \
--type SecureString \
--key-id alias/aws/ssm # 기본 AWS 관리 KMS 키
# --key-id alias/my-app-key # 고객 관리 KMS 키
조회:
# WithDecryption=true 필수
aws ssm get-parameter \
--name /prod/db/password \
--with-decryption
중요:
- KMS 로 암호화 → 저장 요금은 KMS 요금이 별도 부과 아님 (KMS 사용 요금만)
- 조회 시 KMS Decrypt 권한 필요 (IAM 정책에
kms:Decrypt) - 고객 관리 KMS 키 사용 시 세밀한 접근 제어 + 감사
표준 vs Advanced 티어
Parameter Store 는 두 티어 제공.
| 축 | Standard (기본) | Advanced |
|---|---|---|
| 최대 파라미터 수 | 10,000 / 계정 / 리전 | 100,000 |
| 최대 값 크기 | 4 KB | 8 KB |
| 파라미터 정책 (만료, 알림) | X | O |
| 높은 처리량 | 40 tx/s | 3,000 tx/s |
| 요금 | 무료 | $0.05 / 파라미터 / 월 + API 호출 |
대부분 Standard 로 충분. Advanced 는 대규모 조직 또는 만료 / 알림 정책 필요 시.
Advanced 파라미터 정책
- Expiration: 특정 날짜 이후 자동 삭제 (일시 토큰 등)
- ExpirationNotification: 만료 전 알림
- NoChangeNotification: 오래 안 바뀌면 알림 (드리프트 방지)
버전 관리
파라미터 값을 변경할 때마다 버전 번호가 증가. 이전 값 조회 가능.
# 특정 버전 조회
aws ssm get-parameter --name /prod/db/host:2
# 모든 버전 목록
aws ssm get-parameter-history --name /prod/db/host
용도:
- 롤백 (이전 값으로)
- 감사 (누가 언제 무엇으로 변경)
- 실수 복구
공용 파라미터 (Public Parameters)
AWS 가 제공하는 표준 값들. 하드코딩 없이 참조.
대표 예: 최신 AMI ID
# Amazon Linux 2023 latest AMI
aws ssm get-parameter \
--name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64
ECS 최적화 AMI
aws ssm get-parameter \
--name /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended
리전 목록
aws ssm get-parameters-by-path \
--path /aws/service/global-infrastructure/regions \
--recursive
활용: CloudFormation / Terraform 에서 하드코딩 없이 최신 AMI 참조.
# CloudFormation
Parameters:
LatestAmiId:
Type: AWS::SSM::Parameter::Value<String>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
Parameter Store vs Secrets Manager (핵심 비교)
가장 흔한 질문. 목적이 겹치지만 결정적 차이가 있음.
| 축 | Parameter Store | Secrets Manager |
|---|---|---|
| 목적 | 구성 값 + 경량 비밀 | 비밀 전용 |
| 자동 회전 (Rotation) | 없음 | 있음 (Lambda 기반, RDS 자동) |
| 암호화 | SecureString (KMS) | KMS |
| 비용 | 표준 무료 | 비밀당 $0.40/월 + API 호출 |
| 교차 리전 복제 | 제한적 | 있음 |
| RDS 통합 | 참조 가능 | 네이티브 (RDS 생성 시 통합) |
| 최대 크기 | 4 KB (표준) / 8 KB (Advanced) | 64 KB |
| 대표 용도 | 엔드포인트, AMI ID, 환경 변수 | DB 자격증명 (자동 회전 필요) |
결정 규칙:
- 자동 회전 필요 (DB 비밀번호 등) → Secrets Manager
- 비용 최소 + 단순 조회 → Parameter Store SecureString
- 파라미터가 매우 많음 (100+) → Parameter Store (비용 압도적 저렴)
- RDS 생성 시 통합 → Secrets Manager 자동 통합
팁: Parameter Store 에서 Secrets Manager 비밀을 참조하는 것도 가능.
Parameter Store: /prod/db/password → Secrets Manager secret ARN 참조
Parameter Store 로 통일된 API 사용 + Secrets Manager 자동 회전 활용.
실전 사용
애플리케이션 통합
import boto3
from functools import lru_cache
ssm = boto3.client('ssm')
@lru_cache(maxsize=128) # 짧은 메모리 캐시
def get_param(name: str, decrypt: bool = False) -> str:
return ssm.get_parameter(Name=name, WithDecryption=decrypt)['Parameter']['Value']
DB_HOST = get_param('/prod/db/host')
DB_PASSWORD = get_param('/prod/db/password', decrypt=True)
패턴:
- Lambda: 콜드 스타트에 로드 (handler 밖에서)
- ECS/EC2: 부팅 시 로드 + 주기적 갱신
- 캐싱 필수 (매 호출 API 이면 요금 + 지연)
여러 파라미터 한 번에
# GetParametersByPath: 계층 전체 한 API 호출
response = ssm.get_parameters_by_path(
Path='/prod/db/',
Recursive=True,
WithDecryption=True
)
config = {p['Name'].split('/')[-1]: p['Value'] for p in response['Parameters']}
# {'host': '...', 'port': '5432', 'password': 's3cret', ...}
CloudFormation 참조
Resources:
MyLambda:
Type: AWS::Lambda::Function
Properties:
Environment:
Variables:
DB_HOST: '{{resolve:ssm:/prod/db/host:1}}'
DB_PASSWORD: '{{resolve:ssm-secure:/prod/db/password:1}}'
ECS Task Definition
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:ssm:us-east-1:123:parameter/prod/db/password"
}
]
ECS 가 task 시작 시 Parameter Store 에서 조회해 환경 변수로 주입.
IAM 정책 (계층 접근 제어)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ssm:GetParameter", "ssm:GetParameters", "ssm:GetParametersByPath"],
"Resource": "arn:aws:ssm:us-east-1:123:parameter/prod/*"
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:us-east-1:123:key/xxxx",
"Condition": {
"StringEquals": {"kms:ViaService": "ssm.us-east-1.amazonaws.com"}
}
}
]
}
핵심:
- 리소스 ARN 에 계층 prefix + wildcard
- SecureString 사용 시
kms:Decrypt별도 부여 kms:ViaServicecondition 으로 SSM 을 통한 복호화만 허용
함정
WARNING
SecureString 조회 시 WithDecryption=true 잊음 = 암호화된 raw 값 반환. Python 에서 이걸 그대로 DB 비밀번호로 사용하면 인증 실패.
CAUTION
자동 회전 없음. RDS 비밀번호가 정기 회전되면 Parameter Store 값도 수동 업데이트 필요. 자동 회전 필요하면 Secrets Manager.
WARNING
매 요청마다 GetParameter API 호출 = 요금 + 지연 (수십 ms). Lambda / ECS 부팅 시 로드 + 캐싱.
IMPORTANT
표준 티어 값 4 KB 상한. TLS 인증서 등 큰 값은 Advanced 또는 Secrets Manager.
CAUTION
SecureString 의 KMS 키 삭제 = 값 복호화 불가. AWS 관리 키 (alias/aws/ssm) 는 안전, 고객 관리 키는 신중.
WARNING
CloudTrail 데이터 이벤트 활성 X = 파라미터 조회 감사 불가. 민감 파라미터는 CloudTrail data event 로깅.
IMPORTANT
버전은 자동 증가. 스크립트에서 특정 버전 참조 시 :숫자 명시, 최신은 :$LATEST (또는 생략).
관련 위키
- Systems Manager (개요) - 상위 서비스
- AWS Secrets Manager - 자동 회전 대안
- AWS KMS - SecureString 암호화
- IAM - 접근 제어
- CloudTrail - 감사
- CloudFormation - IaC 에서 참조
- Lambda - 대표 소비 클라이언트
이 글의 용어 (7개)
- [AWS] CloudFormationcloud
- 정의 AWS CloudFormation 은 JSON 또는 YAML 템플릿으로 AWS 인프라를 선언적으로 프로비저닝하는 IaC (Infrastructure as Code) 서비스입…
- [AWS] CloudTrail (API Activity Logging)cloud
- 정의 AWS CloudTrail 은 AWS 계정의 API 호출 및 사용자 활동을 기록 하는 감사 로깅 서비스입니다. "누가, 언제, 어디서, 어떤 API 를, 어떤 리소스에 대해…
- [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 적합성 | |---|…
- [AWS] Secrets Manager + Parameter Storecloud
- 정의 AWS Secrets Manager = 회전이 필요한 비밀 (DB 패스워드, API key) 을 안전하게 저장/관리하는 서비스. Lambda 기반 자동 회전과 암호화 내장.…
- [AWS] Systems Manager: 노드 운영 도구 모음 (인덱스)cloud
- 정의 AWS Systems Manager (SSM) 는 AWS / 온프레미스 / 멀티클라우드에 걸친 노드 (서버, 인스턴스, VM, IoT 등) 를 대규모로 안전하게 관리 / 운…
💬 댓글