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