Déployez TypeScript du code transpilé dans Lambda avec des images de conteneur - 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éployez TypeScript du code transpilé dans Lambda avec des images de conteneur

Vous pouvez déployer votre TypeScript code sur une AWS Lambda fonction sous forme d'image de conteneur Node.js. AWS fournit des images de base pour Node.js afin de vous aider à créer l'image du conteneur. Ces images de base sont préchargées avec un environnement d'exécution du langage et d'autres composants nécessaires pour exécuter l'image sur Lambda. AWS fournit un Dockerfile pour chacune des images de base afin de vous aider à créer votre image de conteneur.

Si vous utilisez une image de base d'une communauté ou d'une entreprise privée, vous devez ajouter le client d'interface d'exécution Node.js (RIC) à l'image de base pour la rendre compatible avec Lambda.

Lambda fournit un émulateur d’interface d’exécution pour les tests locaux. Les images AWS de base de Node.js incluent l'émulateur d'interface d'exécution. Si vous utilisez une autre image de base, telle qu’une image Alpine Linux ou Debian, vous pouvez intégrer l’émulateur dans votre image ou l’installer sur votre ordinateur local.

Utilisation d'une image de base Node.js pour créer et empaqueter le code de TypeScript fonction

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

Pour créer une image à partir d'une image de AWS base pour Lambda
  1. Sur votre machine locale, créez un répertoire de projets pour votre nouvelle fonction.

  2. Créez un nouveau projet Node.js avec npm ou un gestionnaire de packs de votre choix.

    npm init
  3. Ajoutez les packs @types/aws-lambda et esbuild en tant que dépendances de développement. Le package @types/aws-lambda contient les définitions de type pour Lambda.

    npm install -D @types/aws-lambda esbuild
  4. Ajoutez un script de création au fichier package.json.

    "scripts": { "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js" }
  5. Créez un nouveau fichier appelé index.ts. Ajoutez l’exemple de code suivant au nouveau fichier. Il s’agit du code de la fonction Lambda. La fonction renvoie un message hello world.

    Note

    L’instruction import importe les définitions de type depuis @types /aws-lambda. Il n'importe pas le aws-lambda NPM package, qui est un outil tiers indépendant. Pour plus d'informations, consultez aws-lambda dans le référentiel. DefinitelyTyped GitHub

    import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
  6. Créez un nouveau Dockerfile avec la configuration suivante :

    • Définissez la FROM propriété sur URI l'image de base.

    • Définissez l’argument CMD pour spécifier le gestionnaire de la fonction Lambda.

    L’exemple de fichier Docker suivant utilise une génération en plusieurs étapes. La première étape consiste à transspirer le TypeScript code en. JavaScript La deuxième étape produit une image de conteneur contenant uniquement des JavaScript fichiers et des dépendances de production.

    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
    FROM public.ecr.aws/lambda/nodejs:20 as builder WORKDIR /usr/app COPY package.json index.ts ./ RUN npm install RUN npm run build FROM public.ecr.aws/lambda/nodejs:20 WORKDIR ${LAMBDA_TASK_ROOT} COPY --from=builder /usr/app/dist/* ./ CMD ["index.handler"]
  7. 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.

  1. Démarrez votre image Docker à l’aide de la commande docker run. Dans cet exemple, docker-image est le nom de l’image et test est la balise.

    docker run --platform linux/amd64 -p 9000:8080 --read-only docker-image:test

    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.

  2. À partir d’une nouvelle fenêtre de terminal, 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"
  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 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