web-dev-qa-db-ja.com

ステップ関数にネストされたステップ関数:不明なエラー:「...管理ルールの作成は許可されていません」

SAM/CloudFormationテンプレートで作成されたStep Function(Parent)があり、それは、とりわけ、別のStep Function(Child)を呼び出します。 サービス統合パターン を使用して、親から子を呼び出す手順に従っています。しかし、CLI経由でデプロイするときに解決できないIAM関連の(私は思う)エラーが発生します。 (エラーはCLI出力に表示されるため、実際にはAWSに到達しません。以前のデプロイがたくさんあるため、changesetはステップを変更しようとしていますこのデプロイメントで機能します。)

'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...

ParentのIAMロールを次のように定義しました。これには、ParentのLambda関数に対するLambda実行権限のみがあり、問題にさらに当てはまるのは、子のStartExecutionへのアクセス許可があることです。サービス統合パターンを使用するときに必要な権限は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

上記の状態を単純なPass状態に置き換えて、デプロイメントをブロックしているステップ関数に他のエラーがないことを確認しましたが、正常にデプロイされました。だから私はそれがその州と関係があることを知っています。 (また、テストのためにPass状態で展開する場合、私は役割を上記の定義のままにしたので、これは、これを引き起こしているポリシーの構文エラーではないことを知っています。明らかに、それはwrongまたはmissingポリシーを持っていると同じではありません。)

8
Matt

ちょっと待って。これは少し異なり、インラインポリシーであり、StepFunctionsGetEventsForStepFunctionsExecutionRule管理ルールリソースに対するevents:PutRuleアクションを承認します。

  StateMachine:
    Type: AWS::Serverless::StateMachine
    Properties:
      DefinitionUri: statemachine/parentstatemachine.asl.json
      DefinitionSubstitutions:
        ChildWorkflowArn: !Ref ChildStateMachine
      Policies: 
        - Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action:
                - events:PutTargets
                - events:PutRule
                - events:DescribeRule
              Resource: !Sub arn:${AWS::Partition}:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule
        - StepFunctionsExecutionPolicy:
            StateMachineName: !Ref ChildStateMachine

ワイヤーが交差していないことを確認するために、以下はCloudFormationがインラインポリシーステートメントなしで報告するエラーに似ていますが、正確ではありません。

'arn:aws:iam::xxxxxxxx:role/xxxxxxxx' is not authorized to create managed-rule.
(
 Service: AWSStepFunctions; 
 Status Code: 400; 
 Error Code: AccessDeniedException; 
 Request ID: xxxxxxx;
 Proxy: null
)

role/xxxxxxxxは、AWS::Serverless::StateMachineリソースのSAM CloudFormation変換によって生成されます。それは露骨な自動化です。

0
starpebble