具有通过使用云形成来调用子工作流状态的AWS StepFunction

时间:2019-12-05 08:29:10

标签: amazon-web-services amazon-cloudformation aws-step-functions

我正在尝试创建一个可以调用另一个状态机的状态机。我尝试使用以下方法获取ARN。但是,这将返回错误Arn不是有效的属性,正在创建该堆栈。

  ParentStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      StateMachineName: !Sub "ParentStateMachine"
      DefinitionString:
        Fn::Sub:
         - |-
            {
              "Comment": "...",
              "StartAt": "State1",
              "States": {
                "State1": {
                  "Type": "Task",
                  "Resource": "arn:aws:states:::states:startExecution.sync",
                  "Parameters": {
                    "StateMachineArn": "${ChildStateMachineArn}",
                    "Input": {
                      "StatePayload": {
                        "datasetDate.$": "$.datasetDate"
                      },
                      "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
                    }
                  },
                  "End": true
                }
              }
            }
         -  {
               ChildStateMachineArn:
                 Fn::GetAtt:
                   - ChildStateMachine
                   - Arn
            }
      RoleArn:
        Fn::GetAtt:
          - StatesExecutionRole
          - Arn

我也尝试使用此字符串生成ARN。

arn:aws:states:${AWS::Region}:${AWS::AccountId}:stateMachine:ChildStateMachine

但是,这给出了错误

Failed to call Step Functions for request: 'com.amazonaws.services.stepfunctions.model.CreateStateMachineRequest'. (Service: null; Status Code: 500; Error Code: null; Request ID: null)

我能够使用云形成来创建其他类型的状态机。只有当我试图创建一个执行子工作流程的工具时,它才起作用。当我转到云路径时,CreateStateMachineEvent的错误代码为“访问被拒绝”。我已授予管理员对该角色的访问权限。有没有人遇到这个问题并找到解决方案?

3 个答案:

答案 0 :(得分:2)

对于使用“等待回调”模式(以.sync或.waitForTaskToken结尾的模式)的国家,您需要特殊的政策,如here所述。

具体针对您的情况,除了标准 states:StartEecution 策略外,您还需要添加与事件相关的策略:

  • events:PutTargets
  • events:PutRule
  • events:DescribeRule

以及专门用于描述和停止执行的策略:

  • 状态:DescribeExecution
  • 状态:StopExecution

可以找到详细信息here

为简单起见,大多数时候我使用以下策略:

  - PolicyName: StatesStartExecutionPolicy
     - PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - "states:*"
            Resource: "*"
    - PolicyName: StatesAccessEventsPolicy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - "events:*"
            Resource: "*"

答案 1 :(得分:1)

我遇到了同样的问题。在将“ states:StartExecution”权限授予ParentStateMachine之后,我能够进行修复。

为父级StatMachine的StatesExecutionRole创建一个内联策略,并使用ChildStateMachineName添加如下所示的内容。它应该可以解决问题。

- PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - 
                Effect: Allow
                Action:
                  - states:StartExecution
                Resource: !GetAtt ChildStateMachine.Arn

答案 2 :(得分:0)

如果有人在使用 AWS SAM,您可以使用这样的内联策略声明:

      Policies:
        - StepFunctionsExecutionPolicy:
            StateMachineName: !GetAtt ChildStepFunction.Name
        - Statement:
          - Sid: StatesStartExecutionPolicy
            Effect: Allow
            Action:
              - "states:*"
            Resource: '*'
          - Sid: StatesAccessEventsPolicy
            Effect: Allow
            Action:
              - "events:*"
            Resource: '*'