当前位置: 首页 > news >正文

Secrets Manager Agent 升级:预取密钥 + IAM 角色切换,冷启动延迟直降 90%

"Lambda 冷启动 800ms,其中 600ms 在等 Secrets Manager 返回数据库密码。"

如果你的应用在启动时需要从 Secrets Manager 拉密钥,大概率踩过这个坑——API 调用延迟在冷启动路径上特别刺眼。正常运行时 Secrets Manager 响应几十毫秒不是问题,但冷启动时累积三四个密钥请求就是大几百毫秒。

亚马逊云科技上周给 Secrets Manager Agent 加了两个新能力:

  1. Pre-fetching — Agent 启动时预加载你配置好的密钥,应用启动时密钥已在本地缓存
  2. IAM Role Assumption — Agent 可以 assume 不同的 IAM 角色去拉不同作用域的密钥

这两个功能组合起来,解决了密钥获取在延迟敏感场景下的性能问题。

Secrets Manager Agent 是什么

先说背景。Secrets Manager Agent 是一个轻量级本地进程,跑在你的计算实例上(EC2、ECS、EKS Pod),充当应用和 Secrets Manager 服务之间的代理层。

它的核心价值:

  • 本地缓存:密钥拉一次缓存在内存里,不用每次都调 API
  • 自动轮转:密钥更新时自动刷新缓存
  • HTTP 接口:应用通过 http://localhost:2773 拉密钥,不用集成 AWS SDK

之前的限制:Agent 启动后要等第一次请求才去拉密钥(被动缓存)。现在有了 pre-fetching,变成主动预加载。

Pre-fetching 配置

基本配置

# /etc/secrets-manager-agent/config.yaml
cache:ttl: 300  # 缓存 5 分钟max_size: 100# 新增:预取配置
prefetch:enabled: truesecrets:- secret_id: "prod/database/mysql"- secret_id: "prod/api-keys/stripe"- secret_id: "prod/api-keys/sendgrid"- secret_id: "arn:aws:secretsmanager:us-east-1:123456789:secret:prod/redis-abc123"server:port: 2773bind: "127.0.0.1"

效果对比

# 不用 Pre-fetching(老方式):
# App 启动 → 请求 Secret A → 等 API 返回 (80ms)
#           → 请求 Secret B → 等 API 返回 (75ms)
#           → 请求 Secret C → 等 API 返回 (90ms)
# 总延迟: ~245ms# 用 Pre-fetching(新方式):
# Agent 启动 → 后台并行预取 A/B/C (一次性 ~100ms)
# App 启动 → 请求 Secret A → 本地缓存命中 (< 1ms)
#           → 请求 Secret B → 本地缓存命中 (< 1ms)
#           → 请求 Secret C → 本地缓存命中 (< 1ms)
# App 可见延迟: < 3ms

从 245ms 降到 3ms,延迟降了 90%+。

在 ECS Task Definition 中使用

{"containerDefinitions": [{"name": "secrets-agent","image": "public.ecr.aws/aws-secrets-manager/secrets-manager-agent:latest","essential": true,"portMappings": [{"containerPort": 2773, "protocol": "tcp"}],"environment": [{"name": "SECRETS_MANAGER_AGENT_CONFIG", "value": "/config/config.yaml"}],"mountPoints": [{"sourceVolume": "agent-config", "containerPath": "/config"}]},{"name": "my-app","image": "my-app:latest","dependsOn": [{"containerName": "secrets-agent", "condition": "HEALTHY"}],"environment": [{"name": "SECRETS_ENDPOINT", "value": "http://localhost:2773"}]}]
}

关键点:dependsOn + HEALTHY 确保 Agent 完成预取后应用才启动。

IAM Role Assumption

之前 Agent 只能用宿主实例的 IAM 角色拉密钥。如果一台机器跑多个微服务,每个服务需要不同密钥(不同权限边界),就得跑多个 Agent 实例。

现在可以配置多个角色:

# 多角色配置
roles:- name: "payments-role"role_arn: "arn:aws:iam::123456789:role/payments-secrets-reader"session_name: "payments-agent"secrets:- "prod/payments/stripe-key"- "prod/payments/bank-credentials"- name: "notifications-role"  role_arn: "arn:aws:iam::123456789:role/notifications-secrets-reader"session_name: "notifications-agent"secrets:- "prod/notifications/ses-credentials"- "prod/notifications/push-certs"- name: "analytics-role"role_arn: "arn:aws:iam::987654321:role/cross-account-analytics"external_id: "analytics-2026"secrets:- "prod/analytics/redshift-password"

跨账号场景

数据团队的密钥在账号 B,应用在账号 A:

import requests# 应用代码不变,Agent 自动 assume 对应角色
# 请求带上角色标识
response = requests.get('http://localhost:2773/secretsmanager/get',params={'secretId': 'prod/analytics/redshift-password','role': 'analytics-role'  # 指定用哪个角色},headers={'X-Aws-Parameters-Secrets-Token': os.environ['SECRETS_TOKEN']}
)secret = response.json()['SecretString']

IAM 策略示例

{"Version": "2012-10-17","Statement": [{"Sid": "AllowAgentToAssumeRoles","Effect": "Allow","Action": "sts:AssumeRole","Resource": ["arn:aws:iam::123456789:role/payments-secrets-reader","arn:aws:iam::123456789:role/notifications-secrets-reader","arn:aws:iam::987654321:role/cross-account-analytics"]}]
}

完整实战:EKS Pod 中使用

# Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: order-service
spec:template:spec:serviceAccountName: order-service-sa  # IRSA 绑定 IAM RoleinitContainers:- name: secrets-agent-initimage: public.ecr.aws/aws-secrets-manager/secrets-manager-agent:latestcommand: ["sh", "-c", "secrets-manager-agent --prefetch --wait-ready"]volumeMounts:- name: agent-socketmountPath: /var/run/secrets-agentcontainers:- name: order-serviceimage: order-service:latestenv:- name: DB_HOSTvalue: "prod-mysql.xxx.us-east-1.rds.amazonaws.com"- name: DB_PASSWORD_SECRETvalue: "prod/orders/db-password"- name: SECRETS_ENDPOINTvalue: "http://localhost:2773"- name: secrets-agentimage: public.ecr.aws/aws-secrets-manager/secrets-manager-agent:latestports:- containerPort: 2773volumeMounts:- name: agent-configmountPath: /configvolumes:- name: agent-configconfigMap:name: secrets-agent-config- name: agent-socketemptyDir: {}

性能数据

根据官方公告和实测估算:

场景 无 Agent Agent(无预取) Agent(预取)
首次获取密钥 80-120ms 80-120ms < 1ms
后续获取 80-120ms < 1ms < 1ms
冷启动 3 密钥 ~300ms ~300ms < 3ms
P99 延迟 200ms 5ms 2ms

我的判断

这个更新看起来不起眼,但对延迟敏感的应用来说是实打实的改进。

之前的最佳实践是在应用代码里自己做预加载(启动时主动调 Secrets Manager API),但这意味着每个应用都要写一遍这个逻辑。现在 Agent 层面解决了,应用代码可以更干净。

IAM 角色切换也是个实用功能——之前一台机器跑多个服务要么共享一个大权限角色(安全风险),要么跑多个 Agent(资源浪费)。现在一个 Agent 支持多角色,最小权限原则落地更自然了。

唯一要注意的:Agent 本身变成了关键路径。如果 Agent 挂了,所有依赖它的应用都拉不到密钥。建议配合健康检查和自动重启策略。


相关链接:

  • Secrets Manager Agent 更新公告:https://aws.amazon.com/about-aws/whats-new/2026/05/secrets-manager-agent-prefetch-and-role-assumption/
  • Secrets Manager Agent 文档:https://docs.aws.amazon.com/secretsmanager/latest/userguide/secrets-manager-agent.html
  • AWS Secrets Manager 产品页:https://aws.amazon.com/secrets-manager/
http://www.gsyq.cn/news/1416449.html

相关文章:

  • 【MATLAB】工业安全联锁与急停逻辑仿真验证
  • 6种字重双格式:PingFangSC苹果平方字体完整技术方案
  • 基于Arduino与舵机的交互式密码保险箱制作全攻略
  • Jina-embedding-t-en-v1在信息检索中的应用:构建高效语义搜索系统
  • 如何轻松实现微信聊天记录的永久保存与智能分析
  • Citra跨平台游戏模拟:3步快速配置终极指南
  • OpCore Simplify终极指南:如何3小时快速搭建稳定黑苹果系统
  • 3种技术方案解决跨平台字体显示难题:PingFangSC字体包实战指南
  • python学习随笔
  • 15分钟告别黑苹果配置噩梦:OpCore-Simplify智能向导带你轻松搞定OpenCore EFI
  • 通达信缠论插件:3分钟让技术分析效率提升90%
  • 合肥好柿科技有限公司(好柿科技)官网、联系方式、官方网站、联系电话、联系地址、抖音账号、公司地址 - 寻茫精选
  • G-Helper终极指南:如何用轻量级工具彻底掌控你的华硕笔记本
  • 专业跨平台字体方案:6种字重PingFangSC苹方字体实战指南
  • ppf-contact-solver行业应用:汽车、航空和医疗领域的潜在用途
  • 如何永久保存微信聊天记录:5步完整使用WeChatMsg终极指南
  • Deep-Live-Cam实时换脸终极指南:解决inswapper_128_fp16.onnx模型加载失败的完整方案
  • 巴中外贸建站推荐,WaiMaoYa 外贸鸭精准引流+高效转化,双重提升外贸业绩 - 外贸独立站运营
  • 告别U盘!用Windows Server 2019+WDS+MDT搭建企业级PXE批量装机环境(保姆级避坑)
  • OpCore Simplify深度解析:智能黑苹果EFI配置的完整解决方案
  • VEX机器人高速颜色分选机构设计:从气动活板门到毫秒级响应
  • Snowflake Arctic Embed-L架构深度解析:从BERT到SOTA的演进之路
  • 从1931年CIE标准到你的手机屏幕:Yxy/XYZ颜色空间的通俗图解与避坑指南
  • 2026卫生高级职称考试名师怎么选?数万考生实测真心推荐! - 医考机构品牌测评专家
  • 从‘/proc’文件系统看线程名:深入理解prctl、pthread_setname_np与Linux内核的交互
  • 基于AMB82-MINI与Arduino的实时人脸识别系统开发实践
  • 告别臃肿:用G-Helper给你的华硕笔记本做一次“瘦身手术“
  • 深圳雅思提分机构实测排行:五家机构核心能力对比 - 互联网科技品牌测评
  • BetterNCM Installer:5分钟快速搞定网易云音乐插件安装终极方案
  • LayoutLMv3-base-chinese应用场景大全:表单理解到文档视觉问答的8大案例