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:
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) }
6 Réponses :
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
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.
Deux raisons peuvent survenir:
Vous n'avez pas utilisé GOOS = linux GOARCH = amd64 avec go build, alors essayez:
GOOS = linux GOARCH = amd64 aller construire -o main main.go
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.
en utilisant le code de chaudière standard sans serveur, cela résout l'erreur
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)
Faites-moi savoir si cela vous aide.
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.
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.