把 SageMaker AI 支持排障从数天缩短到数分钟:Deepgram 的 IAM 临时委派方案

2026-07-28 26 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:12 分钟

当 Deepgram 语音模型运行在客户自己的 Amazon SageMaker AI 环境中时,真正棘手的往往不是模型本身,而是支持工程师如何在不索取长期凭证、不过度开放权限的前提下,快速看到故障现场。

Deepgram 为此引入了基于 AWS IAM 的临时委派机制。按照其披露的结果,这项集成把 SageMaker AI 支持工单的初步调查时间从数天缩短到了数分钟。它解决的核心问题不是“如何获得更多权限”,而是“如何让正确的人在有限时间内获得恰好够用、可以审计且能够撤销的权限”。

为什么传统支持流程容易拖上几天

在客户自有 AWS 账户中部署模型,天然形成了一条安全边界。Deepgram 的支持团队默认无法查看 SageMaker 端点状态、模型配置、CloudWatch 指标或部署日志,这正是多租户云环境应有的隔离方式。

问题发生后,传统流程通常需要多轮往返:

  • 支持工程师列出需要检查的资源和命令。
  • 客户在自己的账户中运行命令,清理敏感信息后返回结果。
  • 支持团队发现还缺一个字段、一个时间窗口或另一组日志。
  • 双方继续交换截图、日志文件和配置片段。

这种方式虽然保持了账户隔离,但上下文会在人工传递中丢失。尤其是间歇性错误、自动扩缩容异常或容器启动失败,等日志转交到支持团队手中时,关键时间窗口可能已经过去。

另一种看似直接的做法是提供 IAM 用户访问密钥,但它引入了更大的问题:长期凭证需要保存、轮换和吊销,一旦泄露,风险不会随着工单关闭自动消失。临时委派更适合支持场景,因为 AWS STS 签发的会话凭证有明确的到期时间,而且每次角色切换都可以进入 CloudTrail 审计记录。

端到端链路如何运转

来源摘要没有披露 Deepgram 集成所使用的具体角色名称、权限策略或授权接口,因此下面按标准 AWS IAM 跨账户角色模型解释其工作方式。实际接入时应以 Deepgram 提供的部署文档、受信任主体 ARN 和 External ID 要求为准。

一条典型链路包含以下步骤:

  1. 客户针对支持工单发起授权,并明确允许检查的 AWS 账户、区域和资源。
  2. 客户账户中的 IAM 角色只信任 Deepgram 指定的 AWS 主体,并通过 ExternalId 约束角色切换请求。
  3. 该角色只包含调查所需的只读权限,例如查看 SageMaker 端点、模型配置、指标和指定日志组。
  4. Deepgram 支持系统调用 AWS STS AssumeRole,获得短期访问密钥、秘密密钥和会话令牌。
  5. 支持工程师或自动诊断工具在会话有效期内读取现场信息。
  6. 凭证到期后自动失效;客户也可以提前撤销角色信任关系或删除临时角色。
  7. 客户使用 CloudTrail 检查谁在什么时间切换了角色,以及会话执行过哪些 AWS API 调用。

这里有两个不同的时间边界需要区分:IAM 角色可以长期存在,但 AssumeRole 返回的是短期会话。如果企业要求“工单关闭即失效”,还应在工单流程中禁用角色、删除信任策略或使用自动化任务回收授权,不能只依赖会话过期。

可以这样实践:创建一个最小只读支持角色

下面是一份可以改造的参考脚本。它不代表 Deepgram 官方策略;运行前必须替换四个变量,并根据实际诊断需求继续收紧资源范围。

需要修改:

  • TRUSTED_SUPPORT_ROLE_ARN:服务商给出的受信任 IAM 角色 ARN。
  • EXTERNAL_ID:为当前客户或工单生成的不可预测标识。
  • AWS_REGION:SageMaker 资源所在区域。
  • ENDPOINT_NAME:需要调查的端点名称。

脚本需要本地已安装并配置 AWS CLI,执行身份还必须具备创建 IAM 角色和策略的权限。

#!/usr/bin/env bash
set -euo pipefail

ROLE_NAME="DeepgramSageMakerSupport"
TRUSTED_SUPPORT_ROLE_ARN="arn:aws:iam::123456789012:role/vendor-support-role"
EXTERNAL_ID="replace-with-ticket-specific-random-value"
AWS_REGION="us-east-1"
ENDPOINT_NAME="replace-with-your-endpoint"
ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"

cat > /tmp/support-trust-policy.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "${TRUSTED_SUPPORT_ROLE_ARN}"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "${EXTERNAL_ID}"
        }
      }
    }
  ]
}
EOF

aws iam create-role \
  --role-name "${ROLE_NAME}" \
  --max-session-duration 3600 \
  --assume-role-policy-document file:///tmp/support-trust-policy.json

cat > /tmp/support-read-policy.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InspectTargetEndpoint",
      "Effect": "Allow",
      "Action": [
        "sagemaker:DescribeEndpoint",
        "sagemaker:ListTags"
      ],
      "Resource": "arn:aws:sagemaker:${AWS_REGION}:${ACCOUNT_ID}:endpoint/${ENDPOINT_NAME}"
    },
    {
      "Sid": "InspectRelatedConfiguration",
      "Effect": "Allow",
      "Action": [
        "sagemaker:DescribeEndpointConfig",
        "sagemaker:DescribeModel"
      ],
      "Resource": [
        "arn:aws:sagemaker:${AWS_REGION}:${ACCOUNT_ID}:endpoint-config/*",
        "arn:aws:sagemaker:${AWS_REGION}:${ACCOUNT_ID}:model/*"
      ]
    },
    {
      "Sid": "ReadDeploymentMetrics",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:GetMetricData",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:ListMetrics"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ReadEndpointLogs",
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "logs:FilterLogEvents"
      ],
      "Resource": "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/Endpoints/${ENDPOINT_NAME}:*"
    }
  ]
}
EOF

aws iam put-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "SageMakerSupportReadOnly" \
  --policy-document file:///tmp/support-read-policy.json

printf 'Support role ARN: arn:aws:iam::%s:role/%s\n' "${ACCOUNT_ID}" "${ROLE_NAME}"

示例把 STS 会话上限设为一小时,但实际调用 AssumeRole 时还可以申请更短的会话。例如,支持侧可以把一次调查限制为 15 分钟:

aws sts assume-role \
  --role-arn "arn:aws:iam::111122223333:role/DeepgramSageMakerSupport" \
  --role-session-name "support-ticket-8472" \
  --external-id "replace-with-ticket-specific-random-value" \
  --duration-seconds 900

会话名称应包含不敏感的工单标识,方便在 CloudTrail 中关联调查活动。不要把客户名称、问题描述、录音内容或其他敏感数据放进会话名称。

调查结束后,可以立即删除内联策略和角色:

ROLE_NAME="DeepgramSageMakerSupport"

aws iam delete-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "SageMakerSupportReadOnly"

aws iam delete-role --role-name "${ROLE_NAME}"

如果角色需要保留给后续工单使用,可以改为更新信任策略,移除外部支持主体,并在下一次授权时生成新的 External ID。

从“临时访问”升级到可治理的支持通道

真正缩短排障时间的,不只是 AssumeRole 这一个 API,而是围绕它建立的完整工作流。授权入口、权限模板、会话时长、审计记录和工单状态需要连接起来,支持人员才能在几分钟内开始调查,同时让安全团队掌握访问边界。

落地时应重点检查以下事项:

  • 最小权限:从只读的 DescribeGet 和日志查询权限开始,不要默认授予 AmazonSageMakerFullAccess 或管理员权限。
  • 资源范围:尽量限定到故障端点及其日志组。若必须使用通配符,应记录原因并缩短授权时间。
  • 防止 confused deputy:跨账户角色使用服务商提供的精确 Principal ARN,并配置每个客户或每张工单独有的 External ID。
  • 敏感数据边界:日志可能包含请求元数据、对象存储路径,甚至业务输入。支持角色不应自动获得 S3 数据读取权限;确有需要时单独审批。
  • 审计与告警:记录 AssumeRole 和会话内 API 调用,并对非预期区域、超出工单时间窗口或高频读取行为告警。
  • 自动回收:工单关闭后撤销信任关系或删除角色,将“结束授权”做成流程动作,而不是依赖人工记忆。
  • 权限验证:上线前使用 IAM Access Analyzer、策略模拟器和测试账户验证策略,避免因为少一个权限而重新走多轮审批,也避免开放无关资源。

Deepgram 的实践说明,客户托管的 AI 模型并不意味着服务商只能依靠截图和邮件远程猜测。把临时委派设计成产品化能力后,支持团队可以直接读取必要的运行状态,客户仍然保留授权、审计和撤销权。速度来自消除信息往返,而安全性来自短期凭证、最小权限和可验证的访问记录,三者缺一不可。


相关推荐