Appel de fonctions

Découvrez les différentes façons d'appeler des fonctions déployées vers OCI Functions.

Vous pouvez appeler une fonction déployée vers OCI Functions de différentes manières :

  • Utilisation de l'interface de ligne de commande du projet Fn
  • Utilisation de l'interface de ligne de commande d'Oracle Cloud Infrastructure
  • Utilisation des kits SDK d'Oracle Cloud Infrastructure
  • Demande HTTP signée envoyée à l'adresse d'appel de la fonction. Chaque fonction possède une adresse d'appel.

Chacune des actions ci-dessus appelle la fonction via des demandes envoyées à l'API. Toute demande destinée à l'API doit être authentifiée par une signature et l'OCID du compartiment auquel la fonction appartient dans l'en-tête de la demande. Une telle demande est appelée demande "signée". La signature inclut les informations d'identification Oracle Cloud Infrastructure dans un format crypté.

Si vous utilisez l'interface de ligne de commande du projet Fn ou d'Oracle Cloud Infrastructure pour appeler une fonction, l'authentification est gérée automatiquement. Reportez-vous à Utilisation de l'interface de ligne de commande du projet Fn pour appeler des fonctions et à Utilisation de l'interface de ligne de commande d'Oracle Cloud Infrastructure pour appeler des fonctions.

Si vous utilisez un kit SDK d'Oracle Cloud Infrastructure pour appeler une fonction, vous pouvez vous servir du kit pour gérer l'authentification. Reportez-vous à Utilisation des kits SDK pour appeler des fonctions.

Si vous envoyez une demande HTTP signée à l'adresse d'appel d'une fonction, vous devez gérer votre authentification en incluant une signature et l'OCID du compartiment auquel la fonction appartient dans l'en-tête de la demande. Pour cela, vous disposez de plusieurs méthodes :

Notez que la façon dont vous appelez une fonction détermine la durée maximale pendant laquelle elle peut être exécutée, comme suit :

  • Si vous appelez une fonction à l'aide de l'interface de ligne de commande du projet Fn, le délai d'expiration que vous indiquez dans la définition de la fonction est appliqué (la valeur par défaut est de 30 secondes). Reportez-vous à Modification des paramètres de délai d'expiration et de mémoire par défaut.
  • Si vous appelez une fonction à l'aide de l'interface de ligne de commande Oracle Cloud Infrastructure, la valeur du paramètre global --read-timeout de l'interface de ligne de commande OCI est appliquée (la valeur par défaut est de 60 secondes). Reportez-vous à oci fn function invoke.
  • Si vous appelez une fonction à l'aide des kits SDK Oracle Cloud Infrastructure, le délai d'expiration de lecture indiqué pour le client est appliqué. Par exemple, reportez-vous à la documentation du kit SDK Java et du kit SDK Python.
  • Si vous appelez une fonction à l'aide du kit SDK PL/SQL, la valeur de UTL_HTTP.set_transfer_timeout est appliquée (la valeur par défaut est de 60 secondes).
  • Si vous appelez une fonction à partir de l'API REST DBMS_CLOUD à l'aide de DBMS_CLOUD.SEND_REQUEST, la valeur de UTL_HTTP.set_transfer_timeout est appliquée (60 secondes par défaut).
Conseil

Si vous ne pouvez pas effectuer l'une des étapes de cette rubrique, consultez les solutions aux problèmes courants (reportez-vous à Dépannage des fonctions OCI).

Types d'appel synchrones et détachés

Lorsque vous appelez une fonction, vous pouvez indiquer un type pour l'appel de la fonction. Le type d'appel de fonction détermine la responsabilité de la gestion des résultats, lorsque le contrôle est renvoyé à l'appelant et le code de statut HTTP renvoyé, comme suit :

  • Synchronisation : si vous indiquez Sync comme type d'appel de fonction (valeur par défaut), OCI Functions exécute la demande. Ensuite, une fois l'opération terminée, OCI Functions émet un code de statut HTTP 200 et renvoie le résultat à l'appelant, avec contrôle.
  • Détaché : si vous indiquez Détaché comme type d'appel de fonction, OCI Functions exécute la demande. Ensuite, dès que le traitement commence, OCI Functions émet un code de statut HTTP 202 et renvoie le contrôle à l'appelant. La fonction elle-même est responsable de la gestion des résultats.

Pour indiquer le type d'appel de la fonction :

  • Lorsque vous appelez une fonction à l'aide de la commande fn function invoke de l'interface de ligne de commande OCI, utilisez le paramètre --fn-invoke-type. Par exemple :
    oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body "" --fn-invoke-type "detached"
  • Lorsque vous appelez une fonction à partir d'une autre fonction à l'aide de l'un des kits FDK, indiquez le type d'appel dans l'appel de fonction. Par exemple, en utilisant Python FDK :
    resp = client.invoke_function(function_id=function_ocid, invoke_function_body=function_body, fn_invoke_type='detached')
  • Lorsque vous appelez une fonction à l'aide de la commande raw-request de l'interface de ligne de commande OCI, incluez "fn-invoke-type" dans le paramètre --request- headers. Par exemple :
    oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body ""  --request-headers '{"fn-invoke-type" : "detached"}'

Utilisation de l'interface de ligne de commande du projet Fn pour appeler des fonctions

Pour appeler une fonction déployée vers OCI Functions à l'aide de l'interface de ligne de commande du projet Fn, procédez comme suit :

  1. Connectez-vous à votre environnement de développement en tant que développeur de fonctions.

  2. Dans une fenêtre de terminal, saisissez la commande suivante :

    fn invoke <app-name> <function-name>

    où :

    • <app-name> représente le nom de l'application contenant la fonction à appeler.
    • <function-name> représente le nom de la fonction à appeler.

    Par exemple :

    fn invoke helloworld-app helloworld-func

    Sortie :

    Hello World !
    Conseil

    Pour transmettre des arguments et des valeurs à une fonction, ajoutez le préfixe echo -n '<argument>=<value>' | à la commande fn invoke

    Si la fonction attend l'argument et la valeur au format JSON, utilisez un format JSON valide. Par exemple :

    echo -n '{"name":"John"}' | fn invoke helloworld-app helloworld-func

    Sortie :

    Hello John !

Utilisation de l'interface de ligne de commande d'Oracle Cloud Infrastructure pour appeler des fonctions

Si vous avez installé l'interface de ligne de commande d'Oracle Cloud Infrastructure, vous pouvez l'utiliser afin d'envoyer des demandes d'API pour appeler des fonctions. Entre autres, l'interface de ligne de commande d'Oracle Cloud Infrastructure facilitera l'authentification Oracle Cloud Infrastructure. Pour plus d'informations sur l'utilisation de l'interface de ligne de commande d'Oracle Cloud Infrastructure, reportez-vous à Interface de ligne de commande (CLI).

Ces instructions sont basées sur les principes suivants :

  • Vous avez déjà installé et configuré l'interface de ligne de commande d'Oracle Cloud Infrastructure.
  • Vous voulez appeler une fonction en tant que développeur de fonctions configuré pour votre environnement de développement.

Pour appeler une fonction à l'aide de l'interface de ligne de commande d'Oracle Cloud Infrastructure, procédez comme suit :

  1. Connectez-vous à votre environnement de développement en tant que développeur de fonctions.

  2. Dans une fenêtre de terminal, saisissez la commande suivante :

    oci fn function invoke --function-id <function-ocid> --file "<output-filepath>" --body "<request-parameters>"

    où :

    • <function-ocid> représente l'OCID de la fonction que vous voulez appeler. Pour identifier l'OCID d'une fonction, utilisez la commande fn inspect afin de voir la valeur de la propriété id de la fonction (reportez-vous à Liste de fonctions).
    • <output-filepath> représente le chemin et le nom d'un fichier dans lequel écrire la réponse. Pour écrire la réponse vers stdout, indiquez --file "-".
    • <request-parameters> sont des arguments et des valeurs à transmettre à la fonction de manière facultative. Si la fonction attend des arguments et des valeurs au format JSON, utilisez un format JSON valide. Par exemple : --body '{"name":"John"}'. Vous devez inclure --body "" dans la demande, même s'il n'existe aucun paramètre de demande à transmettre.

    Par exemple :

    • oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body ""

      Sortie :

      Hello World !
    • oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body '{"name":"John"}'

      Sortie :

      Hello John !

Utilisation des kits SDK pour appeler des fonctions

Si vous écrivez un programme pour appeler une fonction dans un langage pour lequel il existe un kit SDK Oracle Cloud Infrastructure, nous vous recommandons d'utiliser ce kit SDK pour envoyer des demandes d'API. Entre autres, le kit SDK facilitera l'authentification Oracle Cloud Infrastructure.

Lorsque vous utilisez un kit SDK pour appeler une fonction, vous n'indiquez pas l'intégralité de l'adresse d'appel que vous indiquez lors de l'utilisation de la commande raw-request de l'interface de ligne de commande d'Oracle Cloud Infrastructure (reportez-vous à Obtention de l'adresse d'appel d'une fonction). A la place, indiquez uniquement la première partie de l'adresse d'appel de la fonction. Par exemple, lorsque vous utilisez un kit SDK, n'indiquez pas l'adresse d'appel de la fonction en tant que https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke. A la place, indiquez l'adresse d'appel de la fonction en tant que https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com.

Pour plus d'informations sur l'utilisation de l'API et la signature des demandes, reportez-vous à la documentation relative à l'API REST et à Informations d'identification de sécurité. Pour plus d'informations sur les kits SDK, reportez-vous à Kits SDK et interface de ligne de commande.

Utilisez l'opération d'API InvokeFunction pour appeler des fonctions.

Obtention de l'adresse d'appel d'une fonction

Lors de l'appel d'une fonction à l'aide de la commande raw-request de l'interface de ligne de commande d'Oracle Cloud Infrastructure, vous devez indiquer l'adresse d'appel de la fonction.

Pour obtenir l'adresse d'appel d'une fonction, procédez comme suit :

  1. Connectez-vous à votre environnement de développement en tant que développeur de fonctions.

  2. Dans une fenêtre de terminal, saisissez la commande suivante :

    fn inspect function <app-name> <function-name>

    où :

    • <app-name> représente le nom de l'application contenant la fonction pour laquelle vous voulez obtenir l'adresse d'appel.
    • <function-name> représente le nom de la fonction pour laquelle vous voulez obtenir l'adresse d'appel.

    Par exemple :

    fn inspect function helloworld-app helloworld-func

    Sortie :

    {
       "annotations": {
    		"fnproject.io/fn/invokeEndpoint": "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke",
    
    ...
    }

    L'adresse d'appel de la fonction est la valeur de "fnproject.io/fn/invokeEndpoint". Par exemple : "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke" (abrégée pour des raisons de de lisibilité).

Envoi d'une demande signée à une adresse d'appel de fonction (à l'aide de la commande raw-request de l'interface de ligne de commande d'Oracle Cloud Infrastructure)

Si vous avez installé l'interface de ligne de commande d'Oracle Cloud Infrastructure, vous pouvez l'utiliser afin d'envoyer des demandes d'API pour appeler des fonctions. Entre autres, l'interface de ligne de commande facilitera l'authentification Oracle Cloud Infrastructure. Pour plus d'informations sur l'utilisation de l'interface de ligne de commande Oracle Cloud Infrastructure, reportez-vous à Interface de ligne de commande (CLI).

Ces instructions sont basées sur les principes suivants :

  • Vous avez déjà installé et configuré l'interface de ligne de commande d'Oracle Cloud Infrastructure.
  • Vous voulez appeler une fonction en tant que développeur de fonctions configuré pour votre environnement de développement.

Pour appeler une fonction déployée vers OCI Functions en envoyant une demande signée à l'adresse d'appel de la fonction à l'aide de la commande raw-request de l'interface de ligne de commande d'Oracle Cloud Infrastructure, procédez comme suit :

  1. Connectez-vous à votre environnement de développement en tant que développeur de fonctions.

  2. Obtenez l'adresse d'appel de la fonction (reportez-vous à Obtention de l'adresse d'appel d'une fonction).

    Par exemple : "fnproject.io/fn/invokeEndpoint": "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke" (abrégée pour des raisons de lisibilité).

  3. Utilisez la commande raw-request de l'interface de ligne de commande d'Oracle Cloud Infrastructure pour appeler la fonction en envoyant une demande POST signée à l'adresse d'appel de la fonction en saisissant la commande suivante :

    oci raw-request --http-method POST --target-uri <invoke-endpoint> --request-body "<request-parameters>"

    où :

    • <invoke-endpoint> représente l'adresse obtenue à l'étape précédente.
    • <request-parameters> sont des arguments et des valeurs à transmettre à la fonction de manière facultative. Si la fonction attend des arguments et des valeurs au format JSON, utilisez un format JSON valide. Vous devez inclure --request-body "" dans la demande, même s'il n'existe aucun paramètre de demande à transmettre.

    Par exemple :

    • oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body ""

      Sortie :

      Hello World !
    • oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body '{"name":"John"}'

      Sortie :

      Hello John !
  4. Si une phrase de passe a été fournie pour crypter la clé de signature de l'API, entrez la phrase de passe à l'invite.