【问题标题】:Not authorized to assume the provided role无权担任提供的角色
【发布时间】:2019-10-19 13:10:29
【问题描述】:

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

我有一个名为 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 和 区域一级被授权担任所提供的角色。

知道如何解决吗?谢谢

【问题讨论】:

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


    【解决方案1】:

    感谢 Joel Kinzel 的指导。这是我的错。

    我在第 2c 步做错了。

    在创建角色屏幕上,选择 AWS 服务,选择步骤 功能

    我选择了 Lambda 而不是 Step Functions,甚至下一页我仍然添加了AWSLambdaRole,但这并没有帮助并导致问题。

    【讨论】:

      【解决方案2】:

      角色需要有如下描述:

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

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

      再见!

      【讨论】:

      【解决方案3】:

      仔细检查该页面第 2、3 和 4 步中的所有内容。不幸的是,错误消息不够详细,我们无法确切知道发生了什么,但它与 IAM 设置有关。

      【讨论】:

      • 谢谢,这正是我的感觉。我再次按照教程进行操作并遇到了同样的问题。本教程没有明确说明应为 IAM 角色添加哪些策略。我是根据他们的截图。我尝试为 step_functions_basic_execution 角色再添加一项策略 AWSStepFunctionsFullAccess,但仍然相同。我会发送他们的反馈,看看是否得到任何回复并回复。
      【解决方案4】:

      您需要创建两个角色: 一种) 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 的角色。

      【讨论】:

      【解决方案5】:

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

      我遇到了类似的错误,但使用了另一个 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: "*"
      

      这解决了我的问题。

      【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2019-09-02
      • 2018-09-10
      • 2021-03-09
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2021-03-03
      • 2017-11-20
      相关资源
      最近更新 更多