Amazon web services 无法使用来自EC2 IAM角色的临时凭据启动EMR作业流

Amazon web services 无法使用来自EC2 IAM角色的临时凭据启动EMR作业流,amazon-web-services,amazon-emr,Amazon Web Services,Amazon Emr,我有一个实例被分配了EC2 IAM角色。我无法使用角色分配实例提供的临时凭据从此实例创建EMR作业流,我从API获得以下响应: <Error> <Type>Sender</Type> <Code>ValidationError</Code> <Message>Service role and InstanceProfile are required for calls made with temp

我有一个实例被分配了EC2 IAM角色。我无法使用角色分配实例提供的临时凭据从此实例创建EMR作业流,我从API获得以下响应:

  <Error>
    <Type>Sender</Type>
    <Code>ValidationError</Code>
    <Message>Service role and InstanceProfile are required for calls made with temporary credentials provided by STS</Message>
  </Error>
谷歌搜索这个错误消息完全没有发现任何东西。无论我直接使用AWS CLI还是
boto
,我都会从API获得相同的响应。为了遵循此错误消息的建议,我尝试将
{InstanceProfile:}
传递给boto中
run\u jobflow
方法的
api_params
参数,但仍然得到相同的错误。我还尝试使用
service\u role
参数作为
run\u jobflow
,但也失败了。将两者同时传递也失败了


根据Amazon docs提供的信息,EMR应该支持STS和EC2 IAM角色,因此想知道以前是否有人使用过此功能。

是的,我使用以下方法成功地实现了此功能:

  • 明确的
    服务角色
    (使用
    EMR\u DefaultRole
    作为模板)
  • 明确的
    作业流角色
    (使用
    EMR\u EC2\u DefaultRole
    作为模板)
  • iam:PassRole
    权限(用于
    服务角色
    资源)授予EC2 iam角色

    • 我用java实现了这一点。和Sam一样,我指定了服务角色和作业流角色。令我惊讶的是,关于InstanceProfile的错误要求我设置jobflow角色。例:

      myRunJobFlowRequest.setServiceRole("EMR_DefaultRole");
      myRunJobFlowRequest.setJobFlowRole("EMR_EC2_DefaultRole")
      
      "Policies": [
                {
                  "PolicyName": "AmazonElasticMapReduceFullAccess",
                  "PolicyDocument": {
                    "Statement": [
                      {
                        "Effect": "Allow",
                        "Action": "*",
                        "Resource": "*"
                      }
                    ]
                  }
                }
      
      我做的另一件事是在我的云形成模板中,我将AmazonElasticMapReduceFullAccess策略授予我的实例角色。例:

      myRunJobFlowRequest.setServiceRole("EMR_DefaultRole");
      myRunJobFlowRequest.setJobFlowRole("EMR_EC2_DefaultRole")
      
      "Policies": [
                {
                  "PolicyName": "AmazonElasticMapReduceFullAccess",
                  "PolicyDocument": {
                    "Statement": [
                      {
                        "Effect": "Allow",
                        "Action": "*",
                        "Resource": "*"
                      }
                    ]
                  }
                }
      

      我使用的是boto,为了使其正常工作,我需要在我的调用中设置:job\u flow\u role='EMR\u EC2\u DefaultRole'service\u role='EMR\u DefaultRole'来运行\u jobflow此策略允许受影响的资源执行他们喜欢的任何AWS操作。这可能太过分了。