STS凭证调用Sagemaker InvokeEndpoint失败,IAM凭证正常可用
问题描述
使用STS生成的凭证调用Sagemaker端点时,收到如下权限错误:
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the InvokeEndpoint operation: User: arn:aws:sts::{REDACTED_AWS_ACCOUNT_ID}:federated-user/{REDACTED_USER_SUFFIX} is not authorized to perform: sagemaker:InvokeEndpoint on resource: arn:aws:sagemaker:us-west-2:{REDACTED_AWS_ACCOUNT_ID}:endpoint/{REDACTED_ENDPOINT} because no identity-based policy allows the sagemaker:InvokeEndpoint action
但使用同一权限策略的IAM凭证调用该端点却正常。相关配置如下:
权限策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:InvokeEndpoint" ], "Resource": [ "arn:${ .aws_partition }:sagemaker:${ .aws_region }:${ .aws_account_id }:endpoint/${ .endpoint }", ] } ] }
STS角色信任关系
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
当前使用Vault代理生成STS凭证,此前其他AWS服务使用同类方式生成的凭证正常。
核心原因与解决方法
1. 角色信任关系配置错误(最可能原因)
你当前角色的信任关系仅授权Sagemaker服务本身(sagemaker.amazonaws.com)扮演该角色,这是给Sagemaker内部作业(如训练、批量转换)使用的服务角色,并非给外部身份(如Vault、你的用户身份)Assume的角色。
当通过Vault生成STS凭证时,本质是Vault代表你的身份调用sts:AssumeRole,但该角色的信任关系未允许Vault或源身份执行此操作——导致生成的STS凭证对应的federated-user身份并未关联到带InvokeEndpoint权限的角色,自然触发权限错误。
修正方案
修改角色信任关系,添加允许Vault或源身份Assume的规则。例如,如果Vault通过特定IAM角色发起请求,将该角色ARN加入Principal:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${你的AWS账号ID}:role/Vault使用的IAM角色名" }, "Action": "sts:AssumeRole" }, // 若需保留给Sagemaker服务使用,可保留原有规则 { "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2. 策略变量未正确解析
权限策略中的${ .aws_partition }、${ .aws_region }等变量,需确认在生成STS凭证时是否被正确替换为实际值(如aws、us-west-2)。若变量未解析,策略中的Resource会是无效ARN,导致权限匹配失败。
而IAM用户使用时变量能正常生效,可能是因为IAM策略与STS角色策略的变量解析逻辑不同,或Vault生成凭证时未处理这些变量。
验证方法
临时使用硬编码ARN的策略测试:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sagemaker:InvokeEndpoint", "Resource": "arn:aws:sagemaker:us-west-2:你的AWS账号ID:endpoint/你的端点名称" } ] }
若硬编码后STS凭证可正常调用,说明是变量替换问题。
3. STS凭证未正确关联目标角色
需确认生成STS凭证时,是否成功Assume了带InvokeEndpoint权限的角色。可调用sts:GetCallerIdentity查看凭证对应的身份信息:
- 若返回的是
arn:aws:sts::xxx:assumed-role/目标角色名/xxx,说明角色关联正常; - 若仅返回
federated-user,说明未成功Assume目标角色,需检查Vault的STS生成配置是否正确指定了目标角色ARN。
内容的提问来源于stack exchange,提问作者kav

