Instrumentieren von Python-Code in AWS Lambda - AWS Lambda

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.

Instrumentieren von Python-Code in AWS Lambda

Lambda ist mit AWS X-Ray integriert, um Ihnen zu helfen, Lambda-Anwendungen zu verfolgen, zu debuggen und zu optimieren. Sie können mit X-Ray eine Anforderung verfolgen, während sie Ressourcen in Ihrer Anwendung durchläuft, die Lambda-Funktionen und andere AWS-Services enthalten können.

Um Protokollierungsdaten an X-Ray zu senden, können Sie eine von drei SDK-Bibliotheken verwenden:

Jedes der SDKs bietet Möglichkeiten, Ihre Telemetriedaten an den X-Ray Service zu senden. Sie können dann mit X-Ray die Leistungsmetriken Ihrer Anwendung anzeigen, filtern und erhalten, um Probleme und Möglichkeiten zur Optimierung zu identifizieren.

Wichtig

X-Ray und Powertools für AWS Lambda-SDKs sind Teil einer eng integrierten Instrumentierungslösung von AWS. Die ADOT Lambda Layers sind Teil eines branchenweiten Standards für die Verfolgung von Instrumenten, die im Allgemeinen mehr Daten erfassen, aber möglicherweise nicht für alle Anwendungsfälle geeignet sind. Sie können die end-to-end Nachverfolgung in X-Ray mit einer der beiden Lösungen implementieren. Weitere Informationen zur Auswahl zwischen ihnen finden Sie unter Auswählen zwischen der AWS-Distro für Open Telemetry und X-Ray-SDKs.

Verwenden von Powertools für AWS Lambda (Python) und AWS SAM für die Nachverfolgung

Führen Sie die nachstehenden Schritte aus, um eine Hello-World-Beispielanwendung für Python mit integrierten Modulen von Powertools for AWS Lambda (Python) unter Verwendung von AWS SAM bereitzustellen. Diese Anwendung implementiert ein grundlegendes API-Backend und verwendet Powertools zum Ausgeben von Protokollen, Metriken und Traces. Es besteht aus einem Amazon-API-Gateway-Endpunkt und einer Lambda-Funktion. Wenn Sie eine GET-Anforderung an den API Gateway-Endpunkt senden, ruft die Lambda-Funktion auf, sendet Protokolle und Metriken im Embedded Metric Format an CloudWatchund sendet Ablaufverfolgungen an AWS X-Ray. Die Funktion gibt eine Hello-World-Nachricht zurück.

Voraussetzungen

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Bereitstellen einer AWS SAM-Beispielanwendung
  1. Initialisieren Sie die Anwendung mit der Hello World Python-Vorlage.

    sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.9 --no-tracing
  2. Entwickeln Sie die App.

    cd sam-app && sam build
  3. Stellen Sie die Anwendung bereit.

    sam deploy --guided
  4. Folgen Sie den Anweisungen auf dem Bildschirm. Um die im interaktiven Erlebnis bereitgestellten Standardoptionen zu akzeptieren, drücken Sie Enter.

    Anmerkung

    Für HelloWorldFunction ist möglicherweise keine Autorisierung definiert. Ist das in Ordnung?, stellen Sie sicher, dass Sie eingebeny.

  5. Rufen Sie die URL der bereitgestellten Anwendung ab:

    aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
  6. Rufen Sie den API-Endpunkt auf:

    curl -X GET <URL_FROM_PREVIOUS_STEP>

    Wenn der Link erfolgreich ausgeführt wurde, sehen Sie die folgende Antwort:

    {"message":"hello world"}
  7. Führen Sie sam traces aus, um die Traces für die Funktion zu erhalten.

    sam traces

    Das Nachverfolgungsergebnis sieht folgendermaßen aus:

    New XRay Service Graph Start time: 2023-02-03 14:59:50+00:00 End time: 2023-02-03 14:59:50+00:00 Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.924 Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.016 Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0] Summary_statistics: - total requests: 0 - ok count(2XX): 0 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0 XRay Event [revision 1] at (2023-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s) - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200] - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j - 0.739s - Initialization - 0.016s - Invocation - 0.013s - ## lambda_handler - 0.000s - ## app.hello - 0.000s - Overhead
  8. Dies ist ein öffentlicher API-Endpunkt, der über das Internet zugänglich ist. Es wird empfohlen, dass Sie den Endpunkt nach dem Testen löschen.

    sam delete

X-Ray verfolgt nicht alle Anfragen an Ihre Anwendung nach. X-Ray wendet einen Sampling-Algorithmus an, um sicherzustellen, dass die Nachverfolgung effizient ist, und stellt dennoch ein repräsentatives Beispiel aller Anfragen bereit. Die Samplingrate beträgt 1 Anforderung pro Sekunde und 5 Prozent aller weiteren Anforderungen.

Anmerkung

Sie können die X-Ray-Samplingrate nicht für Ihre Funktionen konfigurieren.

Verwenden von Powertools für AWS Lambda (Python) und AWS CDK für die Nachverfolgung

Führen Sie die nachstehenden Schritte aus, um eine Hello-World-Beispielanwendung für Python mit integrierten Modulen von Powertools for AWS Lambda (Python) unter Verwendung von AWS CDK bereitzustellen. Diese Anwendung implementiert ein grundlegendes API-Backend und verwendet Powertools zum Ausgeben von Protokollen, Metriken und Traces. Es besteht aus einem Amazon-API-Gateway-Endpunkt und einer Lambda-Funktion. Wenn Sie eine GET-Anforderung an den API Gateway-Endpunkt senden, ruft die Lambda-Funktion auf, sendet Protokolle und Metriken im Embedded Metric Format an CloudWatchund sendet Ablaufverfolgungen an AWS X-Ray. Die Funktion gibt eine Hello-World-Nachricht zurück.

Voraussetzungen

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Bereitstellen einer AWS CDK-Beispielanwendung
  1. Erstellen Sie ein Projektverzeichnis für Ihre neue Anwendung.

    mkdir hello-world cd hello-world
  2. Initialisieren Sie die App.

    cdk init app --language python
  3. Installieren Sie die Python-Abhängigkeiten.

    pip install -r requirements.txt
  4. Erstellen Sie ein Verzeichnis lambda_function unter dem Stammordner.

    mkdir lambda_function cd lambda_function
  5. Erstellen Sie eine Datei namens app.py und fügen Sie den folgenden Code zur Datei hinzu. Dies ist der Code für die Lambda-Funktion.

    from aws_lambda_powertools.event_handler import APIGatewayRestResolver from aws_lambda_powertools.utilities.typing import LambdaContext from aws_lambda_powertools.logging import correlation_paths from aws_lambda_powertools import Logger from aws_lambda_powertools import Tracer from aws_lambda_powertools import Metrics from aws_lambda_powertools.metrics import MetricUnit app = APIGatewayRestResolver() tracer = Tracer() logger = Logger() metrics = Metrics(namespace="PowertoolsSample") @app.get("/hello") @tracer.capture_method def hello(): # adding custom metrics # See: https://docs.powertools.aws.dev/lambda-python/latest/core/metrics/ metrics.add_metric(name="HelloWorldInvocations", unit=MetricUnit.Count, value=1) # structured log # See: https://docs.powertools.aws.dev/lambda-python/latest/core/logger/ logger.info("Hello world API - HTTP 200") return {"message": "hello world"} # Enrich logging with contextual information from Lambda @logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST) # Adding tracer # See: https://docs.powertools.aws.dev/lambda-python/latest/core/tracer/ @tracer.capture_lambda_handler # ensures metrics are flushed upon request completion/failure and capturing ColdStart metric @metrics.log_metrics(capture_cold_start_metric=True) def lambda_handler(event: dict, context: LambdaContext) -> dict: return app.resolve(event, context)
  6. Öffnen Sie das Verzeichnis hello_world. Sie sollten eine Datei mit dem Namen hello_world_stack.py sehen.

    cd .. cd hello_world
  7. Öffnen Sie hello_world_stack.py und fügen Sie den folgenden Code in die Datei ein. Dies enthält den Lambda Constructor , der die Lambda-Funktion erstellt, Umgebungsvariablen für Powertools konfiguriert und die Protokollaufbewahrung auf eine Woche festlegt, und den ApiGatewayv1 Constructor , der die REST-API erstellt.

    from aws_cdk import ( Stack, aws_apigateway as apigwv1, aws_lambda as lambda_, CfnOutput, Duration ) from constructs import Construct class HelloWorldStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Powertools Lambda Layer powertools_layer = lambda_.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", # At the moment we wrote this example, the aws_lambda_python_alpha CDK constructor is in Alpha, o we use layer to make the example simpler # See https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_lambda_python_alpha/README.html # Check all Powertools layers versions here: https://docs.powertools.aws.dev/lambda-python/latest/#lambda-layer layer_version_arn=f"arn:aws:lambda:{self.region}:017000801446:layer:AWSLambdaPowertoolsPythonV2:21" ) function = lambda_.Function(self, 'sample-app-lambda', runtime=lambda_.Runtime.PYTHON_3_9, layers=[powertools_layer], code = lambda_.Code.from_asset("./lambda_function/"), handler="app.lambda_handler", memory_size=128, timeout=Duration.seconds(3), architecture=lambda_.Architecture.X86_64, environment={ "POWERTOOLS_SERVICE_NAME": "PowertoolsHelloWorld", "POWERTOOLS_METRICS_NAMESPACE": "PowertoolsSample", "LOG_LEVEL": "INFO" } ) apigw = apigwv1.RestApi(self, "PowertoolsAPI", deploy_options=apigwv1.StageOptions(stage_name="dev")) hello_api = apigw.root.add_resource("hello") hello_api.add_method("GET", apigwv1.LambdaIntegration(function, proxy=True)) CfnOutput(self, "apiUrl", value=f"{apigw.url}hello")
  8. Stellen Sie die Anwendung bereit.

    cd .. cdk deploy
  9. Rufen Sie die URL der bereitgestellten Anwendung ab:

    aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?OutputKey==`apiUrl`].OutputValue' --output text
  10. Rufen Sie den API-Endpunkt auf:

    curl -X GET <URL_FROM_PREVIOUS_STEP>

    Wenn der Link erfolgreich ausgeführt wurde, sehen Sie die folgende Antwort:

    {"message":"hello world"}
  11. Führen Sie sam traces aus, um die Traces für die Funktion zu erhalten.

    sam traces

    Das Nachverfolgungsergebnis sieht folgendermaßen aus:

    New XRay Service Graph Start time: 2023-02-03 14:59:50+00:00 End time: 2023-02-03 14:59:50+00:00 Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.924 Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [] Summary_statistics: - total requests: 1 - ok count(2XX): 1 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0.016 Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0] Summary_statistics: - total requests: 0 - ok count(2XX): 0 - error count(4XX): 0 - fault count(5XX): 0 - total response time: 0 XRay Event [revision 1] at (2023-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s) - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200] - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j - 0.739s - Initialization - 0.016s - Invocation - 0.013s - ## lambda_handler - 0.000s - ## app.hello - 0.000s - Overhead
  12. Dies ist ein öffentlicher API-Endpunkt, der über das Internet zugänglich ist. Es wird empfohlen, dass Sie den Endpunkt nach dem Testen löschen.

    cdk destroy

Verwenden von ADOT zum Instrumentieren Ihrer Python-Funktionen

ADOT bietet vollständig verwaltete Lambda-Ebenen, die alles packen, was Sie zum Sammeln von Telemetriedaten mit dem OTel-SDK benötigen. Indem Sie diese Ebene verwenden, können Sie Ihre Lambda-Funktionen instrumentieren, ohne einen Funktionscode ändern zu müssen. Sie können Ihren Ebenen auch für die benutzerdefinierte Initialisierung von OTel konfigurieren. Weitere Informationen finden Sie unter Benutzerdefinierte Konfiguration für den ADOT Collector auf Lambda in der ADOT-Dokumentation.

Für Python-Laufzeiten können Sie den AWS-verwaltete Lambda-Layer für ADOT Python hinzufügen, um Ihre Funktionen automatisch zu instrumentieren. Dieser Layer funktioniert sowohl für arm64- als auch für x86_64-Architekturen. Ausführliche Anweisungen zum Hinzufügen dieser Ebene finden Sie unter AWS Distro for OpenTelemetry Lambda Support for Python in der ADOT-Dokumentation.

Verwenden des X-Ray-SDK zum Instrumentieren Ihrer Python-Funktionen

Um Details zu Aufrufen aufzuzeichnen, die Ihre Lambda-Funktion an andere Ressourcen in Ihrer Anwendung vornimmt, können Sie auch AWS X-Ray-SDK for Python verwenden. Um das SDK zu erhalten, fügen Sie das aws-xray-sdk-Paket den Abhängigkeiten Ihrer Anwendung hinzu.

Beispiel requirements.txt
jsonpickle==1.3 aws-xray-sdk==2.4.3

In Ihrem Funktionscode können Sie AWS-SDK-Clients durch Patchen der boto3-Bibliothek mit dem aws_xray_sdk.core-Modul instrumentieren.

Beispiel Funktion – Nachverfolgen eines AWS-SDK-Clients
import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all logger = logging.getLogger() logger.setLevel(logging.INFO) patch_all() client = boto3.client('lambda') client.get_account_settings() def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ))) ...

Aktivieren Sie nach Hinzufügen der richtigen Abhängigkeiten die Nachverfolgung in der Konfiguration Ihrer Funktion über die Lambda-Konsole oder die API.

Aktivieren der Nachverfolgung mit der Lambda-Konsole

Gehen Sie folgendermaßen vor, um die aktive Nachverfolgung Ihrer Lambda-Funktion mit der Konsole umzuschalten:

So aktivieren Sie die aktive Nachverfolgung
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie eine Funktion aus.

  3. Wählen Sie Configuration (Konfiguration) und dann Monitoring and operations tools (Überwachungs- und Produktionstools).

  4. Wählen Sie Bearbeiten aus.

  5. Schalten Sie unter X-Ray Active tracing (Aktive Nachverfolgung) ein.

  6. Wählen Sie Speichern.

Aktivieren der Nachverfolgung mit der Lambda-API

Konfigurieren Sie die Nachverfolgung für Ihre Lambda-Funktion mit der AWS CLI oder dem AWS-SDK. Verwenden Sie die folgenden API-Operationen:

Der folgende AWS CLI-Beispielbefehl aktiviert die aktive Nachverfolgung für eine Funktion mit dem Namen my-function.

aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

Der Ablaufverfolgungsmodus ist Teil der versionsspezifischen Konfiguration, wenn Sie eine Version Ihrer Funktion veröffentlichen. Sie können den Ablaufverfolgungsmodus für eine veröffentlichte Version nicht ändern.

Aktivieren von Nachverfolgungen mit AWS CloudFormation

Verwenden Sie die AWS::Lambda::Function-Eigenschaft, um die Nachverfolgung für eine AWS CloudFormation-Ressource in einer TracingConfig-Vorlage zu aktivieren.

Beispiel function-inline.yml – Ablaufverfolgungskonfiguration
Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

Verwenden Sie für eine AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function-Ressource die Eigenschaft Tracing.

Beispiel template.yml – Ablaufverfolgungskonfiguration
Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

Interpretieren einer X-Ray-Nachverfolgung

Ihre Funktion benötigt die Berechtigung zum Hochladen von Trace-Daten zu X-Ray. Wenn Sie die aktive Nachverfolgung in der Lambda-Konsole aktivieren, fügt Lambda der Ausführungsrolle Ihrer Funktion die erforderlichen Berechtigungen hinzu. Andernfalls fügen Sie die AWSXRayDaemonWriteAccess Richtlinie zur Ausführungsrolle hinzu.

Nachdem Sie die aktive Nachverfolgung konfiguriert haben, können Sie bestimmte Anfragen über Ihre Anwendung beobachten. Das X-Ray-Service-Diagramm zeigt Informationen über Ihre Anwendung und alle ihre Komponenten an. Das folgende Beispiel aus der Beispielanwendung für Fehlerprozessor zeigt eine Anwendung mit zwei Funktionen. Die primäre Funktion verarbeitet Ereignisse und gibt manchmal Fehler zurück. Die zweite Funktion ganz oben verarbeitet Fehler, die in der Protokollgruppe der ersten angezeigt werden, und verwendet das AWS SDK, um X-Ray, Amazon Simple Storage Service (Amazon S3) und Amazon CloudWatch Logs aufzurufen.


        Ein Diagramm, das zwei separate Anwendungen und ihre jeweiligen Service-Maps in X-Ray zeigt

X-Ray verfolgt nicht alle Anfragen an Ihre Anwendung nach. X-Ray wendet einen Sampling-Algorithmus an, um sicherzustellen, dass die Nachverfolgung effizient ist, und stellt dennoch ein repräsentatives Beispiel aller Anfragen bereit. Die Samplingrate beträgt 1 Anforderung pro Sekunde und 5 Prozent aller weiteren Anforderungen.

Anmerkung

Sie können die X-Ray-Samplingrate nicht für Ihre Funktionen konfigurieren.

Bei aktivierter Nachverfolgung zeichnet Lambda 2 Segmente auf, wodurch zwei Knoten im Servicediagramm erstellt werden. Die folgende Abbildung hebt die diese zwei Knoten für die primäre Funktion aus der Beispielanwendung des Fehlerprozessors hervor.


      Eine X-Ray-Servicekarte mit einer einzigen Funktion.

Der erste Knoten auf der linken Seite stellt den Lambda-Service dar, der die Aufrufanforderung empfängt. Der zweite Knoten stellt Ihre spezifische Lambda-Funktion dar. Das folgende Beispiel zeigt eine Nachverfolgung mit diesen zwei Segmenten. Beide heißen my-function, aber einer hat einen Ursprung von AWS::Lambda und der andere hat den Ursprung AWS::Lambda::Function.


        Eine X-Ray-Nachverfolgung, die die Latenz in jedem Teilsegment eines bestimmten Lambda-Aufrufs anzeigt.

Dieses Beispiel erweitert das Funktionssegment, um seine drei Untersegmente anzuzeigen:

  • Initialisierung – Stellt die Zeit dar, die für das Laden Ihrer Funktion und das Ausführen des Initialisierungscodes aufgewendet wurde. Dieses Untersegment erscheint nur für das erste Ereignis, das jede Instance Ihrer Funktion verarbeitet.

  • Invocation (Aufruf) – Stellt die Zeit dar, die beim Ausführen Ihres Handler-Codes vergeht.

  • Overhead (Aufwand) – Stellt die Zeit dar, die von der Lambda-Laufzeitumgebung bei der Verarbeitung des nächsten Ereignisses verbraucht wird.

Sie können auch HTTP-Clients instrumentieren, SQL-Abfragen aufzeichnen und benutzerdefinierte Untersegmente mit Anmerkungen und Metadaten erstellen. Weitere Informationen finden Sie unter AWS X-Ray-SDK for Python im AWS X-Ray-Entwicklerhandbuch.

Preisgestaltung

Sie können X-Ray-Nachverfolgung jeden Monat bis zu einem bestimmten Limit als Teil des AWS kostenlosen Kontingents kostenlos nutzen. Über den Schwellenwert hinaus berechnet X-Ray Gebühren für die Speicherung und den Abruf der Nachverfolgung. Weitere Informationen finden Sie unter AWS X-Ray Preise.

Laufzeitabhängigkeiten in einer Ebene speichern (X-Ray-SDK)

Wenn Sie das X-Ray-SDK verwenden, um mit AWS-SDK-Clients Ihren Funktionscode zu instrumentieren, kann Ihr Bereitstellungspaket ziemlich groß werden. Um Laufzeitabhängigkeiten bei jeder Aktualisierung des Funktionscodes zu vermeiden, verpacken Sie das X-Ray-SDK in einer Lambda-Ebene.

Das folgende Beispiel zeigt eine AWS::Serverless::LayerVersion-Ressource, die das AWS X-Ray-SDK for Python speichert.

Beispiel template.yml – Abhängigkeitenebene
Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-python-lib Description: Dependencies for the blank-python sample app. ContentUri: package/. CompatibleRuntimes: - python3.8

Bei dieser Konfiguration aktualisieren Sie die Bibliotheksebene nur, wenn Sie Ihre Laufzeitabhängigkeiten ändern. Da das Funktionsbereitstellungspaket nur Ihren Code enthält, kann dies dazu beitragen, die Upload-Zeiten zu reduzieren.

Das Erstellen einer Ebene für Abhängigkeiten erfordert Build-Konfigurationsänderungen, um das Ebenen-Archiv vor der Bereitstellung zu generieren. Ein funktionierendes Beispiel finden Sie in der Beispielanwendung blank-python .