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

Découvrez comment dépanner les problèmes lors du déploiement d'applications et de fonctions avec le service des fonctions pour OCI.

Vous pourriez rencontrer ces problèmes lors du déploiement d'applications et de fonctions avec le service des fonctions pour OCI.

Le déploiement d'une application retourne un message "non autorisé : nom d'utilisateur ou mot de passe incorrect"

Lors du déploiement d'une application, un message similaire à celui qui suit est affiché :

$ 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 indique une tentative de connexion inutile et infructueuse à Docker Hub. Pour résoudre ce problème, déconnectez-vous de Docker à l'aide de la commande suivante :

docker logout

Après vous être déconnecté de Docker, exécutez de nouveau la commande pour déployer l'application.

Le déploiement d'une fonction retourne un message "Erreur lors de l'exécution de la poussée de docker, êtes-vous connecté à docker?"

Si vous voyez un message similaire à celui qui suit lors du déploiement d'une fonction, vérifiez que votre environnement de développement ne comporte pas la variable d'environnement FN_REGISTRY réglée à votre nom d'utilisateur Docker :

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 Fn Project à source ouverte, vous avez peut-être suivi des instructions dans la documentation sur Fn Project pour régler la variable d'environnement FN_REGISTRY à votre nom d'utilisateur Docker afin de permettre 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 Fn Project.

Pour utiliser l'interface de ligne de commande Fn Project avec le service des fonctions pour OCI, procédez de l'une des façons 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 chaque fois que vous entrez une commande d'interface de ligne de commande Fn Project qui interagit avec Oracle Cloud Infrastructure Registry.

Le déploiement d'une fonction retourne un message ListTriggers et une erreur de type 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 Fn Project, vous pourriez voir un message similaire à celui qui suit :

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

Ce message indique que le fichier func.yaml de la fonction contient une ou plusieurs définitions de déclencheur HTTP. Le service des fonctions pour OCI ne prend pas en charge les déclencheurs HTTP actuellement. Pour déployer la fonction, supprimez la section triggers: du fichier func.yaml.

Pour ne pas créer de nouveaux fichiers func.yaml contenant des définitions de déclencheur, suivez les instructions sous Installation de l'interface de ligne de commande Fn Project pour mettre à jour l'interface de ligne de commande Fn Project vers la version la plus récente.

Le déploiement d'une fonction retourne un message indiquant que l'image n'existe pas ou que vous n'y avez pas accès

Lors du déploiement d'une fonction à l'aide d'une instance de calcul Oracle Cloud Infrastructure en tant qu'environnement de développement du service des fonctions pour OCI, vous pourriez voir un message similaire à celui qui suit :

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'un énoncé de politique (similaire à celui ci-dessous) existe dans le compartiment racine de la location pour permettre à un groupe dynamique qui inclut 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 comme environnement de développement, voir Options différentes pour les environnements de développement de fonction.

Le déploiement d'une fonction dans le service des fonctions pour OCI retourne le message "Fn : Annotation de sous-réseaux manquante"

Lorsque vous déployez une fonction dans le service des fonctions pour OCI, vous pourriez voir le message suivant :

$ fn deploy --app joes-helloworld-app

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

Si vous voyez le message Fn: Missing subnets annotation, vérifiez que vous avez entré un nom d'application correct. Par exemple :

  • L'application pourrait ne pas se trouver dans le compartiment actuellement spécifié par le contexte de l'interface de ligne de commande Fn Project.
  • Il est possible que l'application ait déjà existé mais qu'elle ait été ensuite supprimée.

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

Lorsque vous déployez une fonction dans le service des fonctions pour OCI, vous pourriez voir le message suivant :

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, bien que votre location soit fédérée avec Oracle Identity Cloud Service, le nom d'utilisateur que vous avez fourni lors de votre connexion à Oracle Cloud Infrastructure Registry n'incluait pas de nom de domaine d'identité.

Vous avez probablement fourni un nom d'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é, dans le 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, entrez de nouveau la commande docker login et spécifiez le nom d'utilisateur dans le format correct, y compris le nom du domaine d'identité.

Pour plus d'informations, voir Connexion à Oracle Cloud Infrastructure Registry.

Le déploiement d'une fonction dans le service des fonctions pour OCI retourne le message "L'architecture d'image de la fonction 'x86' est incompatible..."

Lorsque vous déployez une fonction dans le service des fonctions pour OCI, vous pourriez voir un message similaire à celui qui suit :

$ 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 nécessaires (images enfants) pour la forme de l'application. Une cause probable du message est l'utilisation de l'interface de ligne de commande Fn Project version 0.6.24 (ou antérieure) pour déployer une fonction avec une image x86 pour :

  • une application ayant une forme multiarchitecture (par exemple, Generic_X86_ARM)
  • une application ayant une forme d'architecture unique qui n'est pas compatible avec une image x86 (par exemple, Generic_ARM)

À partir de la version 0.6.25 de l'interface de ligne de commande Fn Project, lorsque vous utilisez la commande fn deploy --app <app-name> pour créer une fonction et la déployer dans le service des fonctions pour OCI, l'interface de ligne de commande Fn Project crée l'image Docker de la fonction avec les dépendances nécessaires pour la forme de l'application. Si l'application a une forme à architecture multiple (par exemple, Generic_X86_ARM, la forme d'application par défaut depuis septembre 2023), l'interface de ligne de commande Fn Project crée une image à architecture multiple pour la fonction. L'image de la fonction et la forme de l'application sont toujours compatibles.

Toutefois, l'interface de ligne de commande Fn Project version 0.6.24 (et antérieure) 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 ont :

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

Pour déployer la fonction avec succès, vous devez fournir une image compatible avec la forme de l'application. Effectuez l'une des actions suivantes :

  • Utilisez l'interface de ligne de commande Fn Project version 0.6.25 ou ultérieure (recommandé).
  • Déployez la fonction dans une autre application ayant une forme compatible avec l'image de la fonction (créez une nouvelle application si nécessaire). En supposant que vous utilisez l'interface de ligne de commande Fn Project version 0.6.24 ou antérieure, déployez toujours la fonction dans 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, voir Spécification de l'architecture de calcul sur laquelle exécuter les fonctions.

Le déploiement d'une fonction dans le service des fonctions pour OCI dans Cloud Shell retourne le message "OL8 Cloud Shell ne prend pas en charge les créations de fonctions inter-compilation et multi-archives..."

Lorsque vous déployez une fonction dans le service des fonctions pour OCI dans l'environnement de développement Cloud Shell, vous pouvez voir un message similaire à ce qui suit :

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 multiarchitecture, ou que l'application a une forme multiarchitecture, 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 à plusieurs architectures, ni d'applications avec des formes à plusieurs architectures. En outre, l'architecture de la session Cloud Shell doit être identique à celle de l'application.

Pour plus d'informations :

Le déploiement d'une fonction retourne 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 dans le service des fonctions pour OCI, vous pourriez voir un message similaire à ce qui suit :

$ 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, voir Installation de Docker pour l'utiliser avec OCI Functions.

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

Le format du manifeste d'image est incorrect ou ne contient peut-être pas toutes les informations requises. Le message d'erreur fournit des détails supplémentaires.

Plus précisément, l'image manifeste :

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

Pour inspecter le manifeste d'image, entrez :

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 l'image manifeste :

  • Le format JSON est valide.
  • Inclut un champ digest.
  • Inclut un champ platform qui spécifie une architecture d'image valide. Dans le cas d'une image d'architecture unique, le champ platform doit spécifier amd64 ou arm64. Dans le cas d'une image à plusieurs architectures, le champ platform doit spécifier amd64 et arm64. Pour plus d'informations, voir Spécification de l'architecture de calcul sur laquelle exécuter les fonctions.

Si le fichier manifeste de l'image est mal formaté ou s'il manque des informations requises, mettez à jour le fichier 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, parce que les informations requises sont manquantes dans le manifeste d'image).

Dans cette situation, vous devez reconstruire l'image. La façon de reconstruire l'image dépend du fait que vous reconstruisiez une seule image d'architecture ou une image multi-architecture, et 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 :

  • À l'aide de l'interface de ligne de commande Fn Project (recommandée) :

    Dans le répertoire de la fonction, entrez la commande suivante de l'interface de ligne de commande Fn Project pour créer la fonction et ses dépendances en tant qu'image d'architecture unique, pousser l'image vers le registre Docker spécifié et déployer la fonction dans 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, voir Utilisation de l'interface de ligne de commande Fn Project pour créer une seule image d'architecture.

  • À l'aide de la commande de compilation Docker ou du plugiciel buildx Docker :

    Pour créer une image pour la même architecture que votre plate-forme courante, 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 courante, 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 à spécifier amd64 ou arm64 et à ne pas spécifier les deux. Assurez-vous également de ne spécifier aucune autre architecture.

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

    docker push <image-path>

    Pour plus d'informations, voir Utilisation de la commande de création Docker pour créer une seule image d'architecture.

Reconstruire une image multi-architecture :

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

  • À l'aide de l'interface de ligne de commande Fn Project (recommandée) :

    Dans le répertoire de la fonction, entrez la commande suivante de l'interface de ligne de commande Fn Project pour créer la fonction et ses dépendances en tant qu'image à architecture multiple, pousser l'image vers le registre Docker spécifié et déployer la fonction dans OCI Functions :

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

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

    Pour plus d'informations, voir Utilisation de l'interface de ligne de commande Fn Project pour créer une image multiarchitecture (recommandée).

  • À l'aide du plugiciel buildx de Docker :

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

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

    Veillez à spécifier amd64 et arm64 et à ne spécifier aucune autre architecture.

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

    docker push <image-path>

    Pour plus d'informations, voir Utilisation du plugiciel buildx Docker pour créer une image multiarchitecture.