web-dev-qa-db-fra.com

Fonction d'étape imbriquée dans une fonction d'étape: Erreur inconnue: "... non autorisé à créer une règle gérée"

J'ai une fonction Step (Parent) créée dans un modèle SAM/CloudFormation qui, entre autres, appelle une autre Step Function (Child). Je suis les instructions pour appeler Child, de Parent, en utilisant le modèle d'intégration de service . Mais j'obtiens une erreur liée à IAM (je pense) que je ne peux pas résoudre lors du déploiement via la CLI. (L'erreur se manifeste dans la sortie de l'interface de ligne de commande, donc elle n'est jamais réellement intégrée à AWS. Il y a eu de nombreux déploiements antérieurs, donc le changeset essaie simplement de modifier l'étape Fonction avec ce déploiement.)

'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})

Pour obtenir le comportement synchrone que je souhaite (le parent appelle Child, attend la fin de l'exécution de Child, puis passe à l'état suivant), j'utilise la suggestion (du lien du modèle d'intégration de service ci-dessus) pour créer une tâche (dans mon modèle SAM) qui ressemble à ce qui suit:

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

J'ai défini le rôle IAM pour Parent comme suit, en m'assurant qu'il ne dispose que des privilèges d'exécution Lambda pour les fonctions Lambda dans Parent et, plus applicable au problème, qu'il a l'autorisation de StartExecution de Child. J'ai suivi les instructions du lien ci-dessous, indiquant que StartExecution était la seule autorisation nécessaire lors de l'utilisation du modèle d'intégration de services.

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

J'ai essayé de remplacer l'état ci-dessus par un simple état Pass pour m'assurer qu'il n'y avait pas d'autres erreurs dans la fonction Step bloquant le déploiement, et il s'est bien déployé. Je sais donc que cela a à voir avec cet État. (Notez également que lors du déploiement avec l'état Pass pour les tests, j'ai laissé le rôle défini ci-dessus, donc, encore une fois, je sais que ce n'est pas une erreur de syntaxe avec les politiques qui en serait la cause. De toute évidence, c'est pas la même chose que d'avoir peut-être les politiques erronées ou manquantes .)

8
Matt

Juste une seconde. Ceci est légèrement différent, une politique en ligne, autorisant le events:PutRule action sur la ressource de règle gérée StepFunctionsGetEventsForStepFunctionsExecutionRule.

  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

Juste pour s'assurer que les fils ne sont pas croisés, ce qui suit est un peu comme l'erreur que CloudFormation signale sans la déclaration de politique en ligne, mais pas exactement.

'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 est généré par la transformation SAM CloudFormation pour le AWS::Serverless::StateMachine Ressource. C'est une automatisation flagrante.

0
starpebble