Problèmes lors du déploiement d'applications et de fonctions

Découvrez comment résoudre les problèmes lors du déploiement d'applications et de fonctions avec OCI Functions.

Vous pouvez rencontrer ces problèmes lors du déploiement d'applications et de fonctions avec OCI Functions.

Le déploiement d'une application renvoie un message "unauthorized: incorrect username or password"

Lors du déploiement d'une application, un message semblable au suivant peut s'afficher :

$ fn -v deploy --app acme-app

Deploying go-app to app: acme-app
Bumped to version 0.0.2
Building image phx.ocir.io/ansh81vru1zp/acme-repo/go-app:0.0.2
FN_REGISTRY: phx.ocir.io/ansh81vru1zp/acme-repo
Current Context: acme-functions-compartment
Sending build context to Docker daemon 5.12kB
Step 1/10 : FROM fnproject/go:dev as build-stage
Get https://registry-1.docker.io/v2/fnproject/go/manifests/dev: unauthorized: incorrect username or password

Le message signale une tentative inutile et infructueuse de connexion à Docker Hub. Pour résoudre ce problème, déconnectez-vous de Docker à l'aide de la commande suivante :

docker logout

Une fois déconnecté de Docker, réexécutez la commande pour déployer l'application.

Le déploiement d'une fonction renvoie un message "error running docker push, are you log into docker ?"

Si un message semblable au suivant s'affiche lors du déploiement d'une fonction, vérifiez que la variable d'environnement FN_REGISTRY n'est pas définie sur votre nom utilisateur Docker dans l'environnement de développement :

The push refers to repository [docker.io. ...
.
.
.
denied: requested access to the resource is denied
Fn: error running docker push, are you logged into docker?: exit status 1
See fn <command> --help’ for more information.
			

Si vous avez utilisé la plate-forme du projet Fn open source, vous aurez peut-être suivi les instructions de la documentation du projet Fn pour définir la variable d'environnement FN_REGISTRY sur votre nom utilisateur Docker afin d'activer l'interaction avec le registre Docker officiel (docker.io).

La variable d'environnement FN_REGISTRY remplace la valeur de l'option de registre dans votre contexte d'interface de ligne de commande du projet Fn.

Pour utiliser l'interface de ligne de commande du projet Fn avec OCI Functions, effectuez l'une des opérations suivantes :

  • Annulez la définition de la variable d'environnement FN_REGISTRY.
  • Remplacez la variable d'environnement FN_REGISTRY à l'aide de l'option globale --registry dès que vous entrez une commande d'interface de ligne de commande du projet Fn qui interagit avec Oracle Cloud Infrastructure Registry.

Le déploiement d'une fonction renvoie un message ListTriggers et une erreur 500

Lors du déploiement d'une fonction que vous avez précédemment créée à l'aide d'une version antérieure de l'interface de ligne de commande du projet Fn, un message semblable au suivant peut s'afficher :

Fn: [GET /triggers][500] ListTriggers default  &{Fields: Message:Internal server error}

Ce message indique que le fichier func.yaml de la fonction contient au moins une définition de déclencheur HTTP. OCI Functions ne prend actuellement pas en charge les déclencheurs HTTP. Pour déployer la fonction, enlevez la section triggers: du fichier func.yaml.

Pour éviter de créer des fichiers func.yaml contenant des définitions de déclencheur, suivez les instructions dans Installation de l'interface de ligne de commande du projet Fn afin de mettre à niveau l'interface de ligne de commande du projet Fn vers la version la plus récente.

Le déploiement d'une fonction renvoie le message "L'image n'existe pas ou vous n'y avez pas accès"

Lors du déploiement d'une fonction avec une instance de calcul Oracle Cloud Infrastructure en tant qu'environnement de développement OCI Functions, un message semblable au suivant peut s'afficher :

Fn: Image phx.ocir.io/ansh81vru1zp/acme-repo/helloworld-func:0.0.2 does not exist or you do not have access to use it.

Ce message indique que l'instance de calcul n'a pas accès à Oracle Cloud Infrastructure Registry.

Vérifiez qu'une instruction de stratégie (semblable à celle ci-dessous) existe dans le compartiment racine de la location pour permettre à un groupe dynamique incluant l'OCID de l'instance de calcul d'accéder à Oracle Cloud Infrastructure Registry :

 Allow dynamic-group <dynamic-group-name> to read repos in tenancy

Pour plus d'informations sur l'utilisation d'une instance de calcul Oracle Cloud Infrastructure en tant qu'environnement de développement, reportez-vous à Dautres options pour les environnements de développement de fonctions.

Le déploiement d'une fonction vers OCI Functions renvoie le message "Fn : Missing subnets annotation"

Lorsque vous déployez une fonction vers OCI Functions, le message suivant peut apparaître :

$ fn deploy --app joes-helloworld-app

Deploying helloworld-func to app: joes-helloworld-app
.
.
.
Fn: Missing subnets annotation

Si le message Fn: Missing subnets annotation s'affiche, vérifiez que vous avez saisi le nom d'application correct. Par exemple :

  • L'application ne se trouve peut-être pas dans le compartiment actuellement indiqué par le contexte de l'interface de ligne de commande du projet Fn.
  • L'application a peut-être existé, mais elle a ensuite été supprimée.

Le déploiement d'une fonction renvoie un message "Obtention des signatures de source d'image Erreur : tentative de réutilisation de blob ... à destination : vérification de l'existence d'un blob ... dans .... :StatusCode : 403, Fn : erreur lors de l'exécution de docker push : état de sortie 125"

Lorsque vous déployez une fonction vers OCI Functions, le message suivant peut s'afficher :

Getting image source signatures Error: trying to reuse blob ... at destination: checking whether a blob ... exists in .... :StatusCode: 403, Fn: error running docker push: exit status 125

Ce message indique que, même si votre location est fédérée avec Oracle Identity Cloud Service, le nom utilisateur que vous avez fourni lors de votre connexion à Oracle Cloud Infrastructure Registry n'a pas inclus de nom de domaine d'identité.

Vous avez probablement fourni un nom utilisateur au format <tenancy-namespace>/<user-name>, dans une commande telle que :

docker login -u '<tenancy-namespace>/<user-name>' <region-key>.ocir.io

Par exemple :

docker login -u 'ansh81vru1zp/jdoe@acme.com' phx.ocir.io

Toutefois, comme votre location est fédérée avec Oracle Identity Cloud Service, vous devez utiliser un format de commande légèrement différent qui inclut le nom du domaine d'identité, au format <tenancy-namespace>/<domain-name>/<user-name>.

Par exemple :

docker login -u 'ansh81vru1zp/oracleidentitycloudservice/jdoe@acme.com' phx.ocir.io

Pour déployer la fonction avec succès, entrez de nouveau la commande docker login et indiquez le nom utilisateur dans le format correct, y compris le nom de domaine d'identité.

Pour plus d'informations, reportez-vous à Connexion à Oracle Cloud Infrastructure Registry.

Le déploiement d'une fonction vers OCI Functions renvoie le message "L'architecture d'image de la fonction 'x86' est incompatible..."

Lorsque vous déployez une fonction vers OCI Functions, un message semblable au suivant peut s'afficher :

$ fn deploy --app joes-helloworld-app

Deploying helloworld-func to app: joes-helloworld-app
.
.
.
Fn: Service error:InvalidParameter. Invalid Invalid image - Function's image architecture 'x86' is incompatible with the application's shape type 'GENERIC_X86_ARM'. http status code: 400. Opc request id:...

Ce message indique que l'image de la fonction n'inclut pas les dépendances (images enfant) nécessaires pour la forme de l'application. Une cause probable du message est l'utilisation de la version 0.6.24 (ou antérieure) de l'interface de ligne de commande du projet Fn pour déployer une fonction avec une image x86 afin de :

  • une application ayant une forme multiarchitecture (telle que Generic_X86_ARM)
  • une application disposant d'une seule forme d'architecture non compatible avec une image x86 (telle que Generic_ARM)

A partir de la version 0.6.25 de l'interface de ligne de commande du projet Fn, lorsque vous utilisez la commande fn deploy --app <app-name> pour créer une fonction et la déployer vers OCI Functions, l'interface de ligne de commande du projet Fn crée l'image Docker de la fonction avec les dépendances nécessaires pour la forme de l'application. Si l'application possède une forme à plusieurs architectures (telle que Generic_X86_ARM, forme d'application par défaut depuis septembre 2023), l'interface de ligne de commande du projet Fn crée une image à plusieurs architectures pour la fonction. L'image de la fonction et la forme de l'application sont toujours compatibles.

Cependant, la version 0.6.24 (et antérieure) de la CLI du projet Fn crée toujours des images Docker avec les dépendances nécessaires pour une architecture unique, l'architecture x86. En tant qu'image d'architecture unique, une telle image x86 n'est compatible qu'avec les applications ayant la forme d'architecture unique Generic_X86. L'image x86 est incompatible avec les applications qui disposent des éléments suivants :

  • une forme multiarchitecture (telle que Generic_X86_ARM, la forme d'application par défaut depuis septembre 2023)
  • une forme d'architecture unique qui n'est pas Generic_X86 (telle que Generic_ARM)

Pour déployer la fonction correctement, vous devez fournir une image compatible avec la forme de l'application. Effectuez l'une des opérations suivantes :

  • Utilisez la version 0.6.25 ou ultérieure de la CLI du projet Fn (recommandé).
  • Déployez la fonction sur une autre application dont la forme est compatible avec l'image de la fonction (créez une nouvelle application si nécessaire). En supposant que vous utilisez la version 0.6.24 ou une version antérieure de l'interface de ligne de commande du projet Fn, déployez toujours la fonction vers une application ayant une forme Generic_X86.
  • Utilisez Docker pour créer une image compatible avec la forme d'architecture de l'application.

Pour plus d'informations, reportez-vous à Spécification de l'architecture de calcul sur laquelle exécuter des fonctions.

Le déploiement d'une fonction vers OCI Functions dans Cloud Shell renvoie le message "OL8 Cloud Shell ne prend pas en charge la compilation croisée et les builds de fonctions multi-arch...".

Lorsque vous déployez une fonction vers OCI Functions dans l'environnement de développement Cloud Shell, un message semblable au suivant peut s'afficher :

OL8 CloudShell does not support cross-compilation and multi-arch functions builds. Please ensure the architecture of your App matches the CloudShell architecture.

Ce message indique que la fonction est basée sur une image multi-architecture, que l'application a une forme multi-architecture ou que la session Cloud Shell et l'application ont une architecture différente.

Dans l'environnement de développement Cloud Shell, OCI Functions ne prend pas en charge la création et le déploiement de fonctions basées sur des images multi-architectures, ni d'applications avec des formes multi-architectures. En outre, l'architecture de la session Cloud Shell doit être identique à celle de l'application.

Informations supplémentaires :

Le déploiement d'une fonction renvoie un manifeste d'image non valide ou non pris en charge. Impossible d'obtenir l'architecture à partir du message Manifeste/En-têtes OCIR...

Lorsque vous déployez une fonction vers OCI Functions, un message semblable au suivant peut s'afficher :

$ fn -v deploy --app acme-app

Fn: Service error:InvalidParameter. Invalid or unsupported image manifest. Unable to get architecture from the OCIR Manifest/Headers. http status code: 400.

Il existe un certain nombre de causes et de solutions possibles, comme décrit dans cette section.

Cause possible : version de Docker incorrecte

La version de Docker que vous utilisez n'est peut-être pas prise en charge.

Si vous utilisez Docker pour créer des images de fonction, vous devez utiliser une version prise en charge de Docker (au moment de l'écriture, version 17.10 ou ultérieure).

Pour confirmer la version de Docker que vous utilisez, entrez :

docker version

Si la version de Docker n'est pas prise en charge, installez une version plus récente. Pour plus d'informations, reportez-vous à Installation de Docker pour une utilisation avec OCI Functions.

Cause possible : le format du manifeste est incorrect ou les informations requises sont manquantes

Le manifeste d'image peut être mal formaté ou ne pas contenir toutes les informations requises. Le message d'erreur fournit des détails supplémentaires.

Plus précisément, le manifeste d'image :

  • Doit être au format JSON valide.
  • Doit inclure un condensé d'image.
  • Vous devez indiquer une architecture d'image valide (amd64, arm64, ou les deux).

Pour inspecter le manifeste de l'image, saisissez :

docker manifest inspect --verbose <image-path>

Par exemple :

docker manifest inspect --verbose phx.ocir.io/ansh81vru1zp/acme-repo/acme-func:0.0.3

Vérifiez que le manifeste de l'image :

  • Est dans un format JSON valide.
  • Inclut un champ digest.
  • Inclut un champ platform qui indique une architecture d'image valide. Dans le cas d'une image d'architecture unique, le champ platform doit indiquer amd64 ou arm64. Dans le cas d'une image multi-architecture, le champ platform doit indiquer à la fois amd64 et arm64. Pour plus d'informations, reportez-vous à Spécification de l'architecture de calcul sur laquelle exécuter des fonctions.

Si le manifeste de l'image est mal formaté ou s'il manque les informations requises, mettez à jour le manifeste et recréez l'image.

Cause possible : l'image n'est pas valide

L'image créée à partir du manifeste d'image peut ne pas être valide (par exemple, car le manifeste d'image ne contient pas les informations requises).

Dans ce cas, vous devez reconstruire l'image. La façon de reconstruire l'image dépend de la reconstruction d'une image d'architecture unique ou d'une image multi-architecture, ainsi que de l'outil que vous souhaitez utiliser.

Reconstruire une seule image d'architecture :

Vous pouvez reconstruire des images d'architecture unique de différentes manières, notamment :

  • Utilisation de l'interface de ligne de commande du projet Fn (recommandé) :

    Dans le répertoire de la fonction, entrez la commande d'interface de ligne de commande du projet Fn suivante pour construire la fonction et ses dépendances en tant qu'image d'architecture unique, propager l'image vers le registre Docker indiqué et déployer la fonction vers OCI Functions :

    fn deploy --app <your-function-app>

    <app-name> est le nom de l'application avec la forme d'architecture unique, dans laquelle vous voulez créer la fonction.

    Pour plus d'informations, reportez-vous à Utilisation de l'interface de ligne de commande du projet Fn pour créer une image d'architecture unique.

  • A l'aide de la commande de build Docker ou du module d'extension buildx Docker :

    Pour créer une image pour la même architecture que votre plate-forme en cours, utilisez la commande docker build. Par exemple, pour créer une image à déployer sur une application avec amd64 comme forme d'architecture unique, entrez :

    docker build --platform linux/amd64 -t <image-path> .

    Pour créer une image pour une architecture différente de celle de votre plate-forme actuelle, utilisez la commande docker buildx build. Par exemple, pour créer une image à déployer sur une application avec amd64 comme forme d'architecture unique, entrez :

    docker buildx build --platform linux/amd64 -t <image-path> .

    Veillez à indiquer amd64 ou arm64, et non les deux. Veillez également à ne spécifier aucune autre architecture.

    Après avoir créé l'image, entrez la commande suivante pour la propager vers le registre Docker :

    docker push <image-path>

    Pour plus d'informations, reportez-vous à Utilisation de la commande de build Docker pour créer une image d'architecture unique.

Reconstruction d'une image multi-architecture :

Vous pouvez reconstruire des images multi-architectures de différentes manières, notamment :

  • Utilisation de l'interface de ligne de commande du projet Fn (recommandé) :

    Dans le répertoire de la fonction, entrez la commande d'interface de ligne de commande du projet Fn suivante pour construire la fonction et ses dépendances en tant qu'image multi-architecture, propager l'image vers le registre Docker indiqué et déployer la fonction vers OCI Functions :

    fn deploy --app <your-function-app>

    <app-name> est le nom de l'application avec la forme à plusieurs architectures, dans laquelle vous voulez créer la fonction.

    Pour plus d'informations, reportez-vous à Utilisation de l'interface de ligne de commande du projet Fn pour créer une image multi-architecture (recommandé).

  • Utilisation du module d'extension buildx Docker :

    Pour créer une image multi-architecture sur laquelle baser une fonction à déployer vers une application avec une forme multi-architecture, entrez la commande docker buildx build suivante :

    docker buildx build --platform linux/amd64,linux/arm64 -t <your-registry>/<your-image>:<tag> --push .

    Veillez à indiquer à la fois amd64 et arm64, et à ne spécifier aucune autre architecture.

    Après avoir créé l'image, entrez la commande suivante pour la propager vers le registre Docker :

    docker push <image-path>

    Pour plus d'informations, reportez-vous à Utilisation du module d'extension buildx Docker pour créer une image multiarchitecture.