使用Runtime Role从SageMaker Studio连接EMR集群失败:凭证为空
问题背景
尝试从SageMaker Unified Studio连接现有EMR集群,通过JupyterLab运行SQL查询。已完成SageMaker要求的Runtime Role集成配置:
- 创建EMR安全配置:启用传输中加密,认证设为IAM,授权设为Runtime Role;
- 使用该安全配置启动EMR集群,按AWS指南配置Access Role;
- 按官方文档设置Runtime Role。
正常验证场景
- 可从Unified Studio的JupyterLab终端使用Runtime Role成功提交EMR步骤;
- 可通过
sm_analytics魔法命令连接EMR集群并启动Spark会话。
异常现象
将现有EMR集群添加到Unified Studio项目(填写Access Role ARN、Cluster ARN、Instance Profile ARN)后,在Notebook中使用关联的EMR计算执行基础SQL查询时,出现凭证链失效错误:
[com.amazon.ws.emr.hadoop.fs.guice.UserGroupMappingAWSSessionCredentialsProvider@1f408ab6:
Cannot invoke "com.amazonaws.auth.AWSCredentials.getAWSAccessKeyId()" because "credentials" is null,com.amazon.ws.emr.hadoop.fs.HadoopConfigurationAWSCredentialsProvider@46e388ec:
Cannot invoke "com.amazonaws.auth.AWSCredentials.getAWSAccessKeyId()" because "credentials" is null,com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.auth.InstanceProfileCredentialsProvider@28f05b0c:
Internal Server Error (Service: null; Status Code: 500; Error Code: null; Request ID: null; Proxy: null)]
已尝试通过SageMaker→域→用户配置文件→应用配置→Jupyter设置将Runtime Role设为EMR执行角色,但问题未解决。
排查方向与解决方案
1. 验证EMR Instance Profile的权限与信任关系
- 确认Instance Profile关联的IAM角色具备Spark执行所需的基础权限(如
s3:GetObject、ec2:DescribeInstances),且信任策略允许ec2.amazonaws.com扮演该角色; - 检查EMR集群的主节点、核心节点是否已正确关联该Instance Profile,可通过EC2控制台查看实例的IAM角色配置。
2. 检查Runtime Role的权限传递配置
- 确保Runtime Role的信任策略同时允许SageMaker服务和EMR Access Role扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[你的AWS账号ID]:role/[EMR Access Role名称]" }, "Action": "sts:AssumeRole" } ] } - 确认Runtime Role拥有访问EMR集群资源(HDFS、关联S3存储)及EMR管理操作(
emr:ListClusters、emr:DescribeCluster)的权限。
3. 排查网络与安全组连通性
- 确认SageMaker域所在VPC与EMR集群VPC存在网络连通(同一VPC或已配置VPC对等连接);
- 检查EMR主节点安全组是否允许来自SageMaker域的入站流量(包括Spark服务端口7077、HDFS相关端口等)。
4. 检查Unified Studio项目的EMR配置参数
- 确认添加EMR集群时填写的Access Role ARN是EMR的服务角色(而非Instance Profile角色),Instance Profile ARN是EMR节点使用的实例配置文件;
- 在Notebook中显式指定Runtime Role启动Spark会话,测试是否能绕过配置问题:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.hadoop.fs.s3a.aws.credentials.provider", "com.amazon.ws.emr.hadoop.fs.auth.RoleBasedAuthAWSCredentialsProvider") \ .config("spark.hadoop.fs.s3a.role.arn", "[你的Runtime Role ARN]") \ .getOrCreate()
5. 查看日志定位具体问题
- 登录EMR主节点,查看HDFS或Spark相关日志(如
/var/log/hadoop-hdfs/hadoop-hdfs-namenode-*.log、/var/log/spark/spark-history-server-*.log),获取凭证失败的详细触发信息; - 检查SageMaker Notebook执行角色是否具备
sts:AssumeRole权限来获取Runtime Role的临时凭证。
内容的提问来源于stack exchange,提问作者valzor

