调用SageMaker CreateTrainingJob报无法代入IAM角色错误排查求助
问题说明
调用SageMaker CreateTrainingJob接口创建训练任务时抛出如下报错:
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the CreateTrainingJob operation: Could not assume role arn:aws:iam::<'role'>. Please ensure that the role exists and allows principal 'sagemaker.amazonaws.com' to assume the role.
对应业务代码如下:
try: sagemaker_role = sagemaker.get_execution_role() except ValueError: iam = boto3.client('iam') sagemaker_role = iam.get_role(RoleName='<sagemaker-IAM-role-name>')['Role']['Arn'] print('role_is', sagemaker_role) training_image = image_uris.retrieve( framework="sklearn", region='us-east-2', version='0.20.0', py_version="py3", instance_type="ml.c5.xlarge", ) print(training_image) sm_boto3 = boto3.client("sagemaker", region_name='us-east-2') print(sm_boto3) response = sm_boto3.create_training_job( .... )
初步怀疑为botocore配置问题,需要boto3相关参数的正确配置方案。
问题根因
该报错和botocore/boto3本身配置无关,核心原因是传入训练任务的IAM角色无法被SageMaker服务正常代入,常见触发场景:
- 代码中
<sagemaker-IAM-role-name>占位符未替换为实际存在的IAM角色名,获取到的是无效的占位符ARN - 目标IAM角色的信任策略未配置
sagemaker.amazonaws.com为授信主体,SageMaker没有权限代入该角色 - 获取到的角色ARN格式错误,存在多余字符、账号ID/角色名和IAM控制台实际资源不匹配的问题
修复步骤
- 修正角色获取逻辑
将代码中RoleName参数的占位符替换为IAM控制台实际创建的SageMaker角色名,运行代码后查看role_is的打印结果,确认ARN格式为标准格式arn:aws:iam::<12位AWS账号ID>:role/<真实角色名>,不存在尖括号、单引号等多余占位字符。 - 配置角色信任策略
进入IAM控制台找到对应角色,编辑信任关系,添加如下允许SageMaker代入角色的策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
如果该角色需要同时被其他AWS服务调用,可在Service列表中追加对应服务标识即可。
3. 补充角色必要权限
给该角色附加SageMaker训练任务所需的基础权限,包括S3训练数据/模型产物读写权限、CloudWatch日志写入权限,避免任务启动后出现权限阻断。
4. 修正接口传参
调用create_training_job时,RoleArn参数直接传入校验完成的sagemaker_role变量即可,无需额外拼接内容,基础传参参考:
response = sm_boto3.create_training_job( TrainingJobName="自定义训练任务名称", RoleArn=sagemaker_role, # 其余训练镜像、计算资源、输入输出通道等参数按业务需求补充 )
内容的提问来源于stack exchange,提问作者Joon
相关产品推荐
相关产品推荐

