CloudFlow orchestre des workflows sans serveur sous forme de machines à états définies dans des langages de définition de flux (FDL). Pour appeler une fonction Function Compute depuis un workflow, ajoutez un état Task avec l'action FC:InvokeFunction. Le moteur de flux invoque la fonction, gère la réponse selon le mode d'intégration que vous choisissez, puis passe à l'état suivant.
Fonctionnement
Un flux CloudFlow enchaîne les états. Chaque état Task peut appeler un service Alibaba Cloud. Pour l'intégration avec Function Compute, le flux suit cette séquence :
Un état Task déclenche l'action
FC:InvokeFunction.Le moteur de flux appelle la fonction cible avec les paramètres que vous spécifiez (ARN, type d'invocation et charge utile).
Selon le paramètre
TaskMode, le flux attend soit la réponse de l'API, soit un rappel système, soit un rappel personnalisé envoyé par votre code.Le flux encapsule ou transmet la valeur de retour de la fonction, puis avance vers l'état suivant.
Concepts clés
| Concept | Description |
|---|---|
| État Task | Un état qui exécute un travail en appelant un service externe. |
FC:InvokeFunction |
L'identifiant d'action qui indique à CloudFlow d'appeler une fonction Function Compute. |
TaskMode |
Contrôle la manière dont le flux gère la réponse : attente de la réponse API, attente d'un rappel système ou attente d'un rappel personnalisé. |
resourceArn |
Le nom de ressource Alibaba Cloud (ARN) qui identifie de manière unique la fonction cible. |
| Expressions FDL | Expressions intégrées ($Input, $Output, $Context) permettant d'accéder aux données au sein d'un flux. |
Définir un état Task
Ajoutez un état Task à votre définition de flux. Définissez Action sur FC:InvokeFunction et fournissez les paramètres requis sous Parameters :
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: an example of function invocation
States:
- Name: an example of function invocation
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: xxx
invocationType: xxx
body: xxx
End: true
Configurer les paramètres d'invocation
Trois paramètres contrôlent l'appel de la fonction :
| Paramètre | Obligatoire | Type | Description |
|---|---|---|---|
resourceArn |
Oui | String | ARN qui identifie la fonction cible. Exemple : acs:fc:::services/myService1.LATEST/functions/myFunction1 |
invocationType |
Oui | Sync ou Async |
Invocation synchrone ou asynchrone. |
body |
Non | Objet JSON ou chaîne (sérialisée en tableau d'octets avant d'être transmise à la fonction) | Charge utile de l'événement transmise comme paramètre d'entrée de la fonction. |
Conformément à la spécification Spec, les noms des paramètres utilisent la notation camelCase et commencent par une lettre minuscule.
L'exemple suivant définit deux états : une invocation synchrone suivie d'une invocation asynchrone :
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: an example of synchronous function invocation
States:
- Name: an example of synchronous function invocation
Type: Task
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
testKey: the content of the testKey parameter in the event of the function
Next: an example of asynchronous function invocation
- Name: an example of asynchronous function invocation
Type: Task
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
invocationType: Async
body:
key1: value1
key2: value2
End: true
Choisir un mode d'intégration
L'attribut TaskMode contrôle la manière dont le flux gère l'appel API après l'invocation de la fonction. Trois modes sont disponibles :
| Mode | Types d'invocation pris en charge | Cas d'utilisation |
|---|---|---|
RequestComplete |
Sync, Async, Async task | Le flux attend la réponse de l'API, puis poursuit son exécution. |
WaitForSystemCallback |
Async, Async task uniquement | À utiliser lorsque Function Compute envoie un rappel au niveau du système une fois la fonction terminée. |
WaitForCustomCallback |
Async, Async task uniquement | À utiliser lorsque votre propre code détermine le moment où le flux doit poursuivre son exécution. |
RequestComplete
Le flux invoque la fonction et attend la réponse de l'API. Une fois que le système a répondu et renvoyé le résultat, le flux avance vers l'état suivant. Ce mode fonctionne avec les invocations synchrones, asynchrones et les tâches asynchrones.
Pour plus d'informations, consultez RequestComplete.
WaitForSystemCallback
Le flux envoie la requête d'invocation, puis attend que Function Compute envoie une notification de rappel système. Le flux n'avance qu'après réception de ce rappel. Ce mode fonctionne uniquement avec les invocations asynchrones et les tâches asynchrones.
Pour plus d'informations, consultez WaitForSystemCallback.
WaitForCustomCallback
Le flux invoque la fonction, puis se met en pause. Il n'avance que lorsque votre programme appelle l'API de rappel CloudFlow pour signaler le résultat de la tâche. Ce mode fonctionne uniquement avec les invocations asynchrones et les tâches asynchrones.
Pour utiliser ce mode, ajoutez un champ callbackToken au paramètre body et référencez l'expression $Context.Current.TaskToken. Ce jeton est l'identifiant que votre programme doit inclure lors du signalement du résultat de la tâche au flux.
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: invoke-with-callback
States:
- Name: invoke-with-callback
Type: Task
Action: FC:InvokeFunction
TaskMode: WaitForCustomCallback
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Async
body:
callbackToken.$: $Context.Current.TaskToken
key1: value1
End: true
Dans cet exemple, le flux transmet le jeton de tâche à la fonction via callbackToken. La fonction (ou un processus en aval) appelle l'API ReportTaskSucceeded ou ReportTaskFailed avec ce jeton pour notifier CloudFlow du résultat.
Pour plus d'informations, consultez WaitForCustomCallback.
Pour plus de détails sur les types d'invocation de fonction, consultez Invocations synchrones, Invocations asynchrones et Gestion des tâches asynchrones.
Construire des paramètres dynamiques
Dans la plupart des workflows, les entrées des fonctions dépendent du contexte du workflow ou de la sortie d'un état précédent plutôt que de valeurs statiques. Utilisez les expressions réservées $Context et $Input pour référencer des données dynamiques.
Ajoutez .$ à la fin d'un nom de paramètre pour indiquer que sa valeur est une expression FDL plutôt qu'une valeur littérale :
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: an example of function invocation
States:
- Name: an example of function invocation
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
argument1.$: $Input.input.BucketName
argument2.$: $Input.input.TaskId
End: true
Dans cet exemple, argument1 reçoit la valeur de $Input.input.BucketName et argument2 reçoit $Input.input.TaskId au moment de l'exécution.
Gérer les résultats d'invocation
La manière dont le flux encapsule la valeur de retour de la fonction dépend du mode d'intégration.
Selon la définition de l'API InvokeFunction, si la valeur du paramètre de réponse Type de la fonction est Byte, le type de données réel est Byte. La valeur de retour de la fonction peut être une chaîne, un objet JSON, un tableau JSON ou un type de données de base.
Mode RequestComplete
Le flux encapsule la valeur de retour de la fonction dans un objet JSON avec un champ Body :
{
"Body": "function invocation result"
}
Accédez à la valeur de retour avec $Output.Body dans les définitions d'états suivants. Si la valeur de retour est un objet JSON, désérialisez-la à l'aide de la fonction intégrée du workflow, puis accédez à ses membres comme à un objet JSON standard.
L'exemple suivant invoque une fonction, puis utilise un état Choice pour effectuer une branche conditionnelle basée sur une valeur issue de la sortie de la fonction :
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
Description: ' '
StartAt: Example 1 of function invocation
States:
- Name: Example 1 of function invocation
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body:
argument1.$: $Input.Records
argument2.$: $Input.BucketName
Next: conditional statement
- Type: Choice
Name: conditional statement
Branches:
- Condition: $Input.ObjectSize >= $Input.Threshold
Next: Example 2 of function invocation
Default: No action is performed.
- Type: Pass
Name: No action is performed.
End: true
- Name: Example 2 of function invocation
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
invocationType: Sync
body:
argument1.$: $Input.BucketName
argument2.$: $Input.TaskId
End: true
Modes WaitForSystemCallback et WaitForCustomCallback
Dans ces modes, le système externe appelle l'API ReportTaskSucceeded ou ReportTaskFailed pour signaler le résultat. Le flux transmet le résultat tel quel, sans l'encapsuler. Par exemple, si la fonction renvoie {"message": "hello"}, le résultat dans le flux est :
{
"message": "hello"
}
Accédez directement à la valeur de retour avec l'expression $Output.
Erreurs courantes
| Code d'erreur | Cause | Action |
|---|---|---|
FC.ResourceThrottled |
Les fonctions sont limitées car le nombre total d'invocations simultanées (via CloudFlow et toutes les autres sources d'invocation) dépasse la limite de concurrence. CloudFlow invoque Function Compute de manière synchrone lors de l'exécution des états Task. | Demandez une augmentation de la limite de concurrence. |
FC.ResourceExhausted |
Les fonctions sont limitées en raison de ressources insuffisantes. | Contactez-nous. |
FC.InternalServerError |
Une erreur système s'est produite dans Function Compute. | Réexécutez le flux. |
FC.AccessDenied |
Le compte Alibaba Cloud ne dispose pas des autorisations requises. | Accordez les autorisations nécessaires et réessayez. |
FC.InvalidArgument |
La valeur d'un paramètre n'est pas valide. | Vérifiez les valeurs des paramètres par rapport à la spécification. |
FC.EntityTooLarge |
La valeur d'un paramètre d'entrée dépasse la taille autorisée. | Réduisez la taille de la charge utile d'entrée. |
Pour les autres codes d'erreur Function Compute, consultez Codes d'erreur.