在Amazon EMR部署Apache Spark时执行add-steps命令遇权限错误
解决Amazon EMR AddJobFlowSteps AccessDeniedException问题
看起来你在集群节点上执行aws emr add-steps提交Spark作业时碰到了权限拒绝的问题,报错里的身份是EMR_EC2_DefaultRole的实例角色,这个问题通常和IAM权限配置、S3资源访问或者命令格式有关,我给你梳理几个排查和解决的方向:
1. 给EMR_EC2_DefaultRole添加AddJobFlowSteps权限
EMR_EC2_DefaultRole是EMR集群节点默认使用的角色,但它默认没有elasticmapreduce:AddJobFlowSteps权限,你需要手动给这个角色附加对应的IAM策略:
- 打开AWS IAM控制台,找到
EMR_EC2_DefaultRole角色 - 添加一个自定义权限策略,内容如下(记得替换成你的AWS区域):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "elasticmapreduce:AddJobFlowSteps", "Resource": "arn:aws:elasticmapreduce:你的区域:503059920414:cluster/j-10366NQM2PJDC" } ] }
如果需要允许该角色给所有EMR集群添加步骤,可以把Resource字段改成arn:aws:elasticmapreduce:你的区域:503059920414:cluster/*
2. 验证S3资源的访问权限
你的命令里涉及三个S3路径:s3://wordCount.py、s3://input-bucket/inputFile.txt、s3://output-bucket/,EMR_EC2_DefaultRole必须拥有这些路径的对应权限:
- 对于Python脚本和输入文件:需要
s3:GetObject权限 - 对于输出桶:需要
s3:PutObject和s3:ListBucket权限
给角色添加包含这些权限的策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": [ "s3://wordCount.py", "s3://input-bucket/inputFile.txt" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "s3://output-bucket", "s3://output-bucket/*" ] } ] }
3. 修正命令的格式问题
在shell环境下,Args参数的数组格式容易被解析错误,建议用引号包裹整个Args内容避免逗号被拆分,修正后的命令如下:
aws emr add-steps --cluster-id j-10366NQM2PJDC --steps Type=spark,Name=SparkWordCountApp,Args="--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=false,--num-executors,5,--executor-cores,5,--executor-memory,20g,s3://wordCount.py,s3://input-bucket/inputFile.txt,s3://output-bucket/",ActionOnFailure=CONTINUE
如果是zsh等特殊shell,可能需要用单引号或者转义逗号来确保参数正确传递。
4. 检查角色的信任关系
确保EMR_EC2_DefaultRole的信任策略允许EC2实例扮演它,信任策略应该包含以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
如果信任关系被修改过,可能会导致集群实例无法正确获取角色权限。
内容的提问来源于stack exchange,提问作者user2103635
相关产品推荐
相关产品推荐

