无权承担提供的角色

时间:2019-06-04 02:09:50

标签: javascript node.js aws-lambda aws-step-functions

我正在关注AWS Step Functions tutorial。整个状态机过程就是这样。

enter image description here

我有一个名为{strong> step_functions_basic_execution 的角色,具有策略AWSLambdaRole。我的Step功能状态机正在使用此角色。

我的步进功能是

{
  "Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
  "StartAt": "Open Case",
  "States": {
    "Open Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-west-2:829495130000:function:OpenCaseFunction",
      "Next": "Assign Case"
    }, 
    ...
}

相应的 Open Case Lambda函数是

exports.handler = (event, context, callback) => {
    // Create a support case using the input as the case ID, then return a confirmation message   
   var myCaseID = event.inputCaseID;
   var myMessage = "Case " + myCaseID + ": opened...";   
   var result = {Case: myCaseID, Message: myMessage};
   callback(null, result);    
};

当我尝试运行它时,它在第一步打开案例中失败。

输入为

{
  "inputCaseID": "001"
}

它引发错误:

  

States.TaskFailed

     

全球服务负责人states.amazonaws.com和   区域一级被授权承担提供的角色。

任何想法如何解决?谢谢

5 个答案:

答案 0 :(得分:1)

仔细检查该页面的步骤2、3和4中的所有内容。不幸的是,该错误消息的详细程度不足以使我们确切了解发生了什么,但这是通过IAM设置的。

答案 1 :(得分:1)

角色需要有如下描述:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "states.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}

看服务名称:states.amazonaws.com 不是 lambda.amazonaws.com

再见!

答案 2 :(得分:0)

感谢Joel Kinzel的指南。这是我的错误。

在步骤2c中我做错了。

  

在Create Roles屏幕上,保持AWS服务处于选中状态,选择Step   功能

我选择了 Lambda 而不是 Step Functions ,即使我仍在下一页上添加了AWSLambdaRole,但这仍然无济于事。

>

答案 3 :(得分:0)

您需要创建两个角色: 一种) Lambda的IAM角色(LambdaExecutionRole)。此角色不需要任何策略,并且不需要以下信任关系定义:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

B)第二个角色(StatesExecutionRole)是让StateMachine能够调用lambda函数。这些角色需要以下策略定义:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

并且需要这种信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "states.us-east-2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

需要将LambdaExecutionRole分配给您的lambda。 需要将StatesExecutionRole分配为用于执行StateMachine的角色。

答案 4 :(得分:0)

我知道这是一个旧帖子并且已经被批准为已解决, 但也许这会帮助某人...

我遇到了类似的错误,但使用了另一个 aws 指南来创建角色: https://docs.amazonaws.cn/en_us/step-functions/latest/dg/tutorial-lambda-state-machine-cloudformation.html#lambda-state-machine-cfn-create-role

我的案例的问题与地区有关。

我从 eu-west-1 区域运行 StepFunction 并得到与问题中发布的相同的错误:

States.TaskFailed

Neither the global service principal states.amazonaws.com, nor the regional 
one is authorized to assume the provided role.

尽管我的 stepFunction 角色配置与指南中描述的完全相同:

StatesExecutionRole:
 Type: "AWS::IAM::Role"
 Properties:
   AssumeRolePolicyDocument:
     Version: "2012-10-17"
     Statement:
       - Effect: "Allow"
         Principal:
           Service:
             - !Sub states.${AWS::Region}.amazonaws.com
         Action: "sts:AssumeRole"
   Path: "/"
   Policies:
     - PolicyName: StatesExecutionPolicy
       PolicyDocument:
         Version: "2012-10-17"
         Statement:
           - Effect: Allow
             Action:
               - "lambda:InvokeFunction"
             Resource: "*"

创建角色后,我注意到我的角色的受信任实体是:

"states.us-east-1.amazonaws.com"

trusted entities

所以,这就是为什么我不能从 us-east-1 以外的其他地区运行 SFN。 因此,如果您使用相同的指南,请注意从中创建的可信实体。 我最终将角色更改为通用服务配置(“states.amazonaws.com”),如下所示:

StatesExecutionRole:
Type: "AWS::IAM::Role"
Properties:
  AssumeRolePolicyDocument:
    Version: "2012-10-17"
    Statement:
      - Effect: "Allow"
        Principal:
          Service:
            - "states.amazonaws.com"
        Action: "sts:AssumeRole"
  Path: "/"
  Policies:
    - PolicyName: StatesExecutionPolicy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - "lambda:InvokeFunction"
            Resource: "*"

这解决了我的问题。