

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 avec des images de conteneurs
<a name="deploy-lambda-functions-with-container-images"></a>

*Ram Kandaswamy, Amazon Web Services*

## Résumé
<a name="deploy-lambda-functions-with-container-images-summary"></a>

AWS Lambda prend en charge les images de conteneurs en tant que modèle de déploiement. Ce modèle montre comment déployer des fonctions Lambda via des images de conteneur. 

Lambda est un service de calcul sans serveur piloté par les événements que vous pouvez utiliser pour exécuter du code pour pratiquement n'importe quel type d'application ou de service principal sans provisionner ni gérer de serveurs. Grâce à la prise en charge des images de conteneur pour les fonctions Lambda, vous bénéficiez de 10 Go de stockage maximum pour votre artefact d'application et de la possibilité d'utiliser des outils de développement d'images de conteneur familiers.

L'exemple de ce modèle utilise Python comme langage de programmation sous-jacent, mais vous pouvez utiliser d'autres langages, tels que Java, Node.js ou Go. Pour la source, considérez un système basé sur Git tel que GitHub GitLab, ou Bitbucket, ou utilisez Amazon Simple Storage Service (Amazon S3).

## Conditions préalables et limitations
<a name="deploy-lambda-functions-with-container-images-prereqs"></a>

**Conditions préalables**
+ Amazon Elastic Container Registry (Amazon ECR) activé
+ Code d'application
+ Images Docker avec le client d'interface d'exécution et la dernière version de Python
+ Connaissance pratique de Git

**Limites**
+ La taille d'image maximale prise en charge est de 10 Go.
+ Le temps d'exécution maximal d'un déploiement de conteneur basé sur Lambda est de 15 minutes.

## Architecture
<a name="deploy-lambda-functions-with-container-images-architecture"></a>

**Architecture cible**

![\[Processus en quatre étapes pour créer la fonction Lambda.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/e421cc58-d33e-493d-b0bb-c3ffe39c2eb9/images/7f36d3d8-d161-497a-b036-26d886a16c69.png)


 

1. Vous créez un dépôt Git et vous y validez le code de l'application.

1. Le AWS CodeBuild projet est déclenché par les modifications apportées aux validations.

1. Le CodeBuild projet crée l'image Docker et publie l'image créée sur Amazon ECR.

1. Vous créez la fonction Lambda à l'aide de l'image dans Amazon ECR.

**Automatisation et mise à l'échelle**

Ce modèle peut être automatisé à l'aide de AWS CloudFormation AWS Cloud Development Kit (AWS CDK), ou d'opérations d'API à partir d'un SDK. Lambda peut automatiquement évoluer en fonction du nombre de demandes, et vous pouvez l'ajuster à l'aide des paramètres de simultanéité. Pour plus d'informations, consultez la documentation [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html).

## Outils
<a name="deploy-lambda-functions-with-container-images-tools"></a>

**Services AWS**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)AWS CloudFormationhelps vous permet de configurer les AWS ressources, de les approvisionner rapidement et de manière cohérente, et de les gérer tout au long de leur cycle de vie, de bout Comptes AWS en bout Régions AWS. Ce modèle utilise [AWS CloudFormation Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html), qui vous permet de visualiser et de modifier visuellement les CloudFormation modèles.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)est un service de génération entièrement géré qui vous aide à compiler le code source, à exécuter des tests unitaires et à produire des artefacts prêts à être déployés.
+ [Amazon Elastic Container Registry (Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)) est un service géré de registre d'images de conteneurs sécurisé, évolutif et fiable.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.

**Autres outils**
+ [Docker](https://www.docker.com/) est un ensemble de produits de plateforme en tant que service (PaaS) qui utilisent la virtualisation au niveau du système d'exploitation pour fournir des logiciels dans des conteneurs.
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories), [GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html), et [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) font partie des systèmes de contrôle de source basés sur Git les plus couramment utilisés pour suivre les modifications du code source.

## Bonnes pratiques
<a name="deploy-lambda-functions-with-container-images-best-practices"></a>
+ Rendez votre fonction aussi efficace et aussi petite que possible pour éviter de charger des fichiers inutiles.
+ Efforcez-vous de placer les couches statiques plus haut dans votre liste de fichiers Docker et de placer les couches qui changent plus souvent plus bas. Cela améliore la mise en cache, ce qui améliore les performances.
+ Le propriétaire de l'image est responsable de la mise à jour et des correctifs de l'image. Ajoutez cette cadence de mise à jour à vos processus opérationnels. Pour plus d’informations, consultez la [documentation AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code).

## Épopées
<a name="deploy-lambda-functions-with-container-images-epics"></a>

### Créez un projet dans CodeBuild
<a name="create-a-project-in-codebuild"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez un dépôt Git. | Créez un dépôt Git qui contiendra le code source de l'application, le Dockerfile et le `buildspec.yaml` fichier.  | Developer | 
| Créez un CodeBuild projet. | Pour utiliser un CodeBuild projet afin de créer l'image Lambda personnalisée, procédez comme suit : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | Developer | 
| Modifiez le Dockerfile. | Le Dockerfile doit se trouver dans le répertoire de premier niveau dans lequel vous développez l'application. Le code Python doit se trouver dans le `src` dossier.Lorsque vous créez l'image, utilisez les images [officielles prises en charge par Lambda](https://gallery.ecr.aws/lambda?page=1). Sinon, une erreur de démarrage se produira, rendant le processus d'emballage plus difficile.Pour plus de détails, consultez la section [Informations supplémentaires](#deploy-lambda-functions-with-container-images-additional). | Developer | 
| Créez un référentiel dans Amazon ECR. | Créez un référentiel de conteneurs dans Amazon ECR. Dans l'exemple de commande suivant, le nom du référentiel créé est `cf-demo` :<pre>aws ecr create-repository --cf-demo </pre>Le référentiel sera référencé dans le `buildspec.yaml` fichier. | Administrateur AWS, développeur | 
| Poussez l'image vers Amazon ECR. | Vous pouvez l'utiliser CodeBuild pour exécuter le processus de création d'image. CodeBuild a besoin d'une autorisation pour interagir avec Amazon ECR et pour travailler avec S3. Dans le cadre du processus, l'image Docker est créée et envoyée au registre Amazon ECR. Pour plus de détails sur le modèle et le code, consultez la section [Informations supplémentaires](#deploy-lambda-functions-with-container-images-additional). | Developer | 
| Vérifiez que l'image se trouve dans le référentiel. | Pour vérifier que l'image se trouve dans le référentiel, sur la console Amazon ECR, sélectionnez **Repositories**. L'image doit être répertoriée, avec des balises et les résultats d'un rapport d'analyse des vulnérabilités si cette fonctionnalité a été activée dans les paramètres Amazon ECR.  Pour plus d'informations, consultez la [documentation AWS](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-registry-scanning-configuration.html). | Developer | 

### Créez la fonction Lambda pour exécuter l'image
<a name="create-the-lambda-function-to-run-the-image"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez la fonction Lambda. | Sur la console Lambda, choisissez **Create function**, puis choisissez **Container** image. Entrez le nom de la fonction et l'URI de l'image qui se trouve dans le référentiel Amazon ECR, puis choisissez **Create function**. Pour plus d'informations, consultez la documentation [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html). | Développeur d’applications | 
| Testez la fonction Lambda. | Pour appeler et tester la fonction, choisissez **Test**. Pour plus d'informations, consultez la documentation [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html). | Développeur d’applications | 

## Résolution des problèmes
<a name="deploy-lambda-functions-with-container-images-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| La construction ne réussit pas. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 

## Ressources connexes
<a name="deploy-lambda-functions-with-container-images-resources"></a>
+ [Images de base pour Lambda](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html)
+ [Exemple Docker pour CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html)
+ [Transmettez des informations d'identification temporaires](https://aws.amazon.com/premiumsupport/knowledge-center/codebuild-temporary-credentials-docker/)

## Informations supplémentaires
<a name="deploy-lambda-functions-with-container-images-additional"></a>

**Modifier le Dockerfile**

Le code suivant montre les commandes que vous modifiez dans le Dockerfile :

```
FROM public.ecr.aws/lambda/python:3.xx

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT} 
COPY requirements.txt  ${LAMBDA_TASK_ROOT} 

# install dependencies
RUN pip3 install --user -r requirements.txt

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.lambda_handler" ]
```

Dans la `FROM` commande, utilisez la valeur appropriée pour la version de Python prise en charge par Lambda (par exemple,`3.12`). Il s'agira de l'image de base disponible dans le référentiel d'images public Amazon ECR. 

La `COPY app.py ${LAMBDA_TASK_ROOT}` commande copie le code dans le répertoire racine de la tâche, que la fonction Lambda utilisera. Cette commande utilise la variable d'environnement afin que nous n'ayons pas à nous soucier du chemin réel. La fonction à exécuter est transmise en tant qu'argument à la `CMD [ "app.lambda_handler" ]` commande.

La `COPY requirements.txt` commande capture les dépendances nécessaires au code. 

La `RUN pip install --user -r requirements.txt` commande installe les dépendances dans le répertoire utilisateur local. 

Pour créer votre image, exécutez la commande suivante.

```
docker build -t <image name> .
```

**Ajoutez l'image dans Amazon ECR**

Dans le code suivant, remplacez-le `aws_account_id` par le numéro de compte, et remplacez-le `us-east-1` si vous utilisez une autre région. Le `buildspec` fichier utilise le numéro de CodeBuild version pour identifier de manière unique les versions d'image sous forme de valeur de balise. Vous pouvez le modifier en fonction de vos besoins.

*Le code personnalisé buildspec*

```
phases:
  install:
    runtime-versions:
       python: 3.xx
  pre_build:
    commands:
      - python3 --version
      - pip3 install --upgrade pip
      - pip3 install --upgrade awscli
      - sudo docker info
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - ls
      - cd app
      - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER .
      - docker container ls
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com
      - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
      - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
```