Secrets Manager 및 Parameter Store
Secrets Manager로 데이터베이스 자격 증명을 자동으로 교체하고, 비밀이 아닌 구성을 Parameter Store에 저장하며, 두 서비스를 Lambda 및 ECS와 통합합니다.
Secrets Manager 및 Parameter Store은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
코드에 Secrets를 저장할 때의 문제
일반적이고 위험한 안티 패턴은 버전 제어에 커밋된 애플리케이션 소스 코드, 환경 변수 또는 구성 파일에 Secrets(데이터베이스 비밀번호, API 키, OAuth 토큰)를 저장하는 것입니다. 이러한 저장소가 실수로 공개되거나 공격자에게 액세스되어 노출되면 모든 Secrets가 즉시 유출됩니다. AWS는 이 문제를 해결하기 위해 두 가지 관리형 서비스를 제공합니다. 자동 교체가 필요한 자격 증명에는 AWS Secrets Manager를 사용하고, 구성 값과 교체하지 않는 Secrets에는 AWS Systems Manager Parameter Store를 사용합니다.
# Anti-pattern: secrets in code (NEVER do this)
# db_password = 'supersecret123'
# api_key = 'sk-abc123def456'
# Best practice: retrieve at runtime
import boto3
client = boto3.client('secretsmanager', region_name='us-east-1')
response = client.get_secret_value(SecretId='prod/myapp/db-password')
password = response['SecretString'] # fresh value, always currentAWS Secrets Manager 개요
AWS Secrets Manager는 Secrets를 저장, 검색하고 자동으로 교체하는 관리형 서비스입니다. 모든 Secrets를 KMS로 Encryption하며, 기본적으로 AWS managed key 또는 사용자의 CMK를 사용합니다. Secrets에는 key-value JSON 문자열 형식으로 구조화된 데이터를 저장할 수 있습니다. Secrets Manager의 요금은 Secret당 월 0.40달러와 API 호출 10,000건당 0.05달러입니다. Parameter Store와의 핵심 차이점은 RDS, Redshift, DocumentDB 및 Lambda 교체 함수를 사용하는 사용자 지정 Secret에 대해 자동 교체 기능이 기본 제공된다는 점입니다. 교체 중에 애플리케이션을 변경할 필요가 없습니다.
# Create a secret in Secrets Manager
aws secretsmanager create-secret \
--name 'prod/myapp/database' \
--description 'Production MySQL credentials' \
--secret-string '{"username":"admin","password":"changeme123","host":"mydb.rds.amazonaws.com","port":3306,"dbname":"orders"}'
# Retrieve the secret (by application)
aws secretsmanager get-secret-value \
--secret-id 'prod/myapp/database' \
--query 'SecretString' \
--output text | python3 -c 'import sys,json; s=json.load(sys.stdin); print(s["password"])'Secrets Manager를 통한 자동 교체
자동 교체는 Secrets Manager의 가장 강력한 기능입니다. RDS 데이터베이스에서 Secrets Manager는 다음과 같은 방식으로 비밀번호를 기본적으로 교체합니다. 1) 새 비밀번호를 생성합니다. 2) RDS에서 데이터베이스 사용자의 비밀번호를 업데이트합니다. 3) 새 비밀번호로 보안 암호를 업데이트합니다. 4) 새 자격 증명이 작동하는지 확인합니다. 이 모든 작업은 애플리케이션이 실행 중인 동안 이루어지므로 가동 중단이 없고 수동 개입도 필요하지 않습니다. 애플리케이션은 항상 get-secret-value를 호출하여 현재 비밀번호를 가져오므로, 교체된 자격 증명을 자동으로 사용합니다.
# Enable automatic rotation for RDS secret
aws secretsmanager rotate-secret \
--secret-id 'prod/myapp/database' \
--rotation-rules AutomaticallyAfterDays=30 \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser
# AWS provides pre-built rotation Lambda functions for:
# - RDS MySQL/PostgreSQL/MariaDB/Oracle/SQL Server
# - DocumentDB
# - Redshift
# - Custom: write your own Lambda for other services
# Application code: always call GetSecretValue, never cache long-term보안 암호 로컬 캐싱
모든 데이터베이스 쿼리마다 Secrets Manager를 호출하면 비용이 많이 들고 느려집니다. 가장 좋은 방법은 짧은 기간 동안 보안 암호를 메모리에 로컬로 캐시하는 것입니다. AWS는 구성 가능한 TTL에 따라 보안 암호를 캐시하는 공식 Secrets Manager 캐싱 클라이언트를 Java 및 Python용으로 제공합니다. 캐시가 만료되면 클라이언트가 Secrets Manager에서 보안 암호를 다시 가져옵니다. 애플리케이션에서 인증 오류가 발생하면(비밀번호가 교체되었음을 의미함) 캐시를 즉시 새로 고친 후 재시도합니다. 이 패턴을 사용하면 Secrets Manager API를 과도하게 호출하지 않으면서 성능과 최신성을 모두 확보할 수 있습니다.
# Python: Secrets Manager caching client
# pip install aws-secretsmanager-caching
from botocore.session import get_session
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig
client = get_session().create_client('secretsmanager')
cache = SecretCache(
config=SecretCacheConfig(secret_refresh_interval=3600), # cache 1 hour
client=client
)
# Returns cached value unless refresh interval expired
secret = cache.get_secret_string('prod/myapp/database')AWS Systems Manager Parameter Store
AWS Systems Manager(SSM) Parameter Store는 구성 데이터와 보안 암호를 저장하는 무료(표준 매개변수 기준) 계층형 키-값 저장소입니다. String, StringList 및 SecureString 매개변수 유형을 지원합니다. SecureString은 KMS로 값을 암호화합니다. Secrets Manager와 달리 Parameter Store는 자동 교체를 지원하지 않습니다. 자주 변경되지 않는 구성 값을 저장하도록 설계되었기 때문입니다. 표준 매개변수는 무료이며 최대 4KB까지 저장할 수 있습니다. 고급 매개변수는 더 큰 값(최대 8KB), 매개변수 정책(만료 및 교체 알림)을 지원하며 매개변수당 월 $0.05의 비용이 발생합니다.
# Create Parameter Store parameters
aws ssm put-parameter \
--name '/prod/myapp/db-host' \
--value 'mydb.cluster-abc.us-east-1.rds.amazonaws.com' \
--type String
aws ssm put-parameter \
--name '/prod/myapp/db-password' \
--value 'mysecretpassword' \
--type SecureString \
--key-id alias/my-kms-key
# Retrieve parameter
aws ssm get-parameter \
--name '/prod/myapp/db-password' \
--with-decryption \
--query 'Parameter.Value' --output textParameter Store 계층 구조 및 IAM
환경 및 애플리케이션 아키텍처를 반영하는 계층형 경로 구조를 사용하여 Parameter Store 값을 구성합니다. 이를 통해 경로 접두사별로 매개변수에 대한 액세스 권한을 부여하는 세밀한 IAM 정책을 작성할 수 있습니다. 예를 들어 Lambda 함수에 /prod/payment-service/ 아래의 매개변수에만 액세스할 수 있는 권한을 부여하면 다른 서비스의 매개변수에는 액세스할 수 없습니다. 구성에 최소 권한 원칙을 적용하면 침해된 서비스 하나가 다른 서비스의 보안 암호를 읽는 것을 방지할 수 있습니다.
# Parameter hierarchy
/prod/payment-service/db-password
/prod/payment-service/stripe-api-key
/prod/order-service/db-password
/prod/order-service/redis-url
/staging/payment-service/db-password
# IAM policy: payment-service Lambda can ONLY read its params
{
'Effect': 'Allow',
'Action': ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'],
'Resource': 'arn:aws:ssm:us-east-1:123:parameter/prod/payment-service/*'
}
# Get all parameters for an app at once
aws ssm get-parameters-by-path \
--path '/prod/payment-service/' \
--with-decryption --recursiveSecrets Manager와 Parameter Store: 각각의 사용 시점
요구 사항에 따라 두 서비스 중 하나를 선택합니다. 다음과 같은 경우 Secrets Manager를 사용합니다. 보안 암호 자동 교체가 필요할 때, 데이터베이스 자격 증명을 저장할 때, 보안 암호를 여러 AWS 계정에서 공유해야 할 때, 또는 규정 준수를 위해 문서화된 교체 정책이 필요할 때입니다. 다음과 같은 경우 Parameter Store를 사용합니다. 구성 값(보안 암호가 아닌 값)이 필요할 때, 간단한 키-값 저장소를 무료로 사용하려 할 때, 경로 기반 액세스 제어가 적용된 계층형 구성이 필요할 때, 또는 매개변수 버전 기록을 저장해야 할 때입니다. 많은 아키텍처에서 두 서비스를 함께 사용합니다. 구성에는 Parameter Store를, 자격 증명에는 Secrets Manager를 사용합니다.
# Usage comparison:
# Secrets Manager:
# Cost: $0.40/secret/month
# Rotation: Automatic (RDS, custom Lambda)
# Cross-account: Yes
# Best for: Database passwords, API keys, OAuth tokens
# Parameter Store:
# Cost: Free (standard) / $0.05/month (advanced)
# Rotation: Manual only
# Cross-account: No (use Secrets Manager)
# Best for: Config values, feature flags, non-rotating secretsLambda 및 ECS와 통합
Lambda 함수와 ECS 작업은 호출될 때마다가 아니라 시작할 때 보안 암호를 가져와야 합니다. Lambda의 경우 초기화 코드(핸들러 함수 외부)에서 보안 암호를 가져와 전역 변수에 캐시합니다. Lambda 실행 환경은 호출 간에 유지되므로 환경 수명 동안 보안 암호를 한 번만 가져옵니다. ECS의 경우 작업 정의의 secrets 필드를 사용하여 Secrets Manager 값 또는 Parameter Store SecureString을 환경 변수로 주입합니다. ECS가 작업을 시작할 때 이를 가져와 주입하므로 애플리케이션 코드를 변경할 필요가 없습니다.
# ECS task definition: inject secret as environment variable
{
'containerDefinitions': [{
'name': 'api',
'image': 'my-api:latest',
'secrets': [
{
'name': 'DB_PASSWORD',
'valueFrom': 'arn:aws:secretsmanager:us-east-1:123:secret:prod/myapp/database:password::'
},
{
'name': 'API_KEY',
'valueFrom': '/prod/myapp/api-key'
}
]
}]
}
# Application reads DB_PASSWORD from env var
# ECS injects the current secret value at task startEC2 AMI ID에 Parameter Store 사용
실용적이지만 자주 간과되는 Parameter Store의 사용 사례는 AMI ID 및 기타 배포 참조 정보를 저장하는 것입니다. CloudFormation 템플릿에 AMI ID를 직접 입력하면 새 AMI가 출시될 때 오래된 값이 되지만, 대신 Parameter Store 값을 참조할 수 있습니다. 새로운 표준 AMI가 생성될 때마다 CI/CD 파이프라인이 Parameter Store의 AMI ID를 업데이트합니다. CloudFormation은 배포 시점에 Parameter Store에서 최신 AMI ID를 읽습니다. AWS는 직접 참조할 수 있는 공개 Parameter Store 경로에 최신 Amazon Linux AMI ID도 게시합니다.
# Get AWS public AMI ID from Parameter Store
aws ssm get-parameter \
--name '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64' \
--query 'Parameter.Value' --output text
# CloudFormation: reference public AMI parameter
Parameters:
LatestAmiId:
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64'
Resources:
MyEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId보안 암호 감사 및 규정 준수
보안 암호 거버넌스를 위해서는 누가 언제 보안 암호에 액세스했는지 파악해야 합니다. AWS CloudTrail은 Secrets Manager 및 Parameter Store에 대한 모든 API 호출인 GetSecretValue, PutParameter, GetParameter를 기록합니다. 이를 통해 규정 준수에 필요한 완전한 감사 추적 기록을 확보할 수 있습니다. CloudTrail 지표에 CloudWatch Alarms를 사용하여 보안 암호가 평소와 다른 방식으로 액세스될 때 알림을 전송합니다. 예를 들어 프로덕션 보안 암호에 비정상적인 IAM 보안 주체 또는 알려진 범위에 포함되지 않은 IP에서 액세스하면 조사를 위해 알림을 발생시킵니다.
# CloudTrail metric filter: alert on unexpected secret access
aws logs put-metric-filter \
--log-group-name CloudTrail/management-events \
--filter-name 'SecretAccessOutsideHours' \
--filter-pattern '{ $.eventSource = "secretsmanager.amazonaws.com" && $.eventName = "GetSecretValue" && $.userAgent != "lambda.amazonaws.com" }' \
--metric-transformations \
metricName=UnexpectedSecretAccess,metricNamespace=Security,metricValue=1
# Then create CloudWatch alarm on this metric
# Alert fires when non-Lambda principal accesses secrets계정 간 보안 암호 공유
다중 계정 아키텍처에서는 한 계정의 애플리케이션이 다른 계정에서 관리되는 보안 암호를 사용해야 하는 경우가 있습니다(예: 중앙 Security 계정에서 모든 RDS 비밀번호를 관리하는 경우). Secrets Manager 리소스 정책을 사용하면 계정 간 액세스가 가능합니다. 보안 암호에 리소스 기반 정책을 구성하여 사용하는 계정의 역할에 GetSecretValue를 호출할 권한을 부여합니다. 사용하는 계정의 역할에도 해당 보안 암호의 ARN에 대한 호출을 허용하는 IAM 정책이 있어야 합니다. 또한 KMS 키 정책에서 보안 암호를 암호화하는 데 사용된 CMK에 사용하는 계정이 액세스할 수 있도록 허용해야 합니다.
# Secret resource policy: allow cross-account access
aws secretsmanager put-resource-policy \
--secret-id 'prod/shared/rds-password' \
--resource-policy '{
"Statement": [{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:role/AppRole"
},
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}]
}'
# KMS key policy must also allow account 999999999999
# IAM policy in 999999999999 must allow GetSecretValue on ARN빠른 확인
이 단원에서 학습한 AWS Solutions Architect(SAA-C03) 개념을 이해했는지 확인해 보십시오.
단원 요약
이 단원에서는 다음 내용을 학습했습니다. Secrets Manager는 데이터베이스 자격 증명과 API 키에 대한 자동 교체를 제공하며, 교체가 필요한 보안 암호에 권장되는 선택입니다. Parameter Store는 경로 기반 IAM 액세스 제어를 지원하는 무료 계층형 구성 저장소를 제공합니다. 또한 ECS와 Lambda는 애플리케이션 코드를 변경하지 않고 보안 암호를 환경 변수로 주입할 수 있습니다. CloudTrail은 모든 보안 암호 액세스에 대한 감사 추적 기록을 제공합니다. 다음 단원에서는 WAF, Shield 및 Network Firewall을 살펴봅니다.
자주 묻는 질문
“Secrets Manager 및 Parameter Store” 강의는 무료인가요?
네 — “Secrets Manager 및 Parameter Store” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“Secrets Manager 및 Parameter Store”에서 뭘 배우나요?
Secrets Manager로 데이터베이스 자격 증명을 자동으로 교체하고, 비밀이 아닌 구성을 Parameter Store에 저장하며, 두 서비스를 Lambda 및 ECS와 통합합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“Secrets Manager 및 Parameter Store” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- KMS, ACM 및 암호화 패턴
- GuardDuty, Inspector 및 Macie
- Secrets Manager 및 Parameter Store
- WAF, Shield 및 Network Firewall