通过Data Pipeline在私有子网部署EMR遇ServiceAccessSecurityGroup字段错误求助
Invalid Field: 'ServiceAccessSecurityGroup'错误 我之前也碰到过一模一样的问题!当时用CloudFormation一键启动EMR完全没问题,换成Data Pipeline就报这个字段无效的错,折腾了好几个小时才理清头绪,给你分享几个亲测有效的解决方向:
检查参数名的拼写和格式
Data Pipeline里的EMR活动参数和CloudFormation的参数名有时候会有细微差异,而且AWS的参数对大小写非常敏感!比如你是不是把参数名写成了ServiceAccessSecurityGroup,但Data Pipeline要求的其实是serviceAccessSecurityGroup(全小写开头)?另外,这个参数需要传入的是安全组ID(比如sg-xxxxxx),而不是安全组名称,别搞混了。验证Data Pipeline服务角色的权限
对比下CloudFormation用的执行角色,看看Data Pipeline的默认角色(比如DataPipelineDefaultRole)是不是缺少了必要的权限。比如需要有ec2:DescribeSecurityGroups来读取安全组信息,还要有足够的权限在私有子网内创建EMR相关资源。可以给角色添加上AmazonEMRFullAccess或者更精细的权限试试。确认安全组和子网的关联关系
确保你指定的ServiceAccessSecurityGroup和目标私有子网属于同一个VPC,并且安全组已经和子网做了关联。另外,安全组的入站规则要允许EMR服务的访问(比如允许VPC内的流量,或者EMR服务的官方IP段),不然就算参数对了,集群也启动不了。尝试用参数引用代替硬编码
有时候直接在Data Pipeline配置里硬写安全组ID会出现格式识别问题,试试定义一个Pipeline参数(比如ServiceSGId),然后在EMR活动的配置里用#{ServiceSGId}来引用这个参数,很多时候能解决字段无效的报错。检查EMR版本的兼容性
不同EMR版本对应的Data Pipeline参数可能有变化,比如某些旧版本的参数在新版本里被废弃或者重命名了。确认你用CloudFormation启动的EMR版本和Data Pipeline里指定的版本完全一致,不一致的话很容易出现参数不兼容的问题。
内容的提问来源于stack exchange,提问作者SVV

