Introduction aux fonctions Serverless en Go avec AWS Lambda
\nL'architecture serverless est devenue la norme pour créer des applications évolutives et économiques. AWS Lambda est l'un des leaders dans ce domaine, et Go (Golang) est le langage idéal pour écrire des fonctions serverless grâce à ses performances, son démarrage rapide et la petite taille de son fichier binaire. Dans cet article, nous allons parcourir le cycle de travail complet : de la création d'une fonction simple au déploiement et au monitoring.
\nPourquoi Go ? Contrairement à Node.js ou Python, Go se compile en un fichier binaire natif, ce qui réduit le démarrage à froid (cold start) à quelques dizaines de millisecondes. C'est crucial pour les systèmes à forte charge.
\n\nPartie principale
\n\n1. Création et structure d'une fonction Lambda en Go
\nToute fonction Lambda en Go commence par l'importation du package github.com/aws/aws-lambda-go/lambda. Voici un exemple minimal :
package main\n\nimport (\n "github.com/aws/aws-lambda-go/lambda"\n)\n\ntype MyEvent struct {\n Name string `json:"name"`\n}\n\ntype MyResponse struct {\n Message string `json:"message"`\n}\n\nfunc HandleRequest(event MyEvent) (MyResponse, error) {\n return MyResponse{Message: "Bonjour, " + event.Name + " !"}, nil\n}\n\nfunc main() {\n lambda.Start(HandleRequest)\n}\n\nPoints essentiels :
\n- \n
- Handler est la fonction appelée par AWS Lambda. Elle peut accepter et retourner tout type de données (structures, chaînes, interfaces). \n
- Contexte — premier argument optionnel :
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error). Permet d'annuler l'exécution en cas de timeout. \n - L'erreur (error) signale à Lambda un échec d'exécution. \n
2. Gestion des événements de différents services AWS
\nLambda est souvent utilisée comme déclencheur pour les événements S3, DynamoDB, SQS et API Gateway. Go prend en charge tous les types d'événements via le package github.com/aws/aws-lambda-go/events.
Exemple pour API Gateway (requête HTTP) :
\npackage main\n\nimport (\n "github.com/aws/aws-lambda-go/lambda"\n "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\n return events.APIGatewayProxyResponse{\n Body: "Hello, World!",\n StatusCode: 200,\n Headers: map[string]string{"Content-Type": "text/plain"},\n }, nil\n}\n\nfunc main() {\n lambda.Start(handler)\n}\n\nExemple pour S3 (nouvel objet dans un bucket) :
\npackage main\n\nimport (\n "context"\n "fmt"\n "github.com/aws/aws-lambda-go/lambda"\n "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n for _, record := range s3Event.Records {\n bucket := record.S3.Bucket.Name\n key := record.S3.Object.Key\n fmt.Printf("Nouveau fichier : %s dans le bucket %s\\n", key, bucket)\n }\n return nil\n}\n\nfunc main() {\n lambda.Start(handler)\n}\n- \n
- Utilisez
events.S3Event,events.SNSEvent,events.DynamoDBEventet autres. \n - Pour les événements personnalisés (ex : depuis CloudWatch), utilisez
json.Unmarshal. \n
3. Compilation, déploiement et meilleures pratiques
\nGo se compile pour Linux (architecture x86_64 ou arm64). Compilez le fichier binaire pour Lambda :
\n# Pour x86_64\nGOOS=linux GOARCH=amd64 go build -o bootstrap main.go\n\n# Pour ARM (Graviton) — moins cher et plus rapide\nGOOS=linux GOARCH=arm64 go build -o bootstrap main.go\n\nEnsuite, compressez en ZIP et téléchargez via AWS CLI ou la console :
\nzip function.zip bootstrap\naws lambda create-function \\\n --function-name my-go-function \\\n --runtime provided.al2023 \\\n --role arn:aws:iam::XXXXXXXXXXX