Déployer des fonctions Lambda Go avec des images conteneurs - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Déployer des fonctions Lambda Go avec des images conteneurs

Il existe deux manières de créer une image de conteneur pour une fonction Go Lambda :

Astuce

Pour réduire le temps nécessaire à l’activation des fonctions du conteneur Lambda, consultez Utiliser des générations en plusieurs étapes (français non garanti) dans la documentation Docker. Pour créer des images de conteneur efficaces, suivez la section Bonnes pratiques pour l’écriture de Dockerfiles (français non garanti).

Cette page explique comment créer, tester et déployer des images de conteneur pour Lambda.

AWS images de base pour le déploiement des fonctions Go

Go est implémenté différemment des autres exécutions gérées. Comme Go compile nativement en un binaire exécutable, il ne nécessite pas d'environnement d'exécution de langage dédié. Utilisez une image de base réservée au système d'exploitation pour déployer les fonctions Go sur Lambda.

Système d'exploitation uniquement
Nom Identifiant Système d’exploitation Date d'obsolescence Créer la fonction de blocage Mettre à jour la fonction de blocage

Exécution réservée au système d'exploitation

provided.al2023

Amazon Linux 2023

Exécution réservée au système d'exploitation

provided.al2

Amazon Linux 2

Galerie publique Amazon Elastic Container Registry : gallery.ecr.aws/lambda/fourni

Client d’interface d’environnement d’exécution Go

Le package aws-lambda-go/lambda inclut une implémentation de l’interface d’exécution. Pour obtenir des exemples d’utilisation de aws-lambda-go/lambda dans votre image, consultez Utilisation d'une image de base AWS uniquement pour le système d'exploitation ou Utilisation d'une image non AWS basique.

Utilisation d'une image de base AWS uniquement pour le système d'exploitation

Go est implémenté différemment des autres exécutions gérées. Comme Go compile nativement en un binaire exécutable, il ne nécessite pas d'environnement d'exécution de langage dédié. Utilisez une image de base réservée au système d'exploitation pour créer des images de conteneur pour les fonctions Go.

Balises Environnement d’exécution Système d’exploitation Dockerfile Obsolescence

al2023

Exécution uniquement basée sur le système d'exploitation Amazon Linux 2023 Dockerfile pour OS uniquement Runtime sur GitHub

al2

Exécution uniquement basée sur le système d'exploitation Amazon Linux 2 Dockerfile pour OS uniquement Runtime sur GitHub

Pour plus d'informations sur ces images de base, consultez la galerie ECR publique d'Amazon.

Vous devez inclure le package aws-lambda-go/lambda dans votre gestionnaire Go. Ce package implémente le modèle de programmation pour Go, y compris l’interface d’exécution.

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :

Pour créer et déployer une fonction Go avec l’image de base provided.al2023
  1. Créez un répertoire pour le projet, puis passez à ce répertoire.

    mkdir hello cd hello
  2. Initialisez un nouveau module Go.

    go mod init example.com/hello-world
  3. Ajoutez la bibliothèque lambda comme dépendance de votre nouveau module.

    go get github.com/aws/aws-lambda-go/lambda
  4. Créez un fichier nommé main.go et ouvrez-le dans un éditeur de texte. Il s’agit du code de la fonction Lambda. Vous pouvez utiliser l’exemple de code suivant pour le tester, ou le remplacer par le vôtre.

    package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) }
  5. Utilisez un éditeur de texte afin de créer un Dockerfile dans votre répertoire de projets.

    • L’exemple de fichier Docker suivant utilise une génération en plusieurs étapes. Cela vous permet d’utiliser une image de base différente à chaque étape. Vous pouvez utiliser une image, telle qu’une image de base Go, pour compiler votre code et générer le binaire exécutable. Vous pouvez ensuite utiliser une image différente, telle que provided.al2023, dans l’instruction finale FROM pour définir l’image que vous déployez sur Lambda. Le processus de génération est séparé de l’image de déploiement final, de sorte que l’image finale ne contient que les fichiers nécessaires à l’exécution de l’application.

    • Vous pouvez utiliser la lambda.norpc balise optionnelle pour exclure le composant Remote Procedure Call (RPC) de la bibliothèque Lambda. Le RPC composant n'est requis que si vous utilisez le runtime Go 1.x obsolète. L'exclusion de RPC réduit la taille du package de déploiement.

    • Notez que l'exemple de Dockerfile n'inclut aucune instruction. USER Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut doté des autorisations les moins privilégiées. Ceci est différent du comportement standard de Docker qui est défini par défaut par l'rootutilisateur lorsqu'aucune USER instruction n'est fournie.

    Exemple – Dockerfile de génération en plusieurs étapes
    Note

    Assurez-vous que la version de Go que vous spécifiez dans votre Dockerfile (par exemple, golang:1.20) est la même que celle que vous avez utilisée pour créer votre application.

    FROM golang:1.20 as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build with optional lambda.norpc tag COPY main.go . RUN go build -tags lambda.norpc -o main main.go # Copy artifacts to a clean image FROM public.ecr.aws/lambda/provided:al2023 COPY --from=build /helloworld/main ./main ENTRYPOINT [ "./main" ]
  6. Générez l’image Docker à l’aide de la commande docker build. L’exemple suivant nomme l’image docker-image et lui donne la balise test.

    docker build --platform linux/amd64 -t docker-image:test .
    Note

    La commande spécifie l’option --platform linux/amd64 pour garantir la compatibilité de votre conteneur avec l’environnement d’exécution Lambda, quelle que soit l’architecture de votre machine de génération. Si vous avez l'intention de créer une fonction Lambda à l'aide de l'architecture du jeu ARM64 d'instructions, veillez à modifier la commande pour utiliser l'--platform linux/arm64option à la place.

Utilisez l’émulateur d’interface d’exécution pour tester votre image localement. L’émulateur d’interface d’exécution est inclus dans l’image de base provided.al2023.

Pour exécuter l’émulateur d’interface d’exécution sur votre ordinateur local
  1. Démarrez votre image Docker à l’aide de la commande docker run. Notez ce qui suit :

    • docker-image est le nom de l’image et test est la balise.

    • ./main est le ENTRYPOINT de votre Dockerfile.

    docker run -d -p 9000:8080 \ --entrypoint /usr/local/bin/aws-lambda-rie \ docker-image:test ./main

    Cette commande exécute l’image en tant que conteneur et crée un point de terminaison local à localhost:9000/2015-03-31/functions/function/invocations.

  2. À partir d’une nouvelle fenêtre de terminal, publiez un événement sur le point de terminaison suivant au moyen d’une commande curl :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Certaines fonctions peuvent nécessiter une JSON charge utile. Exemple :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
  3. Obtenez l’ID du conteneur.

    docker ps
  4. Utilisez la commande docker kill pour arrêter le conteneur. Dans cette commande, remplacez 3766c4ab331c par l’ID du conteneur de l’étape précédente.

    docker kill 3766c4ab331c
Pour télécharger l'image sur Amazon ECR et créer la fonction Lambda
  1. Exécutez la get-login-passwordcommande pour authentifier le Docker auprès CLI de votre registre AmazonECR.

    • Définissez la --region valeur à l' Région AWS endroit où vous souhaitez créer le ECR référentiel Amazon.

    • 111122223333Remplacez-le par votre Compte AWS identifiant.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Créez un référentiel dans Amazon à ECR l'aide de la commande create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    Note

    Le ECR référentiel Amazon doit être Région AWS identique à la fonction Lambda.

    En cas de succès, vous obtenez une réponse comme celle-ci :

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Copiez le repositoryUri à partir de la sortie de l’étape précédente.

  4. Exécutez la commande docker tag pour étiqueter votre image locale dans votre ECR référentiel Amazon en tant que dernière version. Dans cette commande :

    • docker-image:testest le nom et le tag de votre image Docker. Il s'agit du nom et de la balise de l'image que vous avez spécifiés dans la docker build commande.

    • Remplacez <ECRrepositoryUri> par l’repositoryUri que vous avez copié. Assurez-vous d'inclure :latest à la fin duURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Exemple :

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Exécutez la commande docker push pour déployer votre image locale dans le référentiel AmazonECR. Assurez-vous de l'inclure :latest à la fin du référentielURI.

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Créez un rôle d’exécution pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin du nom de ressource Amazon (ARN) du rôle à l'étape suivante.

  7. Créez la fonction Lambda. PourImageUri, spécifiez le référentiel URI antérieur. Assurez-vous d'inclure :latest à la fin duURI.

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    Note

    Vous pouvez créer une fonction en utilisant une image d'un autre AWS compte, à condition que l'image se trouve dans la même région que la fonction Lambda. Pour de plus amples informations, veuillez consulter Autorisations ECR multi-comptes Amazon.

  8. Invoquer la fonction.

    aws lambda invoke --function-name hello-world response.json

    Vous devriez obtenir une réponse comme celle-ci :

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Pour voir la sortie de la fonction, consultez le fichier response.json.

Pour mettre à jour le code de fonction, vous devez créer à nouveau l'image, télécharger la nouvelle image dans le ECR référentiel Amazon, puis utiliser la update-function-codecommande pour déployer l'image sur la fonction Lambda.

Lambda résout la balise d'image en un condensé d'image spécifique. Cela signifie que si vous pointez la balise d'image qui a été utilisée pour déployer la fonction vers une nouvelle image dans AmazonECR, Lambda ne met pas automatiquement à jour la fonction pour utiliser la nouvelle image.

Pour déployer la nouvelle image sur la même fonction Lambda, vous devez utiliser la update-function-codecommande, même si la balise d'image ECR reste la même dans Amazon. Dans l'exemple suivant, l'--publishoption crée une nouvelle version de la fonction à l'aide de l'image du conteneur mise à jour.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish

Utilisation d'une image non AWS basique

Vous pouvez créer une image de conteneur pour Go à partir d'une image non AWS basique. L’exemple de Dockerfile dans les étapes suivantes utilise une image de base Alpine.

Vous devez inclure le package aws-lambda-go/lambda dans votre gestionnaire Go. Ce package implémente le modèle de programmation pour Go, y compris l’interface d’exécution.

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :

Pour créer et déployer une fonction Go avec une image de base Alpine
  1. Créez un répertoire pour le projet, puis passez à ce répertoire.

    mkdir hello cd hello
  2. Initialisez un nouveau module Go.

    go mod init example.com/hello-world
  3. Ajoutez la bibliothèque lambda comme dépendance de votre nouveau module.

    go get github.com/aws/aws-lambda-go/lambda
  4. Créez un fichier nommé main.go et ouvrez-le dans un éditeur de texte. Il s’agit du code de la fonction Lambda. Vous pouvez utiliser l’exemple de code suivant pour le tester, ou le remplacer par le vôtre.

    package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) }
  5. Utilisez un éditeur de texte afin de créer un Dockerfile dans votre répertoire de projets. L’exemple de Dockerfile suivant utilise une image de base Alpine. Notez que l'exemple de Dockerfile n'inclut aucune instruction. USER Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut doté des autorisations les moins privilégiées. Ceci est différent du comportement standard de Docker qui est défini par défaut par l'rootutilisateur lorsqu'aucune USER instruction n'est fournie.

    Exemple Dockerfile
    Note

    Assurez-vous que la version de Go que vous spécifiez dans votre Dockerfile (par exemple, golang:1.20) est la même que celle que vous avez utilisée pour créer votre application.

    FROM golang:1.20.2-alpine3.16 as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build COPY main.go . RUN go build -o main main.go # Copy artifacts to a clean image FROM alpine:3.16 COPY --from=build /helloworld/main /main ENTRYPOINT [ "/main" ]
  6. Générez l’image Docker à l’aide de la commande docker build. L’exemple suivant nomme l’image docker-image et lui donne la balise test.

    docker build --platform linux/amd64 -t docker-image:test .
    Note

    La commande spécifie l’option --platform linux/amd64 pour garantir la compatibilité de votre conteneur avec l’environnement d’exécution Lambda, quelle que soit l’architecture de votre machine de génération. Si vous avez l'intention de créer une fonction Lambda à l'aide de l'architecture du jeu ARM64 d'instructions, veillez à modifier la commande pour utiliser l'--platform linux/arm64option à la place.

Utilisez l’émulateur d’interface d’exécution pour tester l’image localement. Vous pouvez intégrer l'émulateur à votre image ou utiliser la procédure suivante pour l'installer sur votre machine locale.

Pour installer et exécuter l’émulateur d’interface d’exécution sur votre ordinateur local
  1. Depuis le répertoire de votre projet, exécutez la commande suivante pour télécharger l'émulateur d'interface d'exécution (architecture x86-64) GitHub et l'installer sur votre machine locale.

    Linux/macOS
    mkdir -p ~/.aws-lambda-rie && \ curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \ chmod +x ~/.aws-lambda-rie/aws-lambda-rie

    Pour installer l'émulateur arm64, remplacez le GitHub référentiel de URL la commande précédente par le suivant :

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    $dirPath = "$HOME\.aws-lambda-rie" if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory } $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie" Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

    Pour installer l’émulateur arm64, remplacez $downloadLink par ce qui suit :

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  2. Démarrez votre image Docker à l’aide de la commande docker run. Notez ce qui suit :

    • docker-image est le nom de l’image et test est la balise.

    • /main est le ENTRYPOINT de votre Dockerfile.

    Linux/macOS
    docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie \ docker-image:test \ /main
    PowerShell
    docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` docker-image:test ` /main

    Cette commande exécute l’image en tant que conteneur et crée un point de terminaison local à localhost:9000/2015-03-31/functions/function/invocations.

    Note

    Si vous avez créé l'image Docker pour l'architecture du jeu ARM64 d'instructions, veillez à utiliser l'--platform linux/arm64option au lieu de--platform linux/amd64.

  3. Publiez un événement au point de terminaison local.

    Linux/macOS

    Sous Linux et macOS, exécutez la commande curl suivante :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l'exemple de code de fonction, vous souhaiterez peut-être invoquer la fonction avec une JSON charge utile. Exemple :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Dans PowerShell, exécutez la Invoke-WebRequest commande suivante :

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l'exemple de code de fonction, vous souhaiterez peut-être invoquer la fonction avec une JSON charge utile. Exemple :

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  4. Obtenez l’ID du conteneur.

    docker ps
  5. Utilisez la commande docker kill pour arrêter le conteneur. Dans cette commande, remplacez 3766c4ab331c par l’ID du conteneur de l’étape précédente.

    docker kill 3766c4ab331c
Pour télécharger l'image sur Amazon ECR et créer la fonction Lambda
  1. Exécutez la get-login-passwordcommande pour authentifier le Docker auprès CLI de votre registre AmazonECR.

    • Définissez la --region valeur à l' Région AWS endroit où vous souhaitez créer le ECR référentiel Amazon.

    • 111122223333Remplacez-le par votre Compte AWS identifiant.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Créez un référentiel dans Amazon à ECR l'aide de la commande create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    Note

    Le ECR référentiel Amazon doit être Région AWS identique à la fonction Lambda.

    En cas de succès, vous obtenez une réponse comme celle-ci :

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Copiez le repositoryUri à partir de la sortie de l’étape précédente.

  4. Exécutez la commande docker tag pour étiqueter votre image locale dans votre ECR référentiel Amazon en tant que dernière version. Dans cette commande :

    • docker-image:testest le nom et le tag de votre image Docker. Il s'agit du nom et de la balise de l'image que vous avez spécifiés dans la docker build commande.

    • Remplacez <ECRrepositoryUri> par l’repositoryUri que vous avez copié. Assurez-vous d'inclure :latest à la fin duURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Exemple :

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Exécutez la commande docker push pour déployer votre image locale dans le référentiel AmazonECR. Assurez-vous de l'inclure :latest à la fin du référentielURI.

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Créez un rôle d’exécution pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin du nom de ressource Amazon (ARN) du rôle à l'étape suivante.

  7. Créez la fonction Lambda. PourImageUri, spécifiez le référentiel URI antérieur. Assurez-vous d'inclure :latest à la fin duURI.

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    Note

    Vous pouvez créer une fonction en utilisant une image d'un autre AWS compte, à condition que l'image se trouve dans la même région que la fonction Lambda. Pour de plus amples informations, veuillez consulter Autorisations ECR multi-comptes Amazon.

  8. Invoquer la fonction.

    aws lambda invoke --function-name hello-world response.json

    Vous devriez obtenir une réponse comme celle-ci :

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Pour voir la sortie de la fonction, consultez le fichier response.json.

Pour mettre à jour le code de fonction, vous devez créer à nouveau l'image, télécharger la nouvelle image dans le ECR référentiel Amazon, puis utiliser la update-function-codecommande pour déployer l'image sur la fonction Lambda.

Lambda résout la balise d'image en un condensé d'image spécifique. Cela signifie que si vous pointez la balise d'image qui a été utilisée pour déployer la fonction vers une nouvelle image dans AmazonECR, Lambda ne met pas automatiquement à jour la fonction pour utiliser la nouvelle image.

Pour déployer la nouvelle image sur la même fonction Lambda, vous devez utiliser la update-function-codecommande, même si la balise d'image ECR reste la même dans Amazon. Dans l'exemple suivant, l'--publishoption crée une nouvelle version de la fonction à l'aide de l'image du conteneur mise à jour.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish