

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Tutorial: Bereitstellen einer aktualisierten Lambda-Funktion mit CodeDeploy und dem AWS Serverless Application Model
<a name="tutorial-lambda-sam"></a>

AWS SAM ist ein Open-Source-Framework für die Erstellung serverloser Anwendungen. Es transformiert und erweitert die YAML-Syntax in einer AWS SAM Vorlage in eine CloudFormation Syntax, um serverlose Anwendungen wie eine Lambda-Funktion zu erstellen. Weitere Informationen finden Sie unter [Was ist das serverlose Anwendungsmodell? AWS](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) 

 In diesem Tutorial verwenden Sie AWS SAM, um eine Lösung zu erstellen, die Folgendes bietet: 
+  Erzeugt Ihre Lambda-Funktion. 
+  Erstellt Ihre CodeDeploy Anwendung und Bereitstellungsgruppe. 
+  Erstellt zwei Lambda-Funktionen, die Bereitstellungsvalidierungstests während CodeDeploy Lifecycle-Hooks ausführen. 
+  Erkennt, wenn Ihre Lambda-Funktion aktualisiert wird. Die Aktualisierung der Lambda-Funktion löst eine Bereitstellung aus CodeDeploy , bei der der Produktionsverkehr schrittweise von der ursprünglichen Version Ihrer Lambda-Funktion auf die aktualisierte Version verlagert wird. 

**Anmerkung**  
In diesem Tutorial müssen Sie Ressourcen erstellen, die möglicherweise Kosten für Ihr AWS -Konto verursachen. Dazu gehören mögliche Gebühren für CodeDeploy Amazon CloudWatch und AWS Lambda. Weitere Informationen finden Sie unter [CodeDeploy Preise](https://aws.amazon.com/codedeploy/pricing/), [ CloudWatch Amazon-Preise](https://aws.amazon.com/cloudwatch/pricing/) und [AWS Lambda Preise](https://aws.amazon.com/lambda/pricing/).

**Topics**
+ [Voraussetzungen](tutorial-lambda-sam-prereqs.md)
+ [Schritt 1: Richten Sie Ihre Infrastruktur ein](tutorial-lambda-sam-setup-infrastructure.md)
+ [Schritt 2: Aktualisieren Sie die Lambda-Funktion](tutorial-lambda-sam-update-function.md)
+ [Schritt 3: Stellen Sie die aktualisierte Lambda-Funktion bereit](tutorial-lambda-sam-deploy-update.md)
+ [Schritt 4: Zeigen Sie Ihre Bereitstellungsergebnisse an](tutorial-lambda-sam-deploy-view-results.md)
+ [Schritt 5: Bereinigen](tutorial-lambda-clean-up.md)

# Voraussetzungen
<a name="tutorial-lambda-sam-prereqs"></a>

Um dieses Tutorial abzuschließen, müssen Sie zunächst:
+  Führen Sie die Schritte unter [Erste Schritte mit CodeDeploy](getting-started-codedeploy.md) aus. 
+  Installieren Sie die AWS Serverless Application Model CLI. Weitere Informationen finden [Sie unter AWS SAM-CLI installieren](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). 
+  Erstellen Sie einen S3-Bucket. AWS SAM lädt die Artefakte, auf die in Ihrer [AWS SAM-Vorlage](https://docs.aws.amazon.com/en_us/codedeploy/latest/userguide/tutorial-lambda-sam-template.html) verwiesen wird, in diesen Bucket hoch. 

# Schritt 1: Richten Sie Ihre Infrastruktur ein
<a name="tutorial-lambda-sam-setup-infrastructure"></a>

 In diesem Thema erfahren Sie, wie Sie Dateien für Ihre AWS SAM Vorlage und Ihre Lambda-Funktionen erstellen. AWS SAM Anschließend verwenden Sie die `deploy` Befehle AWS SAM `package` und, um die Komponenten in Ihrer Infrastruktur zu generieren. Wenn Ihre Infrastruktur bereit ist, haben Sie eine CodeDeploy Anwendungs- und Bereitstellungsgruppe, die Lambda-Funktion zum Aktualisieren und Bereitstellen sowie zwei Lambda-Funktionen, die Validierungstests enthalten, die ausgeführt werden, wenn Sie die Lambda-Funktion bereitstellen. Wenn Sie fertig sind, können CloudFormation Sie Ihre Komponenten in der Lambda-Konsole anzeigen oder Ihre Lambda-Funktion testen. AWS CLI 

**Topics**
+ [Erstellen Sie Ihre Dateien](tutorial-lambda-create-files.md)
+ [Die AWS SAM-Anwendung verpacken](tutorial-lambda-sam-package.md)
+ [Stellen Sie die AWS SAM-Anwendung bereit](tutorial-lambda-sam-deploy.md)
+ [(Optional) inspizieren und testen Sie Ihre Infrastruktur](tutorial-lambda-sam-confirm-components.md)

# Erstellen Sie Ihre Dateien
<a name="tutorial-lambda-create-files"></a>

 Um Ihre Infrastruktur zu erstellen, müssen Sie die folgenden Dateien erstellen: 
+ `template.yml`
+ `myDateTimeFunction.js`
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`

**Topics**
+ [Erstellen Sie Ihre AWS SAM-Vorlage](tutorial-lambda-sam-template.md)
+ [Erstellen Sie eine Datei für Ihre Lambda-Funktion](tutorial-lambda-sam-create-lambda-function.md)
+ [Erstellen Sie eine Datei für Ihre BeforeAllowTraffic Lambda-Funktion](tutorial-lambda-sam-create-lambda-before-traffic.md)
+ [Erstellen Sie eine Datei für Ihre AfterAllowTraffic Lambda-Funktion](tutorial-lambda-sam-create-lambda-after-traffic.md)

# Erstellen Sie Ihre AWS SAM-Vorlage
<a name="tutorial-lambda-sam-template"></a>

Erstellen Sie eine AWS SAM-Vorlagendatei, die die Komponenten in Ihrer Infrastruktur spezifiziert.

**Um Ihre AWS SAM-Vorlage zu erstellen**

1.  Erstellen Sie ein Verzeichnis mit dem Namen `SAM-Tutorial`. 

1.  Erstellen Sie in Ihrem Verzeichnis `SAM-Tutorial` eine Datei namens `template.yml`. 

1.  Kopieren Sie den folgenden YAML-Code in `template.yml`. Dies ist Ihre AWS SAM -Vorlage. 

   ```
   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
   ```

Diese Vorlage gibt Folgendes an. Weitere Informationen finden Sie unter [AWS SAM Vorlagenkonzepte](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html).

**Eine Lambda-Funktion namens `myDateTimeFunction`**  
 Wenn diese Lambda-Funktion veröffentlicht wird, verknüpft sie die `AutoPublishAlias` Zeile in der Vorlage mit einem Alias namens`live`. Später in diesem Tutorial löst ein Update dieser Funktion eine Bereitstellung aus, bei der der Produktionsdatenverkehr schrittweise von der Originalversion auf die aktualisierte Version verlagert wird. AWS CodeDeploy 

**Zwei Validierungsfunktionen für die Lambda-Bereitstellung**  
 Die folgenden Lambda-Funktionen werden während CodeDeploy Lifecycle-Hooks ausgeführt. Die Funktionen enthalten Code, der die Bereitstellung der aktualisierten `myDateTimeFunction` validiert. Das Ergebnis der Validierungstests wird mithilfe der `PutLifecycleEventHookExecutionStatus`-API-Methode an CodeDeploy übergeben. Wenn ein Validierungstest fehlschlägt, schlägt die Bereitstellung fehl und wird zurückgesetzt.   
+  `CodeDeployHook_beforeAllowTraffic` wird während des `BeforeAllowTraffic`-Hooks ausgeführt. 
+  `CodeDeployHook_afterAllowTraffic` wird während des `AfterAllowTraffic`-Hooks ausgeführt. 
Der Name beider Funktionen beginnt mit `CodeDeployHook_`. Die `CodeDeployRoleForLambda` Rolle erlaubt Aufrufe der `invoke` Lambda-Methode nur in Lambda-Funktionen, deren Namen mit diesem Präfix beginnen. Weitere Informationen finden Sie unter [AppSpec Abschnitt „Hooks“ für eine AWS Lambda-Bereitstellung](reference-appspec-file-structure-hooks.md#appspec-hooks-lambda) und [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html) in der *CodeDeploy -API-Referenz*. 

**Automatische Erkennung einer aktualisierten Lambda-Funktion**  
 Der `AutoPublishAlias`-Begriff weist das Framework an, zu erkennen, wenn sich die `myDateTimeFunction`-Funktion ändert, und sie dann mit dem `live`-Alias bereitzustellen. 

**Eine Bereitstellungskonfiguration**  
 Die Bereitstellungskonfiguration bestimmt die Geschwindigkeit, mit der Ihre CodeDeploy Anwendung den Datenverkehr von der ursprünglichen Version der Lambda-Funktion auf die neue Version verlagert. Diese Vorlage gibt die vordefinierte Bereitstellungskonfiguration `Linear10PercentEvery1Minute` an.   
 Sie können keine benutzerdefinierte Bereitstellungskonfiguration in einer AWS SAM-Vorlage angeben. Weitere Informationen finden Sie unter [Erstellen Sie eine Bereitstellungskonfiguration mit CodeDeploy](deployment-configurations-create.md).

**Funktionen von Bereitstellungslebenszyklus-Hooks**  
 Der `Hooks`-Abschnitt gibt die Funktionen an, die während Lebenszyklusereignis-Hooks ausgeführt werden. `PreTraffic` gibt die Funktion an, die während des `BeforeAllowTraffic`-Hooks ausgeführt wird. `PostTraffic` gibt die Funktion an, die während des `AfterAllowTraffic`-Hooks ausgeführt wird. 

**Berechtigungen für Lambda zum Aufrufen einer anderen Lambda-Funktion**  
 Die angegebene `lambda:InvokeFunction` Berechtigung gewährt der von der AWS SAM-Anwendung verwendeten Rolle die Berechtigung, eine Lambda-Funktion aufzurufen. Dies ist erforderlich, wenn die `CodeDeployHook_afterAllowTraffic` Funktionen `CodeDeployHook_beforeAllowTraffic` und die bereitgestellte Lambda-Funktion während der Validierungstests aufrufen. 

# Erstellen Sie eine Datei für Ihre Lambda-Funktion
<a name="tutorial-lambda-sam-create-lambda-function"></a>

Erstellen Sie die Datei für die Funktion, die Sie später in diesem Tutorial aktualisieren und bereitstellen.

**Anmerkung**  
 Eine Lambda-Funktion kann jede Laufzeit verwenden, die von AWS Lambda unterstützt wird. Weitere Informationen finden Sie unter [AWS Lambda -Laufzeiten](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html). 

**Um Ihre Lambda-Funktion zu erstellen**

1.  Erstellen Sie eine Textdatei und speichern Sie sie als `myDateTimeFunction.js` im `SAM-Tutorial`-Verzeichnis. 

1.  Kopieren Sie den folgenden Node.js-Code in `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;
         }
       };
   ```

Die Lambda-Funktion gibt den Tag, den Monat und das Jahr für gestern, heute oder morgen zurück. Später in diesem Tutorial entfernen Sie die Kommentarzeichen von Code, der die Funktion aktualisiert, um Informationen über den Tag oder die Uhrzeit zurückzugeben, die Sie angeben (z. B. Tag, Monat und Jahr oder die aktuelle Stunde, Minute und Sekunde). Das von erstellte Framework AWS SAM erkennt die aktualisierte Version der Funktion und stellt sie bereit. 

**Anmerkung**  
 Diese Lambda-Funktion wird auch in einem AWS Cloud9 Tutorial verwendet. AWS Cloud9 ist eine cloudbasierte integrierte Entwicklungsumgebung. Informationen zum Erstellen, Ausführen, Aktualisieren und Debuggen dieser Funktion finden Sie unter [AWS Lambda Tutorial für AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/tutorial-lambda.html). AWS Cloud9

# Erstellen Sie eine Datei für Ihre BeforeAllowTraffic Lambda-Funktion
<a name="tutorial-lambda-sam-create-lambda-before-traffic"></a>

Erstellen Sie die Datei für Ihre `beforeAllowTraffic` Hook-Lambda-Funktion.

1.  Erstellen Sie eine Textdatei und speichern Sie sie als `beforeAllowTraffic.js` im `SAM-Tutorial`-Verzeichnis. 

1.  Kopieren Sie den folgenden Node.js-Code in `beforeAllowTraffic.js`. Diese Funktion wird während des `BeforeAllowTraffic`-Hooks Ihrer Bereitstellung ausgeführt. 

   ```
   '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");
       				}
       			});
       		}  
       	});
       }
   ```

# Erstellen Sie eine Datei für Ihre AfterAllowTraffic Lambda-Funktion
<a name="tutorial-lambda-sam-create-lambda-after-traffic"></a>

Erstellen Sie die Datei für Ihre `afterAllowTraffic` Hook-Lambda-Funktion.

1.  Erstellen Sie eine Textdatei und speichern Sie sie als `afterAllowTraffic.js` im `SAM-Tutorial`-Verzeichnis. 

1.  Kopieren Sie den folgenden Node.js-Code in `afterAllowTraffic.js`. Diese Funktion wird während des `AfterAllowTraffic`-Hooks Ihrer Bereitstellung ausgeführt. 

   ```
   '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");
       				}
       			});
       		}  
       	});
       }
   ```

# Die AWS SAM-Anwendung verpacken
<a name="tutorial-lambda-sam-package"></a>

 Sie sollten nun vier Dateien in Ihrem `SAM-Tutorial`-Verzeichnis haben: 
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`
+ `myDateTimeFunction.js`
+ `template.yml`

 Sie können jetzt den AWS **sam package** SAM-Befehl verwenden, um Artefakte für Ihre Lambda-Funktionen und CodeDeploy -Anwendungen zu erstellen und zu verpacken. Die Artefakte werden in einen S3-Bucket hochgeladen. Die Ausgabe des Befehls ist eine neue Datei mit dem Namen `package.yml`. Diese Datei wird im nächsten Schritt vom AWS **sam deploy** SAM-Befehl verwendet. 

**Anmerkung**  
 Weitere Informationen zu diesem **sam package** Befehl finden Sie in der [AWS SAM CLI-Befehlsreferenz](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html) im *AWS Serverless Application Model Entwicklerhandbuch*. 

 Führen Sie Folgendes im `SAM-Tutorial`-Verzeichnis aus. 

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

Geben Sie für den `s3-bucket` Parameter den Amazon S3 S3-Bucket an, den Sie als Voraussetzung für dieses Tutorial erstellt haben. Der `output-template-file` gibt den Namen der neuen Datei an, die vom AWS **sam deploy** SAM-Befehl verwendet wird.

# Stellen Sie die AWS SAM-Anwendung bereit
<a name="tutorial-lambda-sam-deploy"></a>

 Verwenden Sie den AWS **sam deploy** SAM-Befehl mit der `package.yml` Datei, um Ihre Lambda-Funktionen sowie Ihre CodeDeploy Anwendungs- und Bereitstellungsgruppe mithilfe von CloudFormation zu erstellen. 

**Anmerkung**  
Weitere Informationen zu diesem **sam deploy** Befehl finden Sie in der [AWS SAM CLI-Befehlsreferenz](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html) im *AWS Serverless Application Model Entwicklerhandbuch*. 

 Führen Sie folgenden Befehl im `SAM-Tutorial`-Verzeichnis aus. 

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

 Der `--capabilities CAPABILITY_IAM` Parameter ist erforderlich, um die Erstellung von CloudFormation IAM-Rollen zu autorisieren. 

# (Optional) inspizieren und testen Sie Ihre Infrastruktur
<a name="tutorial-lambda-sam-confirm-components"></a>

 In diesem Thema wird gezeigt, wie Sie Ihre Infrastrukturkomponenten anzeigen und Ihre Lambda-Funktion testen können. 

**So zeigen Sie das Ergebnis Ihres Stacks an, nachdem Sie `sam deploy` ausgeführt haben**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1.  Klicken Sie im Navigationsbereich auf **Stacks**. Der `my-date-time-app`-Stack wird oben angezeigt. 

1.  Wählen Sie die Registerkarte **Events (Ereignisse)** aus, um zu sehen, welche Ereignisse abgeschlossen sind. Sie können die Ereignisse während der Stack-Erstellung anzeigen. Wenn die Erstellung des Stacks abgeschlossen ist, werden alle Stack-Erstellungsereignisse angezeigt. 

1.  Klicken Sie bei ausgewähltem Stack auf **Resources (Ressourcen)**. In der Spalte **Typ** können Sie Ihre Lambda-Funktionen, `myDateTimeFunction``CodeDeployHook_beforeAllowTraffic`, und `CodeDeployHook_afterAllowTraffic` sehen. Die Spalte **Physikalische ID** jeder Ihrer Lambda-Funktionen enthält einen Link zum Anzeigen der Funktionen in der Lambda-Konsole. 
**Anmerkung**  
 Dem Namen der `myDateTimeFunction` Lambda-Funktion wird der Name des CloudFormation Stacks vorangestellt und es wird ein Bezeichner hinzugefügt, also sieht es so aus. `my-date-time-app-myDateTimeFunction-123456ABCDEF` 

1. Öffnen Sie die Konsole unter CodeDeploy . [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/)

1.  Erweitern Sie im Navigationsbereich **Deploy (Bereitstellen)** und klicken Sie danach auf **Applications (Anwendungen)**. 

1.  Sie sollten eine neue CodeDeploy Anwendung sehen, die von CloudFormation erstellt wurde und deren Name mit beginnt`my-date-time-app-ServerlessDeploymentApplication`. Wählen Sie diese Anwendung aus. 

1.  Sie sollten eine Bereitstellungsgruppe mit einem Namen sehen, der mit `my-date-time-app-myDateTimeFunctionDeploymentGroup` beginnt. Wählen Sie diese Bereitstellungsgruppe aus. 

    Unter **Bereitstellungskonfiguration** sollte Folgendes angezeigt werden **CodeDeployDefault. LambdaLinear10 PercentEvery 1 Minute.** 

**(Optional), um Ihre Funktion zu testen (Konsole)**

1. Öffnen Sie die AWS Lambda Konsole unter [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1.  Wählen Sie im Navigationsbereich Ihre `my-date-time-app-myDateTimeFunction`-Funktion aus. In der Konsole enthält der Name eine Kennung, sodass er wie `my-date-time-app-myDateTimeFunction-123456ABCDEF` aussieht. 

1.  Wählen Sie **Test** aus. 

1.  Geben Sie unter **Event name (Ereignisname)** einen Namen für Ihr Testereignis ein. 

1.  Geben Sie Folgendes für Ihr Testereignis ein und wählen Sie dann **Create (Erstellen)** aus. 

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

1.  Wählen Sie **Test** aus. Sie sollten nur Ihr Testereignis in der Liste der Testereignisse sehen. 

    Für **Execution result (Ausführungsergebnis)** sollten Sie **erfolgreich** sehen. 

1.  Erweitern Sie unter **Execution result (Ausführungsergebnis)** die Option **Details**, um die Ergebnisse anzuzeigen. Sie sollten den aktuellen Monat, Tag und das Jahr sehen. 

**(Optional), um Ihre Funktion zu testen (AWS CLI)**

1.  Suchen Sie den ARN Ihrer Lambda-Funktion. Es wird oben in der Lambda-Konsole angezeigt, wenn Sie Ihre Funktion aufrufen. 

1.  Führen Sie den folgenden Befehl aus. *your-function-arn*Ersetzen Sie durch die Funktion ARN. 

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

1.  Öffnen Sie `out.txt`, um sicherzustellen, dass das Ergebnis den aktuellen Monat, Tag und das Jahr enthält. 

# Schritt 2: Aktualisieren Sie die Lambda-Funktion
<a name="tutorial-lambda-sam-update-function"></a>

 In diesem Thema aktualisieren Sie Ihre `myDateTimeFunction.js`-Datei. Im nächsten Schritt verwenden Sie die Datei, um die aktualisierte Funktion bereitzustellen. Dies löst CodeDeploy die Bereitstellung aus, indem der Produktionsdatenverkehr von der aktuellen Version der Lambda-Funktion auf die aktualisierte Version verlagert wird. 

**Um Ihre Lambda-Funktion zu aktualisieren**

1.  Öffnen Sie `myDateTimeFunction.js`. 

1.  Entfernen Sie die beiden Kommentarmarkierungen ("`/*`" und "`*/`") und den Erläuterungstext am Anfang und am Ende des `case` mit dem Namen `time` im `switch`-Block. 

    Mit dem nicht kommentierten Code können Sie einen neuen Parameter, `time`, an die Funktion übergeben. Wenn Sie `time` an die aktualisierte Funktion übergeben, wird die aktuelle `hour`, `minute` und `second` zurückgegeben. 

1.  Speichern `myDateTimeFunction.js`. Sie sollte wie folgt aussehen: 

   ```
   '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;
     }
   };
   ```

# Schritt 3: Stellen Sie die aktualisierte Lambda-Funktion bereit
<a name="tutorial-lambda-sam-deploy-update"></a>

 In diesem Schritt verwenden Sie Ihr Update, `myDateTimeFunction.js` um Ihre Lambda-Funktion zu aktualisieren und deren Bereitstellung zu initiieren. Sie können den Bereitstellungsfortschritt in der CodeDeploy AWS Lambda OR-Konsole überwachen. 

 Die `AutoPublishAlias: live` Zeile in Ihrer AWS SAM Vorlage veranlasst Ihre Infrastruktur, Aktualisierungen von Funktionen zu erkennen, die den `live` Alias verwenden. Ein Update Ihrer Funktion löst eine Bereitstellung aus CodeDeploy , indem der Produktionsdatenverkehr von der ursprünglichen Version der Funktion auf die aktualisierte Version verlagert wird. 

 Die **sam deploy** Befehle **sam package** und werden verwendet, um die Bereitstellung Ihrer Lambda-Funktion zu aktualisieren und auszulösen. Sie haben diese Befehle in [Die AWS SAM-Anwendung verpacken](tutorial-lambda-sam-package.md) und [Stellen Sie die AWS SAM-Anwendung bereit](tutorial-lambda-sam-deploy.md) ausgeführt. 

**So stellen Sie Ihre aktualisierte Lambda-Funktion bereit**

1.  Führen Sie folgenden Befehl im `SAM-Tutorial`-Verzeichnis aus. 

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

    Dadurch wird ein neuer Satz von Artefakten erstellt, die auf Ihre aktualisierte Lambda-Funktion in Ihrem S3-Bucket verweisen. 

1.  Führen Sie folgenden Befehl im `SAM-Tutorial`-Verzeichnis aus. 

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

   Da der Stack-Name immer noch lautet, wird CloudFormation erkannt`my-date-time-app`, dass es sich um ein Stack-Update handelt. Um Ihren aktualisierten Stack anzuzeigen, kehren Sie zur CloudFormation Konsole zurück und wählen Sie im Navigationsbereich **Stacks** aus.

**(Optional), um den Datenverkehr während einer Bereitstellung anzuzeigen (CodeDeploy Konsole)**

1. Öffnen Sie die CodeDeploy Konsole unter [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/).

1.  Erweitern Sie im Navigationsbereich **Anwendungen**, und wählen Sie dann Ihre **my-date-time-appServerlessDeploymentApplicationAnwendung** aus. 

1.  Wählen Sie unter **Deployment groups (Bereitstellungsgruppen)** die Bereitstellungsgruppe Ihrer Anwendung aus. Der Status sollte **In progress (In Bearbeitung)** sein. 

1.  Wählen Sie unter **Deployment group history (Bereitstellungsgruppenverlauf)** die Bereitstellung aus, die gerade ausgeführt wird. 

   Die Fortschrittsanzeige **Traffic Shifting (Verschiebung von Datenverkehr)** und die Prozentsätze in den Feldern **Original** und **Ersatz** auf dieser Seite zeigen ihren Fortschritt an.   
![\[Der Fortschrittsbereich für die Verkehrsverlagerung in der CodeDeploy Konsole.\]](http://docs.aws.amazon.com/de_de/codedeploy/latest/userguide/images/lambda-tutorial-codedeploy-console-20-percent-deployed.png)

**(Optional) zur Anzeige des Datenverkehrs während einer Bereitstellung (Lambda-Konsole)**

1. Öffnen Sie die AWS Lambda Konsole unter. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1.  Wählen Sie im Navigationsbereich Ihre `my-date-time-app-myDateTimeFunction`-Funktion aus. In der Konsole enthält der Name eine Kennung, sodass er wie `my-date-time-app-myDateTimeFunction-123456ABCDEF` aussieht. 

1.  Wählen Sie **Aliase** und dann **Live** aus. 

Die Gewichtungen neben Ihrer ursprünglichen Funktionsversion (Version 1) und Ihrer aktualisierten Funktionsversion (Version 2) zeigen an, wie viel Datenverkehr an jede Version zum Zeitpunkt des Ladens dieser AWS Lambda -Konsolenseite geleitet wird. Die Seite aktualisiert die Gewichtungen nicht im Laufe der Zeit. Wenn Sie die Seite einmal pro Minute aktualisieren, verringert sich die Gewichtung für Version 1 um 10 Prozent und die Gewichtung für Version 2 erhöht sich um 10 Prozent, bis die Gewichtung für Version 2 100 beträgt. 

![\[Der Aliasbereich der CodeDeploy Konsole.\]](http://docs.aws.amazon.com/de_de/codedeploy/latest/userguide/images/lambda-tutorial-lambda-console-20-percent-deployed.png)


# Schritt 4: Zeigen Sie Ihre Bereitstellungsergebnisse an
<a name="tutorial-lambda-sam-deploy-view-results"></a>

In diesem Schritt zeigen Sie die Ergebnisse Ihrer Bereitstellung an. Wenn Ihre Bereitstellung erfolgreich ist, können Sie bestätigen, dass Ihre aktualisierte Lambda-Funktion Produktionsdatenverkehr empfängt. Wenn Ihre Bereitstellung fehlschlägt, können Sie mithilfe von CloudWatch Logs die Ergebnisse der Validierungstests in der Lambda-Funktion anzeigen, die während der Lifecycle-Hooks Ihrer Bereitstellung ausgeführt werden. 

**Topics**
+ [Testen Sie Ihre bereitgestellte Funktion](#tutorial-lambda-sam-deploy-test-deployed-function)
+ [Hook-Ereignisse in CloudWatch Logs anzeigen](#tutorial-lambda-view-hook-events)

## Testen Sie Ihre bereitgestellte Funktion
<a name="tutorial-lambda-sam-deploy-test-deployed-function"></a>

 Der **sam deploy** Befehl aktualisiert die `my-date-time-app-myDateTimeFunction` Lambda-Funktion. Die Funktionsversion wird auf 2 aktualisiert und dem `live`-Alias hinzugefügt. 

**Um das Update in der Lambda-Konsole zu sehen**

1. Öffnen Sie die AWS Lambda Konsole unter. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1.  Wählen Sie im Navigationsbereich die `my-date-time-app-myDateTimeFunction`-Funktion aus. In der Konsole enthält der Name eine Kennung, sodass er wie `my-date-time-app-myDateTimeFunction-123456ABCDEF` aussieht. 

1.  Wählen Sie **Qualifiers (Qualifizierer)** und dann **Aliases (Aliasse)** aus. Nachdem die Bereitstellung abgeschlossen ist (ca. 10 Minuten), sollte für den `live`-Alias **Version: 2** angezeigt werden.  
![\[Der Aliasbereich der CodeDeploy Konsole.\]](http://docs.aws.amazon.com/de_de/codedeploy/latest/userguide/images/lambda-tutorial-function-version.png)

1.  Unter **Function code (Funktionscode)** können Sie den Quellcode für Ihre Funktion anzeigen. Ihre Änderungen sollten angezeigt werden. 

1.  (Optional) Sie können die Testanweisungen in [Schritt 2: Aktualisieren Sie die Lambda-Funktion](tutorial-lambda-sam-update-function.md) verwenden, um Ihre aktualisierte Funktion zu testen. Erstellen Sie ein neues Testereignis mit der folgenden Nutzlast und stellen Sie sicher, dass das Ergebnis die aktuelle Stunde, Minute und Sekunde enthält. 

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

    Um die aktualisierte Funktion AWS CLI zu testen, führen Sie den folgenden Befehl aus und öffnen Sie ihn, `out.txt` um zu bestätigen, dass das Ergebnis die aktuelle Stunde, Minute und Sekunde enthält. 

   ```
   aws lambda invoke --function your-function-arn --payload "{\"option\": \"time\"}" out.txt 
   ```
**Anmerkung**  
 Wenn Sie den verwenden AWS CLI , um Ihre Funktion zu testen, bevor die Bereitstellung abgeschlossen ist, erhalten Sie möglicherweise unerwartete Ergebnisse. Das liegt daran, dass jede Minute 10 Prozent des Datenverkehrs CodeDeploy schrittweise auf die aktualisierte Version umgestellt werden. Während der Bereitstellung zeigt der Datenverkehr weiterhin auf die ursprüngliche Version, sodass `aws lambda invoke` möglicherweise die Originalversion verwendet. Nach 10 Minuten ist die Bereitstellung abgeschlossen und der gesamte Datenverkehr zeigt auf die neue Version der Funktion. 

## Hook-Ereignisse in CloudWatch Logs anzeigen
<a name="tutorial-lambda-view-hook-events"></a>

 CodeDeploy Führt während des `BeforeAllowTraffic` Hooks Ihre `CodeDeployHook_beforeAllowTraffic` Lambda-Funktion aus. CodeDeploy Führt während des `AfterAllowTraffic` Hooks Ihre `CodeDeployHook_afterAllowTraffic` Lambda-Funktion aus. Jede Funktion führt einen Validierungstest aus, der die aktualisierte Version Ihrer Funktion mit dem neuen `time`-Parameter aufruft. Wenn das Update Ihrer Lambda-Funktion erfolgreich ist, verursacht die `time` Option keinen Fehler und die Validierung ist erfolgreich. Wenn die Funktion nicht aktualisiert wurde, führt der nicht erkannte Parameter zu einem Fehler und die Validierung schlägt fehl. Diese Validierungstests dienen nur zu Demonstrationszwecken. Sie schreiben eigene Tests, um Ihre Bereitstellung zu validieren. Sie können die CloudWatch Logs-Konsole verwenden, um Ihre Validierungstests anzusehen. 

**Um Ihre CodeDeploy Hook-Ereignisse einzusehen**

1. Öffnen Sie die CloudWatch Konsole unter [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1.  Wählen Sie im Navigationsbereich **Logs (Protokolle)** aus. 

1.  Wählen Sie in der Liste der Protokollgruppen**/aws/lambda/CodeDeployHook\$1 beforeAllowTraffic** oder**/aws/lambda/CodeDeployHook\$1** ausafterAllowTraffic. 

1.  Wählen Sie den Protokollstream. Sie sollten nur eine sehen. 

1.  Erweitern Sie die Ereignisse, um ihre Details anzuzeigen.   
![\[Der Protokollstream einer CodeDeployHook Protokollgruppe.\]](http://docs.aws.amazon.com/de_de/codedeploy/latest/userguide/images/lambda-tutorial-cloudwatch.png)

# Schritt 5: Bereinigen
<a name="tutorial-lambda-clean-up"></a>

Um weitere Gebühren für Ressourcen zu vermeiden, die Sie in diesem Tutorial verwendet haben, löschen Sie die von Ihrer AWS SAM Vorlage erstellten Ressourcen und die von Ihren Lambda-Validierungsfunktionen erstellten CloudWatch Protokolle.

**Um Ihren Stack zu löschen CloudFormation**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie in der Spalte **Stacks** Ihren `my-date-time-app`-Stack aus und klicken Sie dann auf **Löschen**.

1. Wählen Sie bei Aufforderung **Delete stack (Stack löschen)** aus. Die Lambda-Funktionen, die CodeDeploy Anwendungs- und Bereitstellungsgruppe sowie die IAM-Rollen, die von erstellt wurden, AWS SAM werden gelöscht.

**Um Ihre Logs in Logs zu löschen CloudWatch**

1. Öffnen Sie die CloudWatch Konsole unter [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1.  Wählen Sie im Navigationsbereich **Logs (Protokolle)** aus. 

1.  Wählen Sie in der Liste der Protokollgruppen die Schaltfläche neben**/aws/lambda/CodeDeployHook\$1** ausbeforeAllowTraffic. 

1.  Wählen Sie unter **Actions (Aktionen)** die Option **Delete log group (Protokollgruppe löschen)** und dann **Yes, Delete (Ja, löschen)** aus. 

1.  Wählen Sie in der Liste der Protokollgruppen die Schaltfläche neben**/aws/lambda/CodeDeployHook\$1** ausafterAllowTraffic. 

1.  Wählen Sie unter **Actions (Aktionen)** die Option **Delete log group (Protokollgruppe löschen)** und dann **Yes, Delete (Ja, löschen)** aus. 