

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.

# Tutoriel : Déployer une fonction Lambda mise à jour avec CodeDeploy et le modèle d'application AWS sans serveur
<a name="tutorial-lambda-sam"></a>

AWS SAM est un framework open source permettant de créer des applications sans serveur. Il transforme et étend la syntaxe YAML d'un AWS SAM modèle en CloudFormation syntaxe permettant de créer des applications sans serveur, telles qu'une fonction Lambda. Pour plus d'informations, voir [Qu'est-ce que le modèle d'application AWS sans serveur](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) ? 

 Dans ce didacticiel, vous allez utiliser AWS SAM pour créer une solution qui effectue les opérations suivantes : 
+  Crée votre fonction Lambda. 
+  Crée votre CodeDeploy application et votre groupe de déploiement. 
+  Crée deux fonctions Lambda qui exécutent des tests de validation du déploiement pendant les hooks CodeDeploy du cycle de vie. 
+  Détecte la mise à jour de votre fonction Lambda. La mise à jour de la fonction Lambda déclenche un déploiement CodeDeploy qui déplace progressivement le trafic de production de la version d'origine de votre fonction Lambda vers la version mise à jour. 

**Note**  
Ce didacticiel nécessite que vous créiez des ressources qui peuvent entraîner des frais sur votre compte AWS . Cela inclut les frais éventuels pour CodeDeploy, Amazon CloudWatch, et AWS Lambda. Pour plus d'informations, consultez les [CodeDeploy sections Tarification](https://aws.amazon.com/codedeploy/pricing/), [ CloudWatch Tarification Amazon](https://aws.amazon.com/cloudwatch/pricing/) et [AWS Lambda Tarification](https://aws.amazon.com/lambda/pricing/).

**Topics**
+ [Conditions préalables](tutorial-lambda-sam-prereqs.md)
+ [Étape 1 : configurer votre infrastructure](tutorial-lambda-sam-setup-infrastructure.md)
+ [Étape 2 : mise à jour de la fonction Lambda](tutorial-lambda-sam-update-function.md)
+ [Étape 3 : Déploiement de la fonction Lambda mise à jour](tutorial-lambda-sam-deploy-update.md)
+ [Étape 4 : Afficher les résultats de votre déploiement](tutorial-lambda-sam-deploy-view-results.md)
+ [Étape 5 : nettoyer](tutorial-lambda-clean-up.md)

# Conditions préalables
<a name="tutorial-lambda-sam-prereqs"></a>

Pour effectuer ce didacticiel, vous devez d'abord :
+  Suivez les étapes de [Commencer avec CodeDeploy](getting-started-codedeploy.md). 
+  Installez la AWS Serverless Application Model CLI. Pour plus d'informations, consultez la section [Installation de la CLI AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). 
+  Créez un compartiment S3. AWS SAM télécharge les artefacts référencés dans votre [modèle AWS SAM](https://docs.aws.amazon.com/en_us/codedeploy/latest/userguide/tutorial-lambda-sam-template.html) dans ce compartiment. 

# Étape 1 : configurer votre infrastructure
<a name="tutorial-lambda-sam-setup-infrastructure"></a>

 Cette rubrique explique comment créer des fichiers AWS SAM pour votre AWS SAM modèle et vos fonctions Lambda. Ensuite, vous utilisez les `deploy` commandes AWS SAM `package` et pour générer les composants de votre infrastructure. Lorsque votre infrastructure est prête, vous disposez d'une CodeDeploy application et d'un groupe de déploiement, de la fonction Lambda à mettre à jour et à déployer, et de deux fonctions Lambda contenant des tests de validation exécutés lorsque vous déployez la fonction Lambda. Lorsque vous avez terminé, vous pouvez l'utiliser CloudFormation pour afficher vos composants dans la console Lambda ou AWS CLI pour tester votre fonction Lambda. 

**Topics**
+ [Créez vos fichiers](tutorial-lambda-create-files.md)
+ [Package de l'application AWS SAM](tutorial-lambda-sam-package.md)
+ [Déployer l'application AWS SAM](tutorial-lambda-sam-deploy.md)
+ [(Facultatif) inspectez et testez votre infrastructure](tutorial-lambda-sam-confirm-components.md)

# Créez vos fichiers
<a name="tutorial-lambda-create-files"></a>

 Pour créer votre infrastructure, vous devez créer les fichiers suivants : 
+ `template.yml`
+ `myDateTimeFunction.js`
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`

**Topics**
+ [Créez votre modèle AWS SAM](tutorial-lambda-sam-template.md)
+ [Créez un fichier pour votre fonction Lambda](tutorial-lambda-sam-create-lambda-function.md)
+ [Créez un fichier pour votre fonction BeforeAllowTraffic Lambda](tutorial-lambda-sam-create-lambda-before-traffic.md)
+ [Créez un fichier pour votre fonction AfterAllowTraffic Lambda](tutorial-lambda-sam-create-lambda-after-traffic.md)

# Créez votre modèle AWS SAM
<a name="tutorial-lambda-sam-template"></a>

Créez un fichier modèle AWS SAM qui spécifie les composants de votre infrastructure.

**Pour créer votre modèle AWS SAM**

1.  Créez un répertoire nommé `SAM-Tutorial`. 

1.  Dans votre répertoire `SAM-Tutorial`, créez un fichier nommé `template.yml`. 

1.  Copiez le code YAML suivant dans `template.yml`. Il s'agit de votre modèle AWS SAM . 

   ```
   AWSTemplateFormatVersion : '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: A sample SAM template for deploying Lambda functions.
   
   Resources:
   # Details about the myDateTimeFunction Lambda function
     myDateTimeFunction:
       Type: AWS::Serverless::Function
       Properties:
         Handler: myDateTimeFunction.handler
         Runtime: nodejs18.x
   # Instructs your myDateTimeFunction is published to an alias named "live".      
         AutoPublishAlias: live
   # Grants this function permission to call lambda:InvokeFunction
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: '*'
         DeploymentPreference:
   # Specifies the deployment configuration      
             Type: Linear10PercentEvery1Minute
   # Specifies Lambda functions for deployment lifecycle hooks
             Hooks:
               PreTraffic: !Ref beforeAllowTraffic
               PostTraffic: !Ref afterAllowTraffic
               
   # Specifies the BeforeAllowTraffic lifecycle hook Lambda function
     beforeAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: beforeAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call lambda:InvokeFunction        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_beforeAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
             
   # Specifies the AfterAllowTraffic lifecycle hook Lambda function
     afterAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: afterAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus         
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call lambda:InvokeFunction          
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_afterAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
   ```

Ce modèle spécifie les éléments suivants. Pour plus d'informations, consultez la section [Concepts des AWS SAM modèles](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html).

**Une fonction Lambda appelée `myDateTimeFunction`**  
 Lorsque cette fonction Lambda est publiée, la `AutoPublishAlias` ligne du modèle la lie à un alias nommé. `live` Plus loin dans ce didacticiel, une mise à jour de cette fonction déclenche un déploiement AWS CodeDeploy qui déplace progressivement le trafic de production de la version d'origine vers la version mise à jour. 

**Deux fonctions de validation du déploiement Lambda**  
 Les fonctions Lambda suivantes sont exécutées pendant les hooks CodeDeploy du cycle de vie. Ces fonctions contiennent du code qui valide le déploiement de la fonction `myDateTimeFunction` mise à jour. Le résultat des tests de validation est transmis à CodeDeploy à l'aide de sa méthode d'API `PutLifecycleEventHookExecutionStatus`. Si un test de validation échoue, le déploiement échoue et est annulé.   
+  `CodeDeployHook_beforeAllowTraffic` s'exécute pendant le hook `BeforeAllowTraffic`. 
+  `CodeDeployHook_afterAllowTraffic` s'exécute pendant le hook `AfterAllowTraffic`. 
Le nom des deux fonctions commence par `CodeDeployHook_`. Le `CodeDeployRoleForLambda` rôle autorise les appels à la `invoke` méthode Lambda uniquement dans les fonctions Lambda dont le nom commence par ce préfixe. Pour plus d'informations, veuillez consulter les sections [AppSpec section « hooks » pour un déploiement AWS Lambda](reference-appspec-file-structure-hooks.md#appspec-hooks-lambda) et [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html) (français non garanti) de la *Référence d'API CodeDeploy *. 

**Détection automatique d'une fonction Lambda mise à jour**  
 Le terme `AutoPublishAlias` indique au cadre de détecter quand la fonction `myDateTimeFunction` change, puis de la déployer à l'aide de l'alias `live`. 

**Une configuration de déploiement**  
 La configuration de déploiement détermine la vitesse à laquelle votre CodeDeploy application déplace le trafic de la version d'origine de la fonction Lambda vers la nouvelle version. Ce modèle spécifie la configuration de déploiement prédéfinie `Linear10PercentEvery1Minute`.   
 Vous ne pouvez pas spécifier de configuration de déploiement personnalisée dans un modèle AWS SAM. Pour de plus amples informations, veuillez consulter [Créez une configuration de déploiement avec CodeDeploy](deployment-configurations-create.md).

**Fonctions de hook de cycle de vie de déploiement**  
 La section `Hooks` spécifie les fonctions à exécuter pendant les hooks d'événement de cycle de vie. `PreTraffic` spécifie la fonction qui s'exécute pendant le hook `BeforeAllowTraffic`. `PostTraffic` spécifie la fonction qui s'exécute pendant le hook `AfterAllowTraffic`. 

**Autorisations permettant à Lambda d'appeler une autre fonction Lambda**  
 L'`lambda:InvokeFunction`autorisation spécifiée accorde au rôle utilisé par l'application AWS SAM l'autorisation d'appeler une fonction Lambda. Cela est nécessaire lorsque les `CodeDeployHook_afterAllowTraffic` fonctions `CodeDeployHook_beforeAllowTraffic` et invoquent la fonction Lambda déployée lors des tests de validation. 

# Créez un fichier pour votre fonction Lambda
<a name="tutorial-lambda-sam-create-lambda-function"></a>

Créez le fichier pour la fonction que vous mettrez à jour et déploierez ultérieurement dans ce didacticiel.

**Note**  
 Une fonction Lambda peut utiliser n'importe quel environnement d'exécution pris en charge par. AWS Lambda Pour plus d'informations, consultez [Environnement d'exécution AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html). 

**Pour créer votre fonction Lambda**

1.  Créez un fichier texte et enregistrez-le sous le nom `myDateTimeFunction.js` dans le répertoire `SAM-Tutorial`. 

1.  Copiez le code Node.js suivant dans `myDateTimeFunction.js`. 

   

   ```
   'use strict';
       
       exports.handler = function(event, context, callback) {
       
         if (event.body) {
           event = JSON.parse(event.body);
         }
       
         var sc; // Status code
         var result = ""; // Response payload
       
         switch(event.option) {
           case "date": 
             switch(event.period) {
               case "yesterday":
                 result = setDateResult("yesterday");
                 sc = 200;
                 break;
               case "today":
                 result = setDateResult();
                 sc = 200;
                 break;
               case "tomorrow":
                 result = setDateResult("tomorrow");
                 sc = 200;
                 break;
               default:
                 result = {
                   "error": "Must specify 'yesterday', 'today', or 'tomorrow'."
                 };
                 sc = 400;
                 break;
             }
             break;
             
       /*      Later in this tutorial, you update this function by uncommenting 
               this section. The framework created by AWS SAM detects the update 
               and triggers a deployment by CodeDeploy. The deployment shifts 
               production traffic to the updated version of this function.
               
               case "time":
               var d = new Date();
               var h = d.getHours();
               var mi = d.getMinutes();
               var s = d.getSeconds();
       
               result = {
                 "hour": h,
                 "minute": mi,
                 "second": s
               };
               sc = 200;
               break;
       */
             default:
               result = {
                 "error": "Must specify 'date' or 'time'."
               };
               sc = 400;
             break;
         }
       
         const response = {
           statusCode: sc,
           headers: { "Content-type": "application/json" },
           body: JSON.stringify( result )
         };
       
         callback(null, response);
       
         function setDateResult(option) {
       
           var d = new Date(); // Today
           var mo; // Month
           var da; // Day
           var y; // Year
       
           switch(option) {
             case "yesterday":
               d.setDate(d.getDate() - 1);
               break;
             case "tomorrow":
               d.setDate(d.getDate() + 1);
             default:
              break;
           }
       
           mo = d.getMonth() + 1; // Months are zero offset (0-11)
           da = d.getDate();
           y = d.getFullYear();
       
           result = {
             "month": mo,
             "day": da,
             "year": y
           };
       
           return result;
         }
       };
   ```

La fonction Lambda renvoie le jour, le mois et l'année pour hier, aujourd'hui ou demain. Plus loin dans ce didacticiel, vous annulerez la mise en commentaire du code qui met à jour la fonction pour renvoyer des informations sur le jour ou l'heure que vous spécifiez (par exemple, le jour, le mois et l'année, ou l'heure, la minute et la seconde actuelles). Le framework créé par AWS SAM détecte et déploie la version mise à jour de la fonction. 

**Note**  
 Cette fonction Lambda est également utilisée dans un AWS Cloud9 didacticiel. AWS Cloud9 est un environnement de développement intégré basé sur le cloud. Pour plus d'informations sur la création, l'exécution, la mise à jour et le débogage de cette fonction dans AWS Cloud9, consultez le [AWS Lambda didacticiel pour AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/tutorial-lambda.html). 

# Créez un fichier pour votre fonction BeforeAllowTraffic Lambda
<a name="tutorial-lambda-sam-create-lambda-before-traffic"></a>

Créez le fichier pour la fonction Lambda de votre `beforeAllowTraffic` hook.

1.  Créez un fichier texte et enregistrez-le sous le nom `beforeAllowTraffic.js` dans le répertoire `SAM-Tutorial`. 

1.  Copiez le code Node.js suivant dans `beforeAllowTraffic.js`. Cette fonction s'exécute pendant le hook `BeforeAllowTraffic` de votre déploiement. 

   ```
   'use strict';
       
       const AWS = require('aws-sdk'); 
       const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
       var lambda = new AWS.Lambda();
       
       exports.handler = (event, context, callback) => {
       
       	console.log("Entering PreTraffic Hook!");
       	
       	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
         var deploymentId = event.DeploymentId;
       	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
       
       	var functionToTest = process.env.NewVersion;
       	console.log("BeforeAllowTraffic hook tests started");
       	console.log("Testing new function version: " + functionToTest);
       
       	// Create parameters to pass to the updated Lambda function that
       	// include the newly added "time" option. If the function did not
       	// update, then the "time" option is invalid and function returns
       	// a statusCode of 400 indicating it failed.
       	var lambdaParams = {
       		FunctionName: functionToTest,    
       		Payload: "{\"option\": \"time\"}", 
       		InvocationType: "RequestResponse"
       	};
       
       	var lambdaResult = "Failed";
       	// Invoke the updated Lambda function.
       	lambda.invoke(lambdaParams, function(err, data) {
       		if (err){	// an error occurred
       			console.log(err, err.stack);
       			lambdaResult = "Failed";
       		}
       		else{	// successful response
       			var result = JSON.parse(data.Payload);
       			console.log("Result: " +  JSON.stringify(result));
             console.log("statusCode: " + result.statusCode);
             
             // Check if the status code returned by the updated
             // function is 400. If it is, then it failed. If 
             // is not, then it succeeded.
       			if (result.statusCode != "400"){
               console.log("Validation succeeded");
       				lambdaResult = "Succeeded";
             }
             else {
               console.log("Validation failed");
             }
       
       			// Complete the PreTraffic Hook by sending CodeDeploy the validation status
       			var params = {
       				deploymentId: deploymentId,
       				lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
       				status: lambdaResult // status can be 'Succeeded' or 'Failed'
       			};
       			
       			// Pass CodeDeploy the prepared validation test results.
       			codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
       				if (err) {
       					// Validation failed.
       					console.log("CodeDeploy Status update failed");
       					console.log(err, err.stack);
       					callback("CodeDeploy Status update failed");
       				} else {
       					// Validation succeeded.
       					console.log("CodeDeploy status updated successfully");
       					callback(null, "CodeDeploy status updated successfully");
       				}
       			});
       		}  
       	});
       }
   ```

# Créez un fichier pour votre fonction AfterAllowTraffic Lambda
<a name="tutorial-lambda-sam-create-lambda-after-traffic"></a>

Créez le fichier pour la fonction Lambda de votre `afterAllowTraffic` hook.

1.  Créez un fichier texte et enregistrez-le sous le nom `afterAllowTraffic.js` dans le répertoire `SAM-Tutorial`. 

1.  Copiez le code Node.js suivant dans `afterAllowTraffic.js`. Cette fonction s'exécute pendant le hook `AfterAllowTraffic` de votre déploiement. 

   ```
   'use strict';
       
       const AWS = require('aws-sdk');
       const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
       var lambda = new AWS.Lambda();
       
       exports.handler = (event, context, callback) => {
       
       	console.log("Entering PostTraffic Hook!");
       	
       	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
         var deploymentId = event.DeploymentId;
       	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
       
       	var functionToTest = process.env.NewVersion;
       	console.log("AfterAllowTraffic hook tests started");
       	console.log("Testing new function version: " + functionToTest);
       
       	// Create parameters to pass to the updated Lambda function that
       	// include the original "date" parameter. If the function did not 
       	// update as expected, then the "date" option might be invalid. If 
       	// the parameter is invalid, the function returns
       	// a statusCode of 400 indicating it failed.
       	var lambdaParams = {
       		FunctionName: functionToTest,    
       		Payload: "{\"option\": \"date\", \"period\": \"today\"}", 
       		InvocationType: "RequestResponse"
       	};
       
       	var lambdaResult = "Failed";
       	// Invoke the updated Lambda function.
       	lambda.invoke(lambdaParams, function(err, data) {
       		if (err){	// an error occurred
       			console.log(err, err.stack);
       			lambdaResult = "Failed";
       		}
       		else{	// successful response
       			var result = JSON.parse(data.Payload);
       			console.log("Result: " +  JSON.stringify(result));
             console.log("statusCode: " + result.statusCode);
             
             // Check if the status code returned by the updated
             // function is 400. If it is, then it failed. If 
             // is not, then it succeeded.
       			if (result.statusCode != "400"){
               console.log("Validation of time parameter succeeded");
       				lambdaResult = "Succeeded";
             }
             else {
               console.log("Validation failed");
             }
       
       			// Complete the PostTraffic Hook by sending CodeDeploy the validation status
       			var params = {
       				deploymentId: deploymentId,
       				lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
       				status: lambdaResult // status can be 'Succeeded' or 'Failed'
       			};
       			
       			// Pass CodeDeploy the prepared validation test results.
       			codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
       				if (err) {
       					// Validation failed.
       					console.log("CodeDeploy Status update failed");
       					console.log(err, err.stack);
       					callback("CodeDeploy Status update failed");
       				} else {
       					// Validation succeeded.
       					console.log("CodeDeploy status updated successfully");
       					callback(null, "CodeDeploy status updated successfully");
       				}
       			});
       		}  
       	});
       }
   ```

# Package de l'application AWS SAM
<a name="tutorial-lambda-sam-package"></a>

 Vous devez maintenant avoir quatre fichiers dans votre répertoire `SAM-Tutorial` : 
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`
+ `myDateTimeFunction.js`
+ `template.yml`

 Vous êtes maintenant prêt à utiliser la **sam package** commande AWS SAM pour créer et empaqueter des artefacts pour vos fonctions et CodeDeploy applications Lambda. Les artefacts sont chargés dans un compartiment S3. La sortie de la commande est un nouveau fichier nommé `package.yml`. Ce fichier est utilisé par la **sam deploy** commande AWS SAM à l'étape suivante. 

**Note**  
 Pour plus d'informations sur la **sam package** commande, consultez la [référence des commandes AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html) dans le *manuel du AWS Serverless Application Model développeur*. 

 Dans le répertoire `SAM-Tutorial`, exécutez la commande suivante. 

```
sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket amzn-s3-demo-bucket
```

Pour le `s3-bucket` paramètre, spécifiez le compartiment Amazon S3 que vous avez créé comme condition préalable à ce didacticiel. `output-template-file`Spécifie le nom du nouveau fichier utilisé par la **sam deploy** commande AWS SAM.

# Déployer l'application AWS SAM
<a name="tutorial-lambda-sam-deploy"></a>

 Utilisez la **sam deploy** commande AWS SAM avec le `package.yml` fichier pour créer vos fonctions Lambda, votre CodeDeploy application et votre groupe de déploiement à l'aide de. CloudFormation

**Note**  
Pour plus d'informations sur la **sam deploy** commande, consultez la [référence des commandes AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html) dans le *manuel du AWS Serverless Application Model développeur*. 

 Dans le répertoire `SAM-Tutorial`, exécutez la commande suivante. 

```
sam deploy \
  --template-file package.yml \
  --stack-name my-date-time-app \
  --capabilities CAPABILITY_IAM
```

 Le `--capabilities CAPABILITY_IAM` paramètre est obligatoire pour autoriser la création CloudFormation de rôles IAM. 

# (Facultatif) inspectez et testez votre infrastructure
<a name="tutorial-lambda-sam-confirm-components"></a>

 Cette rubrique explique comment visualiser les composants de votre infrastructure et tester votre fonction Lambda. 

**Pour afficher le résultat de votre pile après avoir exécuté `sam deploy`**

1. Ouvrez la CloudFormation console à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1.  Dans le volet de navigation, choisissez **Stack (Piles)**. La pile `my-date-time-app` s'affiche en haut. 

1.  Choisissez l'onglet **Événements** pour voir quels événements sont terminés. Vous pouvez afficher les événements pendant que la création de la pile est en cours. Lorsque la création de la pile est terminée, vous pouvez voir tous les événements de création de la pile. 

1.  Une fois la pile sélectionnée, choisissez **Ressources**. Dans la colonne **Type**, vous pouvez voir vos fonctions Lambda, `myDateTimeFunction``CodeDeployHook_beforeAllowTraffic`, et. `CodeDeployHook_afterAllowTraffic` La colonne **Physical ID** de chacune de vos fonctions Lambda contient un lien permettant d'afficher les fonctions dans la console Lambda. 
**Note**  
 Le nom de la fonction `myDateTimeFunction` Lambda est précédé du nom de la CloudFormation pile et un identifiant y est ajouté, ce qui donne l'apparence suivante : `my-date-time-app-myDateTimeFunction-123456ABCDEF` 

1. Ouvrez la CodeDeploy console à l'adresse [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/).

1.  Dans le volet de navigation, développez **Déployer**, puis choisissez **Applications**. 

1.  Vous devriez voir une nouvelle CodeDeploy application créée par CloudFormation et dont le nom commence par`my-date-time-app-ServerlessDeploymentApplication`. Choisissez cette application. 

1.  Vous devez voir un groupe de déploiement dont le nom commence par `my-date-time-app-myDateTimeFunctionDeploymentGroup`. Choisissez ce groupe de déploiement. 

    Sous **Configuration du déploiement**, vous devriez voir **CodeDeployDefault. LambdaLinear10 PercentEvery 1 minute.** 

**(Facultatif) pour tester votre fonction (console)**

1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1.  Dans le volet de navigation, choisissez votre fonction `my-date-time-app-myDateTimeFunction`. Dans la console, son nom contient un identifiant. Il ressemble donc à `my-date-time-app-myDateTimeFunction-123456ABCDEF`. 

1.  Sélectionnez **Tester)**. 

1.  Dans **Nom de l'événement**, entrez un nom pour votre événement de test. 

1.  Entrez les informations suivantes pour votre événement de test, puis choisissez **Créer**. 

   ```
   {
     "option": "date",
     "period": "today"
   }
   ```

1.  Sélectionnez **Tester)**. Vous devriez voir uniquement votre événement de test dans la liste des événements de test. 

    Pour **Résultat de l'exécution**, vous devriez voir **réussite**. 

1.  Sous **Résultat de l'exécution**, développez **Détails** pour afficher les résultats. Vous devriez voir le mois, le jour et l'année en cours. 

**(Facultatif) pour tester votre fonction (AWS CLI)**

1.  Localisez l'ARN de votre fonction Lambda. Il apparaît en haut de la console Lambda lorsque vous visualisez votre fonction. 

1.  Exécutez la commande suivante. Remplacez *your-function-arn* par la fonction ARN. 

   ```
   aws lambda invoke \
   --function your-function-arn \
   --cli-binary-format raw-in-base64-out \
   --payload "{\"option\": \"date\", \"period\": \"today\"}" out.txt
   ```

1.  Ouvrez `out.txt` pour confirmer que le résultat contient le mois, le jour et l'année en cours. 

# Étape 2 : mise à jour de la fonction Lambda
<a name="tutorial-lambda-sam-update-function"></a>

 Dans cette rubrique, vous mettez à jour votre fichier `myDateTimeFunction.js`. Dans l'étape suivante, vous allez utiliser ce fichier pour déployer la fonction mise à jour. Cela déclenche son déploiement CodeDeploy en transférant le trafic de production de la version actuelle de la fonction Lambda vers la version mise à jour. 

**Pour mettre à jour votre fonction Lambda**

1.  Ouvrir `myDateTimeFunction.js`. 

1.  Supprimez les deux marqueurs de commentaire (« `/*` » et « `*/` ») et le texte explicatif au début et à la fin de l'élément `case` nommé `time` dans le bloc `switch`. 

    Le code sans commentaire vous permet de transmettre un nouveau paramètre, `time`, à la fonction. Si vous transmettez `time` à la fonction mise à jour, elle renvoie les valeurs `hour`, `minute` et `second` actuelles. 

1.  Enregistrez `myDateTimeFunction.js`. Il devrait se présenter comme suit : 

   ```
   'use strict';
   
   exports.handler = function(event, context, callback) {
   
     if (event.body) {
       event = JSON.parse(event.body);
     }
   
     var sc; // Status code
     var result = ""; // Response payload
   
     switch(event.option) {
       case "date":
         switch(event.period) {
           case "yesterday":
             result = setDateResult("yesterday");
             sc = 200;
             break;
           case "today":
             result = setDateResult();
             sc = 200;
             break;
           case "tomorrow":
             result = setDateResult("tomorrow");
             sc = 200;
             break;
           default:
             result = {
               "error": "Must specify 'yesterday', 'today', or 'tomorrow'."
             };
             sc = 400;
             break;
         }
         break;
         case "time":
           var d = new Date();
           var h = d.getHours();
           var mi = d.getMinutes();
           var s = d.getSeconds();
   
           result = {
             "hour": h,
             "minute": mi,
             "second": s
           };
           sc = 200;
           break;
   
         default:
           result = {
             "error": "Must specify 'date' or 'time'."
           };
           sc = 400;
         break;
     }
   
     const response = {
       statusCode: sc,
       headers: { "Content-type": "application/json" },
       body: JSON.stringify( result )
     };
   
     callback(null, response);
   
     function setDateResult(option) {
   
       var d = new Date(); // Today
       var mo; // Month
       var da; // Day
       var y; // Year
   
       switch(option) {
         case "yesterday":
           d.setDate(d.getDate() - 1);
           break;
         case "tomorrow":
           d.setDate(d.getDate() + 1);
         default:
          break;
       }
   
       mo = d.getMonth() + 1; // Months are zero offset (0-11)
       da = d.getDate();
       y = d.getFullYear();
   
       result = {
         "month": mo,
         "day": da,
         "year": y
       };
   
       return result;
     }
   };
   ```

# Étape 3 : Déploiement de la fonction Lambda mise à jour
<a name="tutorial-lambda-sam-deploy-update"></a>

 Au cours de cette étape, vous utiliserez votre mise `myDateTimeFunction.js` à jour pour mettre à jour et lancer le déploiement de votre fonction Lambda. Vous pouvez suivre la progression du déploiement dans la AWS Lambda console CodeDeploy OR. 

 La `AutoPublishAlias: live` ligne de votre AWS SAM modèle permet à votre infrastructure de détecter les mises à jour des fonctions qui utilisent l'`live`alias. Une mise à jour de votre fonction déclenche un déploiement CodeDeploy qui déplace le trafic de production de la version d'origine de la fonction vers la version mise à jour. 

 Les **sam deploy** commandes **sam package** and sont utilisées pour mettre à jour et déclencher le déploiement de votre fonction Lambda. Vous avez exécuté ces commandes dans [Package de l'application AWS SAM](tutorial-lambda-sam-package.md) et [Déployer l'application AWS SAM](tutorial-lambda-sam-deploy.md). 

**Pour déployer votre fonction Lambda mise à jour**

1.  Dans le répertoire `SAM-Tutorial`, exécutez la commande suivante. 

   ```
   sam package \
     --template-file template.yml \
     --output-template-file package.yml  \
     --s3-bucket amzn-s3-demo-bucket
   ```

    Cela crée un nouvel ensemble d'artefacts qui font référence à votre fonction Lambda mise à jour dans votre compartiment S3. 

1.  Dans le répertoire `SAM-Tutorial`, exécutez la commande suivante. 

   ```
   sam deploy \
     --template-file package.yml \
     --stack-name my-date-time-app \
     --capabilities CAPABILITY_IAM
   ```

   Comme le nom de la pile est toujours présent`my-date-time-app`, CloudFormation reconnaît qu'il s'agit d'une mise à jour de la pile. Pour afficher votre pile mise à jour, retournez à la CloudFormation console et, dans le volet de navigation, choisissez **Stacks**.

**(Facultatif) pour afficher le trafic lors d'un déploiement (CodeDeploy console)**

1. Ouvrez la CodeDeploy console à l'adresse [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/).

1.  Dans le volet de navigation, développez **Applications**, puis choisissez votre **my-date-time-app- ServerlessDeploymentApplication** application. 

1.  Dans **Groupes de déploiement**, choisissez le groupe de déploiement de votre application. Son statut doit être **En cours**. 

1.  Dans **Deployment group history (Historique des groupes de déploiement)**, choisissez le déploiement qui est en cours. 

   La barre de progression **Traffic shifting (Déplacement du trafic)** et les pourcentages affichés dans les zones **Initiale** et **Remplacement** de cette page indiquent sa progression.   
![\[La section de la CodeDeploy console consacrée à la progression du trafic.\]](http://docs.aws.amazon.com/fr_fr/codedeploy/latest/userguide/images/lambda-tutorial-codedeploy-console-20-percent-deployed.png)

**(Facultatif) pour afficher le trafic lors d'un déploiement (console Lambda)**

1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1.  Dans le volet de navigation, choisissez votre fonction `my-date-time-app-myDateTimeFunction`. Dans la console, son nom contient un identifiant. Il ressemble donc à `my-date-time-app-myDateTimeFunction-123456ABCDEF`. 

1.  Choisissez **Aliases**, puis choisissez **Live**. 

Les pondérations en regard de votre version de fonction d'origine (version 1) et de votre version de fonction mise à jour (version 2) indiquent la quantité de trafic transmise à chaque version au moment du chargement de cette page de la console AWS Lambda . La page ne met pas à jour les pondérations au fil du temps. Si vous actualisez la page une fois par minute, la pondération de la version 1 diminue de 10 % et la pondération de la version 2 augmente de 10 % jusqu'à ce que la pondération de la version 2 soit égale à 100. 

![\[La section des alias de la CodeDeploy console.\]](http://docs.aws.amazon.com/fr_fr/codedeploy/latest/userguide/images/lambda-tutorial-lambda-console-20-percent-deployed.png)


# Étape 4 : Afficher les résultats de votre déploiement
<a name="tutorial-lambda-sam-deploy-view-results"></a>

Au cours de cette étape, vous affichez les résultats de votre déploiement. Si votre déploiement réussit, vous pouvez vérifier que votre fonction Lambda mise à jour reçoit le trafic de production. Si votre déploiement échoue, vous pouvez utiliser CloudWatch les journaux pour consulter le résultat des tests de validation de la fonction Lambda exécutés pendant les accrocs du cycle de vie de votre déploiement. 

**Topics**
+ [Testez votre fonction déployée](#tutorial-lambda-sam-deploy-test-deployed-function)
+ [Afficher les événements liés aux livres dans CloudWatch Logs](#tutorial-lambda-view-hook-events)

## Testez votre fonction déployée
<a name="tutorial-lambda-sam-deploy-test-deployed-function"></a>

 La **sam deploy** commande met à jour la fonction `my-date-time-app-myDateTimeFunction` Lambda. La version de la fonction est mise à jour pour passer à 2 et ajoutée à l'alias `live`. 

**Pour voir la mise à jour dans la console Lambda**

1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1.  Dans le volet de navigation, choisissez la fonction `my-date-time-app-myDateTimeFunction`. Dans la console, son nom contient un identifiant. Il ressemble donc à `my-date-time-app-myDateTimeFunction-123456ABCDEF`. 

1.  Choisissez **Qualificateurs**, puis **Alias**. Une fois le déploiement terminé (au bout de 10 minutes environ), pour l'alias `live`, vous devriez voir **Version : 2**.  
![\[La section des alias de la CodeDeploy console.\]](http://docs.aws.amazon.com/fr_fr/codedeploy/latest/userguide/images/lambda-tutorial-function-version.png)

1.  Dans **Code de fonction**, affichez le code source de votre fonction. Vos modifications devraient apparaître. 

1.  (Facultatif) Vous pouvez utiliser les instructions de test de [Étape 2 : mise à jour de la fonction Lambda](tutorial-lambda-sam-update-function.md) pour tester votre fonction mise à jour. Créez un nouvel événement de test avec la charge utile suivante, puis confirmez que le résultat contient l'heure, la minute et la seconde actuelles. 

   ```
   {
       "option": "time"
     }
   ```

    Pour tester la fonction mise AWS CLI à jour, exécutez la commande suivante, puis ouvrez-la `out.txt` pour confirmer que le résultat contient l'heure, la minute et la seconde actuelles. 

   ```
   aws lambda invoke --function your-function-arn --payload "{\"option\": \"time\"}" out.txt 
   ```
**Note**  
 Si vous utilisez le AWS CLI pour tester votre fonction avant la fin du déploiement, vous risquez de recevoir des résultats inattendus. Cela est dû au fait que 10 % du trafic passe CodeDeploy progressivement à la version mise à jour chaque minute. Pendant le déploiement, une partie du trafic pointe toujours vers la version d'origine. `aws lambda invoke` peut donc utiliser la version d'origine. Après 10 minutes, le déploiement est terminé et tout le trafic pointe vers la nouvelle version de la fonction. 

## Afficher les événements liés aux livres dans CloudWatch Logs
<a name="tutorial-lambda-view-hook-events"></a>

 Pendant le `BeforeAllowTraffic` hook, CodeDeploy exécute votre fonction `CodeDeployHook_beforeAllowTraffic` Lambda. Pendant le `AfterAllowTraffic` hook, CodeDeploy exécute votre fonction `CodeDeployHook_afterAllowTraffic` Lambda. Chaque fonction exécute un test de validation qui appelle la version mise à jour de votre fonction à l'aide du nouveau paramètre `time`. Si la mise à jour de votre fonction Lambda est réussie, l'`time`option ne provoque pas d'erreur et la validation est réussie. Si la fonction n'a pas été mise à jour, le paramètre non reconnu entraîne une erreur et la validation échoue. Ces tests de validation sont fournis uniquement à des fins de démonstration. Vous écrivez vos propres tests pour valider votre déploiement. Vous pouvez utiliser la console CloudWatch Logs pour consulter vos tests de validation. 

**Pour consulter les événements liés à vos CodeDeploy accrochages**

1. Ouvrez la CloudWatch console à l'adresse [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1.  Dans le volet de navigation, choisissez **Logs (Journaux)**. 

1.  Dans la liste des groupes de journaux, choisissez**/aws/lambda/CodeDeployHook\$1 beforeAllowTraffic** ou**/aws/lambda/CodeDeployHook\$1 afterAllowTraffic**. 

1.  Choisissez le flux de journaux. Vous ne devriez en voir qu'un seul. 

1.  Développez les événements pour afficher leurs détails.   
![\[Le flux de journaux d'un groupe de CodeDeployHook journaux.\]](http://docs.aws.amazon.com/fr_fr/codedeploy/latest/userguide/images/lambda-tutorial-cloudwatch.png)

# Étape 5 : nettoyer
<a name="tutorial-lambda-clean-up"></a>

Pour éviter des frais supplémentaires pour les ressources que vous avez utilisées au cours de ce didacticiel, supprimez les ressources créées par votre AWS SAM modèle et les CloudWatch journaux créés par vos fonctions de validation Lambda.

**Pour supprimer votre CloudFormation pile**

1. Connectez-vous à la CloudFormation console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Dans la colonne **Piles**, choisissez votre pile `my-date-time-app`, puis choisissez **Supprimer**.

1. À l'invite, choisissez **Supprimer la pile**. Les fonctions Lambda, CodeDeploy l'application et le groupe de déploiement, ainsi que les rôles IAM créés par AWS SAM sont supprimés.

**Pour supprimer vos journaux dans CloudWatch Logs**

1. Ouvrez la CloudWatch console à l'adresse [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1.  Dans le volet de navigation, choisissez **Logs (Journaux)**. 

1.  Dans la liste des groupes de journaux, cliquez sur le bouton situé à côté de**/aws/lambda/CodeDeployHook\$1 beforeAllowTraffic**. 

1.  Dans **Actions**, choisissez **Supprimer le groupe de journaux**, puis choisissez **Oui, supprimer**. 

1.  Dans la liste des groupes de journaux, cliquez sur le bouton situé à côté de**/aws/lambda/CodeDeployHook\$1 afterAllowTraffic**. 

1.  Dans **Actions**, choisissez **Supprimer le groupe de journaux**, puis choisissez **Oui, supprimer**. 