secrets-manager
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAWS Secrets Manager
AWS Secrets Manager
AWS Secrets Manager helps protect access to applications, services, and IT resources. Store, retrieve, and automatically rotate credentials, API keys, and other secrets.
AWS Secrets Manager 有助于保护对应用程序、服务和IT资源的访问。可用于存储、检索并自动轮转凭据、API密钥和其他密钥。
Table of Contents
目录
Core Concepts
核心概念
Secrets
密钥
Encrypted data stored in Secrets Manager. Can contain:
- Database credentials
- API keys
- OAuth tokens
- Any key-value pairs (up to 64 KB)
存储在Secrets Manager中的加密数据,可包含:
- 数据库凭据
- API密钥
- OAuth令牌
- 任意键值对(最大64 KB)
Versions
版本
Each secret can have multiple versions:
- AWSCURRENT: Current active version
- AWSPENDING: Version being rotated to
- AWSPREVIOUS: Previous version
每个密钥可拥有多个版本:
- AWSCURRENT:当前活跃版本
- AWSPENDING:待轮转的版本
- AWSPREVIOUS:上一版本
Rotation
轮转
Automatic credential rotation using Lambda functions. Built-in support for:
- Amazon RDS
- Amazon Redshift
- Amazon DocumentDB
- Custom secrets
使用Lambda函数实现凭据自动轮转,内置支持:
- Amazon RDS
- Amazon Redshift
- Amazon DocumentDB
- 自定义密钥
Common Patterns
常见模式
Create a Secret
创建密钥
AWS CLI:
bash
undefinedAWS CLI:
bash
undefinedCreate secret with JSON
Create secret with JSON
aws secretsmanager create-secret
--name prod/myapp/database
--description "Production database credentials"
--secret-string '{"username":"admin","password":"MySecurePassword123!","host":"mydb.cluster-xyz.us-east-1.rds.amazonaws.com","port":5432,"database":"myapp"}'
--name prod/myapp/database
--description "Production database credentials"
--secret-string '{"username":"admin","password":"MySecurePassword123!","host":"mydb.cluster-xyz.us-east-1.rds.amazonaws.com","port":5432,"database":"myapp"}'
aws secretsmanager create-secret
--name prod/myapp/database
--description "Production database credentials"
--secret-string '{"username":"admin","password":"MySecurePassword123!","host":"mydb.cluster-xyz.us-east-1.rds.amazonaws.com","port":5432,"database":"myapp"}'
--name prod/myapp/database
--description "Production database credentials"
--secret-string '{"username":"admin","password":"MySecurePassword123!","host":"mydb.cluster-xyz.us-east-1.rds.amazonaws.com","port":5432,"database":"myapp"}'
Create secret with binary data
Create secret with binary data
aws secretsmanager create-secret
--name prod/myapp/certificate
--secret-binary fileb://certificate.pem
--name prod/myapp/certificate
--secret-binary fileb://certificate.pem
**boto3:**
```python
import boto3
import json
secrets = boto3.client('secretsmanager')
response = secrets.create_secret(
Name='prod/myapp/database',
Description='Production database credentials',
SecretString=json.dumps({
'username': 'admin',
'password': 'MySecurePassword123!',
'host': 'mydb.cluster-xyz.us-east-1.rds.amazonaws.com',
'port': 5432,
'database': 'myapp'
}),
Tags=[
{'Key': 'Environment', 'Value': 'production'},
{'Key': 'Application', 'Value': 'myapp'}
]
)aws secretsmanager create-secret
--name prod/myapp/certificate
--secret-binary fileb://certificate.pem
--name prod/myapp/certificate
--secret-binary fileb://certificate.pem
**boto3:**
```python
import boto3
import json
secrets = boto3.client('secretsmanager')
response = secrets.create_secret(
Name='prod/myapp/database',
Description='Production database credentials',
SecretString=json.dumps({
'username': 'admin',
'password': 'MySecurePassword123!',
'host': 'mydb.cluster-xyz.us-east-1.rds.amazonaws.com',
'port': 5432,
'database': 'myapp'
}),
Tags=[
{'Key': 'Environment', 'Value': 'production'},
{'Key': 'Application', 'Value': 'myapp'}
]
)Retrieve a Secret
检索密钥
python
import boto3
import json
secrets = boto3.client('secretsmanager')
def get_secret(secret_name):
response = secrets.get_secret_value(SecretId=secret_name)
if 'SecretString' in response:
return json.loads(response['SecretString'])
else:
import base64
return base64.b64decode(response['SecretBinary'])python
import boto3
import json
secrets = boto3.client('secretsmanager')
def get_secret(secret_name):
response = secrets.get_secret_value(SecretId=secret_name)
if 'SecretString' in response:
return json.loads(response['SecretString'])
else:
import base64
return base64.b64decode(response['SecretBinary'])Usage
Usage
credentials = get_secret('prod/myapp/database')
db_password = credentials['password']
undefinedcredentials = get_secret('prod/myapp/database')
db_password = credentials['password']
undefinedCaching Secrets
缓存密钥
python
from aws_secretsmanager_caching import SecretCache, SecretCacheConfigpython
from aws_secretsmanager_caching import SecretCache, SecretCacheConfigConfigure cache
Configure cache
cache_config = SecretCacheConfig(
max_cache_size=100,
secret_refresh_interval=3600,
secret_version_stage_refresh_interval=3600
)
cache = SecretCache(config=cache_config)
def get_cached_secret(secret_name):
secret = cache.get_secret_string(secret_name)
return json.loads(secret)
undefinedcache_config = SecretCacheConfig(
max_cache_size=100,
secret_refresh_interval=3600,
secret_version_stage_refresh_interval=3600
)
cache = SecretCache(config=cache_config)
def get_cached_secret(secret_name):
secret = cache.get_secret_string(secret_name)
return json.loads(secret)
undefinedUpdate a Secret
更新密钥
bash
undefinedbash
undefinedUpdate secret value
Update secret value
aws secretsmanager update-secret
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
aws secretsmanager update-secret
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
Put new version with staging labels
Put new version with staging labels
aws secretsmanager put-secret-value
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
--version-stages AWSCURRENT
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
--version-stages AWSCURRENT
undefinedaws secretsmanager put-secret-value
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
--version-stages AWSCURRENT
--secret-id prod/myapp/database
--secret-string '{"username":"admin","password":"NewPassword456!"}'
--version-stages AWSCURRENT
undefinedEnable Rotation for RDS
为RDS启用轮转
bash
aws secretsmanager rotate-secret \
--secret-id prod/myapp/database \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRDSPostgreSQLRotation \
--rotation-rules AutomaticallyAfterDays=30bash
aws secretsmanager rotate-secret \
--secret-id prod/myapp/database \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRDSPostgreSQLRotation \
--rotation-rules AutomaticallyAfterDays=30Create Secret with Rotation
创建带轮转的密钥
bash
undefinedbash
undefinedUse CloudFormation for RDS secret with rotation
Use CloudFormation for RDS secret with rotation
aws cloudformation deploy
--template-file rds-secret.yaml
--stack-name rds-secret
--template-file rds-secret.yaml
--stack-name rds-secret
```yamlaws cloudformation deploy
--template-file rds-secret.yaml
--stack-name rds-secret
--template-file rds-secret.yaml
--stack-name rds-secret
```yamlrds-secret.yaml
rds-secret.yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DBSecret:
Type: AWS::SecretsManager::Secret
Properties:
Name: prod/myapp/database
GenerateSecretString:
SecretStringTemplate: '{"username": "admin"}'
GenerateStringKey: password
PasswordLength: 32
ExcludeCharacters: '"@/'
DBSecretRotation:
Type: AWS::SecretsManager::RotationSchedule
Properties:
SecretId: !Ref DBSecret
RotationLambdaARN: !GetAtt RotationLambda.Arn
RotationRules:
AutomaticallyAfterDays: 30
undefinedAWSTemplateFormatVersion: '2010-09-09'
Resources:
DBSecret:
Type: AWS::SecretsManager::Secret
Properties:
Name: prod/myapp/database
GenerateSecretString:
SecretStringTemplate: '{"username": "admin"}'
GenerateStringKey: password
PasswordLength: 32
ExcludeCharacters: '"@/'
DBSecretRotation:
Type: AWS::SecretsManager::RotationSchedule
Properties:
SecretId: !Ref DBSecret
RotationLambdaARN: !GetAtt RotationLambda.Arn
RotationRules:
AutomaticallyAfterDays: 30
undefinedUse in Lambda with Extension
在Lambda中结合扩展使用
python
import json
import urllib.request
def handler(event, context):
# Use AWS Parameters and Secrets Lambda Extension
secrets_port = 2773
secret_name = 'prod/myapp/database'
url = f'http://localhost:{secrets_port}/secretsmanager/get?secretId={secret_name}'
headers = {'X-Aws-Parameters-Secrets-Token': os.environ['AWS_SESSION_TOKEN']}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
secret = json.loads(response.read())['SecretString']
credentials = json.loads(secret)
return credentialspython
import json
import urllib.request
def handler(event, context):
# Use AWS Parameters and Secrets Lambda Extension
secrets_port = 2773
secret_name = 'prod/myapp/database'
url = f'http://localhost:{secrets_port}/secretsmanager/get?secretId={secret_name}'
headers = {'X-Aws-Parameters-Secrets-Token': os.environ['AWS_SESSION_TOKEN']}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
secret = json.loads(response.read())['SecretString']
credentials = json.loads(secret)
return credentialsCLI Reference
CLI参考
Secret Management
密钥管理
| Command | Description |
|---|---|
| Create secret |
| Get secret metadata |
| Retrieve secret value |
| Update secret |
| Delete secret |
| Restore deleted secret |
| List secrets |
| 命令 | 描述 |
|---|---|
| 创建密钥 |
| 获取密钥元数据 |
| 检索密钥值 |
| 更新密钥 |
| 删除密钥 |
| 恢复已删除密钥 |
| 列出密钥 |
Versions
版本
| Command | Description |
|---|---|
| Add new version |
| List versions |
| Move staging labels |
| 命令 | 描述 |
|---|---|
| 添加新版本 |
| 列出版本 |
| 移动阶段标签 |
Rotation
轮转
| Command | Description |
|---|---|
| Configure/trigger rotation |
| Cancel rotation |
| 命令 | 描述 |
|---|---|
| 配置/触发轮转 |
| 取消轮转 |
Best Practices
最佳实践
Secret Organization
密钥组织
- Use hierarchical names:
environment/application/secret-type - Tag secrets for organization and cost allocation
- Separate by environment (dev, staging, prod)
- 使用分层命名:
环境/应用程序/密钥类型 - 为密钥添加标签,便于组织和成本分配
- 按环境分离(开发、预发布、生产)
Security
安全
- Use resource policies to control access
- Enable encryption with customer-managed KMS keys
- Rotate secrets regularly (30-90 days)
- Audit access with CloudTrail
- Use VPC endpoints for private access
- 使用资源策略控制访问
- 启用加密,使用客户管理的KMS密钥
- 定期轮转密钥(30-90天)
- 通过CloudTrail审计访问
- 使用VPC端点实现私有访问
Access Control
访问控制
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
"Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/*",
"Condition": {
"StringEquals": {
"secretsmanager:ResourceTag/Environment": "production"
}
}
}
]
}json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
"Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/*",
"Condition": {
"StringEquals": {
"secretsmanager:ResourceTag/Environment": "production"
}
}
}
]
}Application Integration
应用集成
- Cache secrets to reduce API calls
- Handle rotation gracefully (retry with new credentials)
- Use Lambda extension for faster access
- Never log secrets
- 缓存密钥以减少API调用
- 优雅处理轮转(使用新凭据重试)
- 使用Lambda扩展加快访问速度
- 切勿记录密钥
Troubleshooting
故障排除
AccessDeniedException
AccessDeniedException
Causes:
- IAM policy missing
secretsmanager:GetSecretValue - Resource policy denying access
- KMS key policy missing permissions
Debug:
bash
undefined原因:
- IAM策略缺少权限
secretsmanager:GetSecretValue - 资源策略拒绝访问
- KMS密钥策略缺少权限
调试:
bash
undefinedCheck secret resource policy
Check secret resource policy
aws secretsmanager get-resource-policy --secret-id my-secret
aws secretsmanager get-resource-policy --secret-id my-secret
Check IAM permissions
Check IAM permissions
aws iam simulate-principal-policy
--policy-source-arn arn:aws:iam::123456789012:role/my-role
--action-names secretsmanager:GetSecretValue
--resource-arns arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret
--policy-source-arn arn:aws:iam::123456789012:role/my-role
--action-names secretsmanager:GetSecretValue
--resource-arns arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret
undefinedaws iam simulate-principal-policy
--policy-source-arn arn:aws:iam::123456789012:role/my-role
--action-names secretsmanager:GetSecretValue
--resource-arns arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret
--policy-source-arn arn:aws:iam::123456789012:role/my-role
--action-names secretsmanager:GetSecretValue
--resource-arns arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret
undefinedRotation Failed
轮转失败
Debug:
bash
undefined调试:
bash
undefinedCheck rotation status
Check rotation status
aws secretsmanager describe-secret --secret-id my-secret
aws secretsmanager describe-secret --secret-id my-secret
Check Lambda logs
Check Lambda logs
aws logs filter-log-events
--log-group-name /aws/lambda/SecretsManagerRotation
--filter-pattern "ERROR"
--log-group-name /aws/lambda/SecretsManagerRotation
--filter-pattern "ERROR"
**Common causes:**
- Lambda timeout (increase to 30+ seconds)
- Network connectivity (VPC configuration)
- Database connection issues
- Wrong secret formataws logs filter-log-events
--log-group-name /aws/lambda/SecretsManagerRotation
--filter-pattern "ERROR"
--log-group-name /aws/lambda/SecretsManagerRotation
--filter-pattern "ERROR"
**常见原因:**
- Lambda超时(增加至30秒以上)
- 网络连接问题(VPC配置)
- 数据库连接问题
- 密钥格式错误Secret Not Found
密钥未找到
bash
undefinedbash
undefinedList secrets to find correct name
List secrets to find correct name
aws secretsmanager list-secrets
--filters Key=name,Values=myapp
--filters Key=name,Values=myapp
aws secretsmanager list-secrets
--filters Key=name,Values=myapp
--filters Key=name,Values=myapp
Check if deleted (within recovery window)
Check if deleted (within recovery window)
aws secretsmanager list-secrets
--include-planned-deletion
--include-planned-deletion
undefinedaws secretsmanager list-secrets
--include-planned-deletion
--include-planned-deletion
undefined