Création et partage de couches Lambda - AWS Lambda

Création et partage de couches Lambda

Les couches Lambda sont un moyen pratique de conditionner en package des bibliothèques et d’autres dépendances que vous pouvez utiliser avec vos fonctions Lambda. L’utilisation de couches réduit la taille des archives de déploiement chargées et accélère le déploiement de votre code.

Une couche est une archive de fichier .zip qui peut contenir du code ou des données supplémentaires. Une couche peut contenir des bibliothèques, un environnement d’exécution personnalisé, des données ou des fichiers de configuration. Les couches favorisent le partage de code et la séparation des responsabilités afin que vous puissiez effectuer plus rapidement des itérations lors de l’écriture de la logique métier.

Vous pouvez utiliser des couches uniquement avec des fonctions Lambda déployées en tant qu’archive de fichiers .zip. Pour des fonctions définies en tant qu’image de conteneur, vous créez un package avec votre exécution préférée et toutes les dépendances de code lorsque vous créez l’image de conteneur. Pour plus d’informations, consultez Utilisation de couches et d’extensions Lambda dans des images de conteneurs sur le blog AWS Compute.

Vous pouvez créer des couches à l’aide de la console Lambda, de l’API Lambda, de l’AWS CloudFormation ou l’AWS Serverless Application Model (AWS SAM). Pour plus d’informations sur la création de couches AWS SAM, consultez Utilisation des couches dans le Guide du développeur AWS Serverless Application Model.

Création du contenu de la couche

Lorsque vous créez une couche, vous devez regrouper tout son contenu dans une archive de fichier .zip. Vous chargez l’archive de fichiers .zip sur votre couche à partir d’Amazon Simple Storage Service (Amazon S3) ou de votre ordinateur local. Lors de la configuration de l’environnement d’exécution pour la fonction, Lambda extrait le contenu de la couche dans le répertoire /opt.

Compilation de l’archive de fichier .zip pour votre couche

Vous créez votre code de couche dans une archive de fichiers .zip en utilisant la même procédure que pour un package de déploiement de fonction. Si la couche inclut des bibliothèques de code natives, vous devez compiler et créer ces bibliothèques à l’aide d’une machine de développement Linux, afin que les fichiers binaires soient compatibles avec Amazon Linux.

Lorsque vous créez une couche, vous pouvez spécifier si celle-ci est compatible avec l’une des architectures de l’ensemble des instructions ou les deux. Vous devrez peut-être définir des indicateurs de compilation spécifiques pour créer une couche compatible avec l’architecture arm64.

Une façon de vous assurer que vous conditionnez correctement les bibliothèques dans un package pour Lambda consiste à utiliser AWS Cloud9. Pour plus d’informations, consultez Utilisation de couches Lambda pour simplifier votre processus de développement sur le blog AWS Compute.

Inclusion de dépendances de bibliothèques dans une couche

Pour chaque runtime Lambda, la variable PATH inclut des dossiers spécifiques dans le répertoire /opt. Si vous définissez la même structure de dossiers dans l’archive de fichier .zip de votre couche, votre code de rôle peut accéder au contenu de la couche sans avoir besoin de spécifier le chemin d’accès.

Le tableau suivant répertorie les chemins d’accès aux dossiers pris en charge par chaque exécution.

Chemins d’accès de couche pour chaque exécution Lambda
Runtime Chemin

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

python/lib/python3.9/site-packages (répertoires de site)

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.7.0 (GEM_PATH)

ruby/lib (RUBYLIB)

Toutes les exécutions

bin (PATH)

lib (LD_LIBRARY_PATH)

Les exemples suivants montrent comment structurer les dossiers dans votre couche d’archive .zip.

Node.js

Exemple structure de fichiers du kit SDK AWS X-Ray pour Node.js

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
Python

Exemple structure de fichiers pour la bibliothèque Pillow

pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
Ruby

Exemple structure de fichiers pour la gem JSON

json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
Java

Exemple structure de fichiers pour le fichier JAR Jackson

jackson.zip └ java/lib/jackson-core-2.2.3.jar
All

Exemple structure de fichiers pour la bibliothèque jq

jq.zip └ bin/jq

Pour plus d’informations sur les paramètres de chemin d’accès dans l’environnement d’exécution Lambda, consultez Variables d’environnement d’exécution définies.

Instructions spécifiques du langage

Pour obtenir des instructions spécifiques d’un langage pour la création d’une archive de fichiers .zip, consultez les sections suivantes :

Node.js

Déployer des fonctions Lambda en Node.js avec des archives de fichiers .zip

Python

Déployer des fonctions Lambda en Python avec des archives de fichiers .zip

Ruby

Déployer des fonctions Lambda en Ruby avec des archives de fichiers .zip

Java

Déployer des fonctions Lambda en Java avec des archives de fichiers .zip ou JAR

Go

Déployer des fonctions Lambda Go avec des archives de fichiers .zip

C#

Déployer des fonctions Lambda C# avec des archives de fichiers .zip

PowerShell

Déployer des fonctions Lambda PowerShell avec des archives de fichiers .zip

Création d’une couche

Vous pouvez créer des couches à l’aide de la console Lambda ou de l’API Lambda.

Les couches peuvent avoir une ou plusieurs versions. Lorsque vous créez une couche, Lambda définit la version de la couche sur version 1. Vous pouvez configurer des autorisations sur une version de couche existante, mais pour mettre à jour le code ou apporter d’autres modifications de configuration, vous devez créer une nouvelle version de la couche.

Pour créer une couche (console)

  1. Ouvrez la page Couches de la console Lambda.

  2. Sélectionnez Créer un calque.

  3. Sous Configuration de la couche, dans Nom, nommez votre couche.

  4. (Facultatif) Dans le champ Description, saisissez une description pour le calque.

  5. Pour télécharger le code de votre couche, effectuez l’une des opérations suivantes :

    • Pour charger un fichier .zip à partir de votre ordinateur, choisissez Charger un fichier .zip. Puis, sélectionnez Charger pour sélectionner votre fichier .zip local.

    • Pour charger un fichier à partir d’Amazon S3, choisissez Charger un fichier à partir d’Amazon S3. Ensuite, pour l’URL du lien Amazon S3, saisissez un lien vers le fichier.

  6. (Facultatif) Pour les architectures des ensembles des instructions compatibles, choisissez une valeur ou les deux valeurs.

  7. (Facultatif) Pour les exécutions compatibles, choisissez jusqu’à 15 exécutions.

  8. (Facultatif) Pour Licence, saisissez toutes les informations de licence nécessaires.

  9. Sélectionnez Créer un .

Pour créer une couche (API)

Pour créer une couche, utilisez la commande publish-layer-version avec un nom, une description, une archive de fichiers .zip une liste d’exécution et une liste d’architectures compatibles avec la couche. Les paramètres d’exécution et d’architecture sont facultatifs.

aws lambda publish-layer-version --layer-name my-layer --description "My layer" \ --license-info "MIT" --content S3Bucket=lambda-layers-us-east-2-123456789012,S3Key=layer.zip \ --compatible-runtimes python3.6 python3.7 python3.8 --compatible-architectures "arm64" "x86_64"

Vous devez voir des résultats similaires à ce qui suit :

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "CompatibleArchitectures": [ "arm64", "x86_64" ], "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }
Note

Chaque fois que vous appelez publish-layer-version, vous créez une nouvelle version de la couche.

Suppression d’une version de couche

Pour supprimer une version de couche, utilisez la commande delete-layer-version.

aws lambda delete-layer-version --layer-name my-layer --version-number 1

Lorsque vous supprimez une version de couche, vous ne pouvez plus configurer de fonction Lambda pour l’utiliser. En revanche, toute fonction qui utilise déjà la version continue d’y avoir accès. Les numéros de version ne sont jamais réutilisés pour le nom d’une couche.

Configuration des autorisations de couche

Par défaut, une couche que vous créez est privée à votre compte AWS. Toutefois, vous pouvez éventuellement partager la couche avec d’autres comptes ou la rendre publique.

Pour accorder une autorisation d’utilisation de la couche à un autre compte, ajoutez une instruction à la stratégie d’autorisations de la version de la couche à l’aide de la commande add-layer-version-permission. Dans chaque instruction, vous pouvez accorder une autorisation à un compte unique, à tous les comptes ou à une organisation.

aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 1 --output text

Vous devez voir des résultats similaires à ce qui suit :

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

Les autorisations ne s'appliquent qu'à une seule version de couche. Répétez le processus chaque fois que vous créez une nouvelle version de la couche.

Pour obtenir plus d’exemples, consultez Octroi de l'accès de la couche à d'autres comptes.

Utilisation de AWS CloudFormation avec des couches

Vous pouvez utiliser AWS CloudFormation pour créer une couche et l’associer à votre fonction Lambda. L’exemple de modèle suivant crée une couche nommée blank-nodejs-lib et l’attache à la fonction Lambda à l’aide de la propriété Couches.

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: A Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Lambda::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. Content: S3Bucket: my-bucket-region-123456789012 S3Key: layer.zip CompatibleRuntimes: - nodejs12.x