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 méthodes pour créer une image de conteneur pour une fonction Lambda Go :
-
Utilisation d'une image de base uniquement pour le système d'exploitation AWS
Go est implémenté différemment des autres exécutions gérées. Go se compilant nativement en un binaire exécutable, il n’a pas besoin d’un environnement d’exécution dédié au langage. Utilisez une image de base réservée au système d’exploitation pour créer des images Go pour Lambda. Pour rendre l’image compatible avec Lambda, vous devez inclure le package
aws-lambda-go/lambda
dans l’image. -
Utilisation d’une image de base non-AWS
Vous pouvez utiliser une autre image de base à partir d’un autre registre de conteneur, comme Alpine Linux ou Debian. Vous pouvez également utiliser une image personnalisée créée par votre organisation. Pour rendre l'image compatible avec Lambda, vous devez inclure le package
aws-lambda-go/lambda
dans l'image.
Astuce
Pour réduire le temps nécessaire à l’activation des fonctions du conteneur Lambda, consultez Utiliser des générations en plusieurs étapes
Cette page explique comment créer, tester et déployer des images de conteneur pour Lambda.
Images de base AWS pour le déploiement des fonctions Go
Go est implémenté différemment des autres exécutions gérées. Go se compilant nativement en un binaire exécutable, il n’a pas besoin d’un environnement d’exécution dédié au langage. Utilisez une image de base réservée au système d’exploitation pour déployer les fonctions Go sur Lambda.
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 |
|
Amazon Linux 2023 |
Non planifié |
Non planifié |
Non planifié |
Exécution réservée au système d'exploitation |
|
Amazon Linux 2 |
Non planifié |
Non planifié |
Non planifié |
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 uniquement pour le système d'exploitation AWS ou Utilisation d’une image de base non-AWS.
Utilisation d'une image de base uniquement pour le système d'exploitation AWS
Go est implémenté différemment des autres exécutions gérées. Go se compilant nativement en un binaire exécutable, il n’a pas besoin d’un environnement d’exécution dédié au langage. N’utilisez une image de base réservée au système d’exploitation que 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 une exécution basée sur le système d’exploitation sur GitHub |
Non planifié |
al2 |
Exécution uniquement basée sur le système d'exploitation | Amazon Linux 2 | Dockerfile pour une exécution basée sur le système d’exploitation sur GitHub |
Non planifié |
Pour plus d’informations sur ces images de base, consultez fourni
Vous devez inclure le package aws-lambda-go/lambda
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
-
Créez un répertoire pour le projet, puis passez à ce répertoire.
mkdir hello cd hello
-
Initialisez un nouveau module Go.
go mod init
example.com/hello-world
-
Ajoutez la bibliothèque lambda comme dépendance de votre nouveau module.
go get github.com/aws/aws-lambda-go/lambda
-
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) }
-
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 finaleFROM
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 balise optionnelle
lambda.norpc
pour exclure le composant RPC (Remote Procedure Call) de la bibliothèque lambda. Le composant RPC n’est nécessaire que lorsque vous utilisez l’environnement d’exécution Go 1.x. L’exclusion du RPC réduit la taille du package de déploiement. -
Notez que l’exemple de Dockerfile n’inclut pas d’instruction USER
. Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut disposant d’autorisations de moindre privilège. Ceci est différent du comportement standard de Docker qui est défini par défaut par l’utilisateur root
lorsqu’aucune instructionUSER
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 FROMpublic.ecr.aws/lambda/provided:al2023
COPY --from=build /helloworld/main ./main ENTRYPOINT [ "./main" ] -
-
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 balisetest
.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 d’instructions ARM64, veillez à modifier la commande pour utiliser plutôt l’option--platform linux/arm64
.
Utilisez l’émulateur d’interface d’exécutionprovided.al2023
.
Pour exécuter l’émulateur d’interface d’exécution sur votre ordinateur local
-
Démarrez votre image Docker à l’aide de la commande docker run. Notez ce qui suit :
-
docker-image
est le nom de l’image ettest
est la balise. -
./main
est leENTRYPOINT
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
. -
-
À 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 l’ajout d’une charge utile JSON. Exemple :
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '
{"payload":"hello world!"}
' -
Obtenez l’ID du conteneur.
docker ps
-
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 charger l’image sur Amazon RIE et créer la fonction Lambda
-
Exécutez la commande get-login-password
pour authentifier la CLI Docker auprès de votre registre Amazon ECR. -
Définissez la valeur
--region
sur la Région AWS où vous voulez créer le référentiel Amazon ECR. -
Remplacez
111122223333
par votre ID Compte AWS.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Créez un référentiel dans Amazon ECR à l’aide de la commande create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENote
Le référentiel Amazon ECR doit être dans la même Région AWS que 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" } } }
-
Copiez le
repositoryUri
à partir de la sortie de l’étape précédente. -
Exécutez la commande docker tag
pour étiqueter votre image locale dans votre référentiel Amazon ECR en tant que dernière version. Dans cette commande : -
docker-image:test
est le nom et la balisede votre image Docker. Il s’agit du nom et de la balise de l’image que vous avez spécifiés dans la commande docker build
. -
Remplacez
<ECRrepositoryUri>
par l’repositoryUri
que vous avez copié. Assurez-vous d’inclure:latest
à la fin de l’URI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestExemple :
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Exécutez la commande docker push
pour déployer votre image locale dans le référentiel Amazon ECR. Assurez-vous d’inclure :latest
à la fin de l’URI du référentiel.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Créez un rôle d’exécution pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin de l’Amazon Resource Name (ARN) du rôle à l’étape suivante.
-
Créez la fonction Lambda. Pour
ImageUri
, indiquez l’URI du référentiel mentionné précédemment. Assurez-vous d’inclure:latest
à la fin de l’URI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Note
Vous pouvez créer une fonction à l’aide d’une image dans un compte AWS différent, à condition que l’image soit dans la même région que la fonction Lambda. Pour en savoir plus, consultez Autorisations ECR multi-comptes Amazon.
-
Invoquer la fonction.
aws lambda invoke --function-name
hello-world
response.jsonVous devriez obtenir une réponse comme celle-ci :
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Pour voir la sortie de la fonction, consultez le fichier
response.json
.
Pour mettre à jour le code de la fonction, vous devez recréer l’image, charger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la commande update-function-code
Lambda résout l’étiquette d’image en hachage 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 Amazon ECR, 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 commande update-function-code--publish
crée une version de la fonction à l’aide de l’image du conteneur mise à jour.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
Utilisation d’une image de base non-AWS
Vous pouvez créer une image de conteneur pour Go à partir d’une image de base non-AWS. L’exemple de Dockerfile dans les étapes suivantes utilise une image de base Alpine
Vous devez inclure le package aws-lambda-go/lambda
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
-
Créez un répertoire pour le projet, puis passez à ce répertoire.
mkdir hello cd hello
-
Initialisez un nouveau module Go.
go mod init
example.com/hello-world
-
Ajoutez la bibliothèque lambda comme dépendance de votre nouveau module.
go get github.com/aws/aws-lambda-go/lambda
-
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) }
-
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 pas d’instruction USER . Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut disposant d’autorisations de moindre privilège. Ceci est différent du comportement standard de Docker qui est défini par défaut par l’utilisateur root
lorsqu’aucune instructionUSER
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" ]
-
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 balisetest
.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 d’instructions ARM64, veillez à modifier la commande pour utiliser plutôt l’option--platform linux/arm64
.
Utilisez l’émulateur d’interface d’exécution
Pour installer et exécuter l’émulateur d’interface d’exécution sur votre ordinateur local
-
À partir du répertoire de projets, exécutez la commande suivante pour télécharger l’émulateur d’interface d’exécution (architecture x86-64) à partir de GitHub et l’installer sur votre ordinateur local.
-
Démarrez votre image Docker à l’aide de la commande docker run. Notez ce qui suit :
-
docker-image
est le nom de l’image ettest
est la balise. -
/main
est leENTRYPOINT
de votre Dockerfile.
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 d’instructions ARM64, veillez à utiliser l’option
--platform linux/
plutôt quearm64
--platform linux/
.amd64
-
-
Publiez un événement au point de terminaison local.
-
Obtenez l’ID du conteneur.
docker ps
-
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 charger l’image sur Amazon RIE et créer la fonction Lambda
-
Exécutez la commande get-login-password
pour authentifier la CLI Docker auprès de votre registre Amazon ECR. -
Définissez la valeur
--region
sur la Région AWS où vous voulez créer le référentiel Amazon ECR. -
Remplacez
111122223333
par votre ID Compte AWS.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Créez un référentiel dans Amazon ECR à l’aide de la commande create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENote
Le référentiel Amazon ECR doit être dans la même Région AWS que 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" } } }
-
Copiez le
repositoryUri
à partir de la sortie de l’étape précédente. -
Exécutez la commande docker tag
pour étiqueter votre image locale dans votre référentiel Amazon ECR en tant que dernière version. Dans cette commande : -
docker-image:test
est le nom et la balisede votre image Docker. Il s’agit du nom et de la balise de l’image que vous avez spécifiés dans la commande docker build
. -
Remplacez
<ECRrepositoryUri>
par l’repositoryUri
que vous avez copié. Assurez-vous d’inclure:latest
à la fin de l’URI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestExemple :
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Exécutez la commande docker push
pour déployer votre image locale dans le référentiel Amazon ECR. Assurez-vous d’inclure :latest
à la fin de l’URI du référentiel.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Créez un rôle d’exécution pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin de l’Amazon Resource Name (ARN) du rôle à l’étape suivante.
-
Créez la fonction Lambda. Pour
ImageUri
, indiquez l’URI du référentiel mentionné précédemment. Assurez-vous d’inclure:latest
à la fin de l’URI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Note
Vous pouvez créer une fonction à l’aide d’une image dans un compte AWS différent, à condition que l’image soit dans la même région que la fonction Lambda. Pour en savoir plus, consultez Autorisations ECR multi-comptes Amazon.
-
Invoquer la fonction.
aws lambda invoke --function-name
hello-world
response.jsonVous devriez obtenir une réponse comme celle-ci :
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Pour voir la sortie de la fonction, consultez le fichier
response.json
.
Pour mettre à jour le code de la fonction, vous devez recréer l’image, charger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la commande update-function-code
Lambda résout l’étiquette d’image en hachage 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 Amazon ECR, 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 commande update-function-code--publish
crée une version de la fonction à l’aide de l’image du conteneur mise à jour.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish