19
votes

Obtention de l'erreur "fork / exec / var / task / main: aucun fichier ou répertoire de ce type" lors de l'exécution de la fonction aws-lambda

Obtention de l'erreur fork / exec / var / task / main: aucun fichier ou répertoire de ce type lors de l'exécution de la fonction lambda.

J'utilise la plate-forme Windows pour exécuter et créer du code dans Go.

J'ai effectué les étapes suivantes pour déployer le gestionnaire go aws-lambda:

  1. Code écrit en langage Go avec VSCode sur la plateforme Windows
  2. Construire un projet avec: go build main.go
  3. Convertir main.exe en main.zip
  4. Importation du fichier main.zip avec le nom du gestionnaire fonction principale aws-lambda à l'aide du compte de console aws
  5. Création d'un événement de test pour tester la fonction lambda
  6. Erreur "fork / exec / var / task / main: aucun fichier ou répertoire lors de l'exécution de la fonction lambda"
START RequestId: 9ef206ed-5538-407a-acf0-06673bacf2d7 Version: $LATEST
fork/exec /var/task/main: no such file or directory: PathError
null
END RequestId: 9ef206ed-5538-407a-acf0-06673bacf2d7
REPORT RequestId: 9ef206ed-5538-407a-acf0-06673bacf2d7  Duration: 0.64 ms   Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 31 MB  Init Duration: 1.49 ms

commande de construction

{
  "errorMessage": "fork/exec /var/task/main: no such file or directory",
  "errorType": "PathError"
}

Erreur de détail dans la console AWS

go build main.go

Sortie de journal dans la console AWS

package main

import (
    "fmt"

    "github.com/aws/aws-lambda-go/lambda"
)

// Request represents the requested object
type Request struct {
    ID    int    `json:"ID"`
    Value string `json:"Value"`
}

// Response represents the Response object
type Response struct {
    Message string `json:"Message"`
    Ok      bool   `json:"Ok"`
}

// Handler represents the Handler of lambda
func Handler(request Request) (Response, error) {
    return Response{
        Message: fmt.Sprint("Process Request Id %f", request.ID),
        Ok:      true,
    }, nil
}

func main() {
    lambda.Start(Handler)
}


0 commentaires

6 Réponses :


8
votes

Exécutez les commandes suivantes dans l'invite de commande

set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0

Après cela, créez votre projet et téléchargez le fichier zip sur la console aws lambda

comme ça

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go

Lien de référence: https://github.com/aws/aws-lambda-go


2 commentaires

Bien que ce ne soit pas un problème dans cet exemple, je pense qu'il vaut peut-être la peine de souligner que l'exécutable doit être appelé "main", pas seulement la fonction dans le code. J'ai découvert cela à la dure en suivant les instructions ci-dessus.


Oui, vous avez raison, que l'exécutable doit être appelé "main", pas seulement la fonction dans le code.



4
votes

Deux raisons peuvent survenir:

  1. Vous n'avez pas utilisé GOOS = linux GOARCH = amd64 avec go build, alors essayez:

    GOOS = linux GOARCH = amd64 aller construire -o main main.go

  2. Vous aviez l'habitude de construire ce programme une fonction CI avec une image de base golang-alpine, alors essayez d'utiliser l'image golang complète à la place.


1 commentaires

en utilisant le code de chaudière standard sans serveur, cela résout l'erreur



13
votes

Dans mon cas, le problème était le gestionnaire par défaut de la fonction « bonjour ».

Besoin de le changer en `` principal '' via le panneau d'affichage AWS Lambda -> Paramètres de base -> Modifier.

Fonction AWS Lambda


1 commentaires

ceci peut maintenant être trouvé sous "Paramètres d'exécution"



5
votes

Récemment, j'ai été confronté à un problème similaire et je l'ai résolu. Comme l erreur l indique, il recherche un exécutable avec un nom de handle, vous devez donc nommer votre exécutable de la même manière que handler.

Suivez ces étapes et vous n'obtiendrez pas cette erreur, j'utilise PowerShell

> go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip # If you do not this have utility earlier
> $env:GOOS = "linux"
> $env:GOARCH = "amd64"
> $env:CGO_ENABLED = "0"
> go build -o .\Handler .\main.go # considering your are in the same directory where your main.go or handler code is present
> ~\Go\Bin\build-lambda-zip.exe -o .\Handler.zip .\Handler

Téléchargez ce code et remplacez le nom du gestionnaire par Handler (nom de l'exécutable que vous avez créé ci-dessus) entrez la description de l'image ici

Faites-moi savoir si cela vous aide.


0 commentaires

0
votes

Dans mon cas, c'était lié à mon réglage Go.

Comme j'utilise Go Version Manager, j'ai dû exécuter ce qui suit pour spécifier le bon chemin Go avant de compiler mon projet.

gvm use go1.x.x

Procédez à la compilation puis au déploiement.


0 commentaires

0
votes

Mon cas était étrange, mais je vais le laisser ici au cas où quelqu'un en aurait besoin.

J'ai construit mon exécutable dans un conteneur Docker, puis j'ai utilisé Docker cp pour placer le fichier dans un répertoire local. Ensuite, j'ai compressé l'exécutable et l'ai déployé.

Apparemment, Docker cp crée un fichier de type lien symbolique plutôt qu'un fichier réel, donc cela ne fonctionnerait tout simplement pas.

Ma solution consistait simplement à utiliser sudo cp et à copier l'exécutable dans un autre fichier, ce qui créait un fichier physique et le déployait à la place.


0 commentaires