Step Function 中的嵌套 Step Function:未知错误:“...无权创建托管规则”

Mat*_*att 18 amazon-web-services aws-cloudformation amazon-iam aws-step-functions aws-sam

我在 SAM/CloudFormation 模板中创建了一个 Step Function(父),它调用另一个 Step Function(子)。我正在按照使用服务集成模式从 Parent 调用 Child 的说明进行操作。但是我遇到了一个与 IAM 相关的(我认为)错误,我在通过 CLI 部署时无法解决。(错误显示在 CLI 输出中,因此它从未真正进入 AWS。之前有很多部署,因此changeset只是尝试使用此部署修改 Step Function。)

'arn:aws:iam::{Account-Number}:role/{Parent-Step-Function-Role-Name}' is not authorized to create managed-rule. (Service: AWSStepFunctions; Status Code: 400; Error Code: AccessDeniedException; Request ID: {Long-Id-Number})

为了获得我想要的同步行为(父调用子,等待子的执行完成,然后移动到下一个状态)我使用建议(来自上面的服务集成模式链接)创建一个任务(在我的 SAM 模板中)如下所示:

...More States...

"Call Child State": {
  "Type": "Task",
  "Next": "The Next State",
  "Resource": "arn:aws:states:::states:startExecution.sync",
  "Parameters": {  
    "Input": {
      "comment": "Hello World!"
    },
    "StateMachineArn": "${ChildStepFunction}",
    "Name": "ChildExecutionFromParent"
  }
},

...More States...
Run Code Online (Sandbox Code Playgroud)

我已经为 Parent 定义了 IAM 角色,如下所示,确保它只对 Parent 中的 Lambda 函数具有 Lambda 执行权限,并且更适用于该问题,具有StartExecutionChild 的权限。我按照下面链接中的说明进行操作,其中指出 StartExecution 是使用服务集成模式时所需的唯一权限。

https://docs.aws.amazon.com/step-functions/latest/dg/stepfunctions-iam.html

ParentStepFunctionRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: 2012-10-17
      Statement:
        -
          Effect: Allow
          Principal:
            Service:
              - !Sub states.${AWS::Region}.amazonaws.com
          Action: sts:AssumeRole
    Policies:
      -
        PolicyName: ChildStepFunctionExecution
        PolicyDocument:
          Version: 2012-10-17
          Statement:
            -
              Effect: Allow
              Action: states:StartExecution
              Resource: !Ref ChildStepFunction
            -
              Effect: Allow
              Action: lambda:InvokeFunction
              Resource:
                  - !GetAtt Function1.Arn
                  ...
                  - !GetAtt FunctionX.Arn
Run Code Online (Sandbox Code Playgroud)

我已经尝试用一个简单的PassState替换上面的 State,以确保 Step Function 中没有其他错误阻止部署,并且它部署得很好。所以我知道这与那个国家有关。(另外值得注意的是,当与PassState 一起部署进行测试时,我离开了上面定义的角色,所以,我再次知道这不是导致这种情况的策略的语法错误。显然,这与可能具有的错误遗漏的政策。)

And*_*ttz 18

[根据@Matt 的帖子和@Joe.CK 的评论于 2020 年 5 月 22 日更新,将范围缩小到所需的特定资源。]

这个 Stack Overflow 问题为我指明了正确的方向。botocore.exceptions.ClientError: 调用 CreateStateMachine 操作时发生错误 (AccessDeniedException)

该问题似乎源于 CloudWatch,我能够通过将以下语句添加到我的 IAM 策略来解决它。

- Effect: Allow
  Action:
  - events:PutTargets
  - events:PutRule
  - events:DescribeRule
  Resource: 
  - !Sub arn:${AWS::Partition}:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule
Run Code Online (Sandbox Code Playgroud)

AWS Step Functions 示例项目“在工作流中启动工作流”包括类似但仅限于它调用的单个 Lambda 函数的内容。

  • 啊哈。这对我帮助很大!谢谢。它帮助我更仔细地阅读上面的链接(此处:https://docs.aws.amazon.com/step-functions/latest/dg/stepfunctions-iam.html),我最初说只需要 `states:StartExecution` 。但是,向下滚动,您会发现它概述了您在此处显示的内容(以及更多内容),以满足**同步**调用的需要。我猜当它是异步的时,它只是通过“startExecution”“即发即忘”,但要跟踪完成情况,您需要让 CloudWatch 将消息发送回 Step Functions。今晚我会尝试一下,测试后我会将其标记为已解决。 (3认同)
  • 您实际上并不需要所有资源_*_。(允许任何角色访问*资源通常是个坏主意)您正在寻找的是“StepFunctionsGetEventsForStepFunctionsExecutionRule”。它用于 Step Function 内的嵌套工作流(即作为任务启动另一个状态机执行) (3认同)

Mat*_*att 8

添加解决问题的完整角色定义,结合 Andrew 提供的内容和文档中的内容。它分为四个部分:

  1. 允许子 Step Function 通过 states:StartExecution 运行
  2. 允许父级描述和停止任何 Step Functions。(我认为这可能可以根据资源进行更密切的定制;但是,这是从 AWS 文档中复制和粘贴的。)
  3. 允许 Parent 创建/修改(Put)规则到 Cloud Watch(特定系统生成/管理的资源)中,以便它可以保持直到执行完成(因为同步执行)。
  4. 允许父级在 Step Function 中运行所有适用的 Lambda 函数。(这实际上不是我遇到的问题的一部分,但总体上与 Step Function 相关。这也可能包括其他集成——例如 SNS——如果你有的话。)
  ParentStepFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - !Sub states.${AWS::Region}.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        -
          PolicyName: ParentStepFunctionExecutionPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              -
                Effect: Allow
                Action: states:StartExecution
                Resource: !Ref ChildStepFunction
              -
                Effect: Allow
                Action:
                  - states:DescribeExecution
                  - states:StopExecution
                Resource: "*"
              -
                Effect: Allow
                Action:
                  - events:PutTargets
                  - events:PutRule
                  - events:DescribeRule
                Resource: !Sub arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule
              -
                Effect: Allow
                Action: lambda:InvokeFunction
                Resource:
                  - !GetAtt Function1.Arn
                  ...
                  - !GetAtt FunctionX.Arn
Run Code Online (Sandbox Code Playgroud)