0Pricing
AWS Solutions Architect · 课时

Secrets Manager 与 Parameter Store

使用 Secrets Manager 自动轮换数据库凭证,在 Parameter Store 中存储非机密配置,并将两者与 Lambda 和 ECS 集成

Secrets Manager 与 Parameter Store 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

代码中存储机密信息的问题

一种常见且危险的反模式,是将机密信息(数据库密码、API 密钥、OAuth 令牌)存储在应用程序源代码、环境变量或提交到版本控制系统的配置文件中。当这些代码仓库暴露时——例如意外公开,或被攻击者访问——所有机密信息都会立即泄露。AWS 提供了两项托管服务来消除这一问题:用于需要自动轮换的凭证的 AWS Secrets Manager,以及用于配置值和不轮换机密信息的 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 current

AWS Secrets Manager 概览

AWS Secrets Manager 是一项用于存储、检索和自动轮换机密信息的托管服务。它使用 KMS 加密所有机密信息(默认使用 AWS 托管密钥,也可以使用您的 CMK)。机密信息可以使用键值 JSON 字符串存储任意结构化数据。Secrets Manager 的费用为每个机密每月 0.40 美元,另加每 10,000 次 API 调用 0.05 美元。它与 Parameter Store 的主要区别在于:通过 Lambda 轮换函数,Secrets Manager 可为 RDS、Redshift、DocumentDB 和自定义机密提供内置自动轮换,轮换期间无需更改应用程序。

# 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 为 Java 和 Python 提供了官方的Secrets Manager 缓存客户端,可以按照可配置的 TTL 缓存密钥。缓存过期后,客户端会从 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 不支持自动轮换——它面向不经常变化的配置值。标准参数免费,最多可存储 4 KB。Advanced 参数支持更大的值(最多 8 KB)、参数策略(过期和轮换提醒),费用为每个参数每月 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 text

Parameter 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 --recursive

Secrets 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 secrets

与 Lambda 和 ECS 集成

Lambda 函数和 ECS 任务应在启动时获取密钥,而不是在每次调用时获取。对于 Lambda:在初始化代码中(处理程序函数之外)获取密钥,并将其缓存到全局变量中——Lambda 执行环境会在多次调用之间持续存在,因此每个环境生命周期内只需获取一次密钥。对于 ECS:在任务定义中使用 secrets 字段,将 Secrets Manager 值或 Parameter Store SecureStrings 注入为环境变量——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 start

使用 Parameter Store 存储 EC2 AMI ID

Parameter Store 一个实用但经常被忽视的用途,是存储 AMI ID 和其他部署引用。不要将 AMI ID 硬编码在 CloudFormation 模板中(新 AMI 发布后,硬编码的 ID 会变得过时),而应引用 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 警报,以便在密钥访问偏离正常模式时发出提醒——例如,当生产密钥由异常 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」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「Secrets Manager 与 Parameter Store」这节课中我会学到什么?

使用 Secrets Manager 自动轮换数据库凭证,在 Parameter Store 中存储非机密配置,并将两者与 Lambda 和 ECS 集成 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「Secrets Manager 与 Parameter Store」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. KMS、ACM 与加密模式
  2. GuardDuty、Inspector 与 Macie
  3. Secrets Manager 与 Parameter Store
  4. WAF、Shield 与 Network Firewall
← 返回 AWS Solutions Architect