【问题标题】:AWS StepFunction with Invoke Child Workflow state using cloud formation giving inAWS Step Function 使用 cloudformation 调用子工作流状态
【发布时间】:2020-03-30 03:21:48
【问题描述】:

我正在尝试创建一个可以调用另一个状态机的状态机。我尝试使用以下方法来获取 ARN。但是这会返回错误 Arn is not a valid property, which stack is being created.

  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 的错误代码为 Access Denied。我已授予该角色的管理员访问权限。有没有人遇到这个问题并找到了解决方案?

【问题讨论】:

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


    【解决方案1】:

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

    特别是在您的情况下,除了标准 states:StartEecution 策略之外,您还需要添加与事件相关的策略:

    • 事件:PutTargets
    • 事件:PutRule
    • 事件:DescribeRule

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

    • 状态:描述执行
    • 状态:停止执行

    详情可见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: "*"
    

    【讨论】:

    • 当我回来发布解决方案时,在看到您的答案之前,我想出了同样的事情。接受。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这确实有效,但是对于使用 .sync,我们还需要添加与事件相关的访问,如另一个答案中所述。但 +1 部分答案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2021-05-15
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多