Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Registra e monitora le funzioni Lambda di Python
AWS Lambda monitora automaticamente le funzioni Lambda e invia le voci di registro ad Amazon. CloudWatch La funzione Lambda include un gruppo di log CloudWatch Logs e un flusso di log per ogni istanza della funzione. L’ambiente di runtime di Lambda invia al flusso di log i dettagli su ogni invocazione e altri output dal codice della funzione. Per ulteriori informazioni sui CloudWatch registri, consulta. Utilizzo dei CloudWatch log di log con Lambda
Per l’output dei log dal codice della funzione, puoi utilizzare il modulo di logging
stdout
o stderr
.
Stampa nel log
Per inviare l'output base ai log, puoi utilizzare un metodo print
nella funzione. L'esempio seguente registra i valori del gruppo e del flusso di log CloudWatch Logs e dell'oggetto evento.
Nota che se la tua funzione genera log usando istruzioni Pythonprint
, Lambda può inviare output di log a Logs solo in formato testo semplice. CloudWatch Per acquisire i log in modo strutturatoJSON, è necessario utilizzare una libreria di registrazione supportata. Per ulteriori informazioni, consulta Utilizzo dei controlli di registrazione avanzati di Lambda con Python.
Esempio lambda_function.py
import os def lambda_handler(event, context): print('## ENVIRONMENT VARIABLES') print(os.environ['AWS_LAMBDA_LOG_GROUP_NAME']) print(os.environ['AWS_LAMBDA_LOG_STREAM_NAME']) print('## EVENT') print(event)
Esempio Output log
START RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Version: $LATEST
## ENVIRONMENT VARIABLES
/aws/lambda/my-function
2023/08/31/[$LATEST]3893xmpl7fac4485b47bb75b671a283c
## EVENT
{'key': 'value'}
END RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95
REPORT RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Duration: 15.74 ms Billed Duration: 16 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 130.49 ms
XRAY TraceId: 1-5e34a614-10bdxmplf1fb44f07bc535a1 SegmentId: 07f5xmpl2d1f6f85 Sampled: true
Il runtime di Python registra START
, END
e REPORT
per ogni chiamata. La riga REPORT
include i seguenti dati:
REPORTcampi di dati di linea
-
RequestId— L'ID univoco della richiesta per la chiamata.
-
Durata – La quantità di tempo che il metodo del gestore della funzione impiega durante l'elaborazione dell'evento.
-
Durata fatturata – La quantità di tempo fatturata per la chiamata.
-
Dimensioni memoria – La quantità di memoria allocata per la funzione.
-
Quantità max utilizzata – La quantità di memoria utilizzata dalla funzione. Quando le chiamate condividono un ambiente di esecuzione, Lambda riporta la memoria massima utilizzata in tutte le chiamate. Questo comportamento potrebbe comportare un valore riportato superiore al previsto.
-
Durata Init – Per la prima richiesta servita, la quantità di tempo impiegato dal runtime per caricare la funzione ed eseguire il codice al di fuori del metodo del gestore.
-
XRAY TraceId— Per le richieste tracciate, l'ID di AWS X-Ray traccia.
-
SegmentId— Per le richieste tracciate, l'ID del segmento X-Ray.
-
Campionato – Per le richieste tracciate, il risultato del campionamento.
Utilizzo di una libreria di log
Per registri più dettagliati, utilizza il modulo di logstdout
o stderr
.
Per i runtime Python supportati, puoi scegliere se i log creati utilizzando il logging
modulo standard vengono acquisiti in testo semplice o. JSON Per ulteriori informazioni, consulta Utilizzo dei controlli di registrazione avanzati di Lambda con Python.
Attualmente, il formato di log predefinito per tutti i runtime di Python è il testo normale. L'esempio seguente mostra come gli output di registro creati utilizzando il logging
modulo standard vengono acquisiti in testo semplice in Logs. CloudWatch
import os import logging logger = logging.getLogger() logger.setLevel("INFO") def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES') logger.info(os.environ['AWS_LAMBDA_LOG_GROUP_NAME']) logger.info(os.environ['AWS_LAMBDA_LOG_STREAM_NAME']) logger.info('## EVENT') logger.info(event)
L'output di logger
include il livello del log, il timestamp e l'ID della richiesta.
START RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Version: $LATEST
[INFO] 2023-08-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 ## ENVIRONMENT VARIABLES
[INFO] 2023-08-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 /aws/lambda/my-function
[INFO] 2023-08-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 2023/01/31/[$LATEST]1bbe51xmplb34a2788dbaa7433b0aa4d
[INFO] 2023-08-31T22:12:58.535Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 ## EVENT
[INFO] 2023-08-31T22:12:58.535Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 {'key': 'value'}
END RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125
REPORT RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Duration: 2.75 ms Billed Duration: 3 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 113.51 ms
XRAY TraceId: 1-5e34a66a-474xmpl7c2534a87870b4370 SegmentId: 073cxmpl3e442861 Sampled: true
Nota
Quando il formato di registro della funzione è impostato su testo semplice, l'impostazione predefinita a livello di registro per i runtime di Python è. WARN Ciò significa che Lambda invia solo output di log di livello o inferiore a WARN Logs. CloudWatch Per modificare il livello di log predefinito, utilizza il metodo logging
setLevel()
di Python come mostrato in questo codice di esempio. Se imposti il formato di registro della funzione suJSON, ti consigliamo di configurare il livello di registro della funzione utilizzando Lambda Advanced Logging Controls e non impostando il livello di log nel codice. Per ulteriori informazioni, consulta Utilizzo del filtraggio a livello di log con Python
Utilizzo dei controlli di registrazione avanzati di Lambda con Python
Per avere un maggiore controllo sul modo in cui i log delle tue funzioni vengono acquisiti, elaborati e utilizzati, puoi configurare le seguenti opzioni di registrazione per i runtime Python di Lambda supportati:
-
Formato di registro: scegli tra testo semplice e JSON formato strutturato per i log della tua funzione
-
Livello di log: per i log in JSON formato, scegli il livello di dettaglio dei log che Lambda invia ad Amazon CloudWatch, ad esempio, ERROR DEBUG INFO
-
Gruppo di log: scegli il gruppo di CloudWatch log a cui la funzione invia i log
Per ulteriori informazioni su queste opzioni di registrazione e istruzioni su come configurare la funzione per utilizzarle, consulta la pagina Configurazione dei controlli di registrazione avanzati per le funzioni Lambda.
Per ulteriori informazioni sull'utilizzo delle opzioni di formato e livello di log con le funzioni Lambda in Python, consulta le istruzioni nelle sezioni seguenti.
Usare JSON log strutturati con Python
Se si seleziona JSON il formato di log della funzione, Lambda invierà i log generati dalla libreria di registrazione standard Python a come strutturato. CloudWatch JSON Ogni oggetto di JSON registro contiene almeno quattro coppie di valori chiave con le seguenti chiavi:
-
"timestamp"
: l'ora in cui è stato generato il messaggio di log -
"level"
: il livello di log assegnato al messaggio -
"message"
: il contenuto del messaggio di log -
"requestId"
: l'ID di richiesta univoco dell'invocazione alla funzione
La logging
libreria Python può anche aggiungere coppie chiave-valore aggiuntive come questo "logger"
JSON oggetto.
Gli esempi nelle sezioni seguenti mostrano come gli output di log generati utilizzando la libreria logging
Python vengono acquisiti CloudWatch in Logs quando si configura il formato di log della funzione come. JSON
Nota che se usi il print
metodo per produrre output di log di base come descritto inStampa nel log, Lambda acquisirà questi output come testo semplice, anche se configuri il formato di registrazione della funzione come. JSON
Output di JSON log standard che utilizzano la libreria di registrazione Python
Il seguente frammento di codice e l'output di log mostrano come gli output di log standard generati utilizzando la logging
libreria Python vengono acquisiti in CloudWatch Logs quando il formato di log della funzione è impostato su. JSON
Esempio Codice di registrazione di Python
import logging logger = logging.getLogger() def lambda_handler(event, context): logger.info("Inside the handler function")
Esempio JSONrecord di registro
{ "timestamp":"2023-10-27T19:17:45.586Z", "level":"INFO", "message":"Inside the handler function", "logger": "root", "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189" }
Registrazione di parametri aggiuntivi JSON
Quando il formato di log della funzione è impostato suJSON, puoi anche registrare parametri aggiuntivi con la logging
libreria Python standard usando la extra
parola chiave per passare un dizionario Python all'output del log.
Esempio Codice di registrazione di Python
import logging def lambda_handler(event, context): logging.info( "extra parameters example", extra={"a":"b", "b": [3]}, )
Esempio JSONrecord di registro
{ "timestamp": "2023-11-02T15:26:28Z", "level": "INFO", "message": "extra parameters example", "logger": "root", "requestId": "3dbd5759-65f6-45f8-8d7d-5bdc79a3bd01", "a": "b", "b": [ 3 ] }
Registrazione delle eccezioni in JSON
Il seguente frammento di codice mostra come le eccezioni Python vengono acquisite nell'output di registro della funzione quando si configura il formato di registro come. JSON Si noti che agli output di registro generati utilizzando viene assegnato il livello di logging.exception
registro. ERROR
Esempio Codice di registrazione di Python
import logging def lambda_handler(event, context): try: raise Exception("exception") except: logging.exception("msg")
Esempio JSONrecord di registro
{ "timestamp": "2023-11-02T16:18:57Z", "level": "ERROR", "message": "msg", "logger": "root", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 15, in lambda_handler\n raise Exception(\"exception\")\n" ], "errorType": "Exception", "errorMessage": "exception", "requestId": "3f9d155c-0f09-46b7-bdf1-e91dab220855", "location": "/var/task/lambda_function.py:lambda_handler:17" }
JSONregistri strutturati con altri strumenti di registrazione
Se il codice utilizza già un'altra libreria di registrazione, come Powertools for AWS Lambda, per produrre log JSON strutturati, non è necessario apportare alcuna modifica. AWS Lambda non codifica due volte i log già codificati. JSON Anche se si configura la funzione per utilizzare il formato di JSON registro, i risultati di registrazione vengono visualizzati nella CloudWatch struttura definita. JSON
L'esempio seguente mostra come gli output di log generati utilizzando il AWS Lambda pacchetto Powertools for vengono acquisiti in Logs. CloudWatch Il formato di questo output di registro è lo stesso indipendentemente dal fatto che la configurazione di registrazione della funzione sia impostata su o. JSON TEXT Per ulteriori informazioni sull'utilizzo di Powertools per AWS Lambda, vedere e Utilizzo di Powertools per AWS Lambda (Python) AWS SAM e per la registrazione strutturata Utilizzo di Powertools per AWS Lambda (Python) AWS CDK e per la registrazione strutturata
Esempio Frammento di codice di registrazione Python (usando Powertools for) AWS Lambda
from aws_lambda_powertools import Logger logger = Logger() def lambda_handler(event, context): logger.info("Inside the handler function")
Esempio JSONrecord di registro (usando Powertools per) AWS Lambda
{ "level": "INFO", "location": "lambda_handler:7", "message": "Inside the handler function", "timestamp": "2023-10-31 22:38:21,010+0000", "service": "service_undefined", "xray_trace_id": "1-654181dc-65c15d6b0fecbdd1531ecb30" }
Utilizzo del filtraggio a livello di log con Python
Configurando il filtraggio a livello di registro, è possibile scegliere di inviare solo i registri di un determinato livello di registrazione o inferiore a Logs. CloudWatch Per informazioni su come configurare il filtraggio a livello di log della funzione, consulta la pagina Filtraggio a livello di log.
Per AWS Lambda filtrare i log delle applicazioni in base al relativo livello di registro, la funzione deve utilizzare log formattati. JSON Puoi farlo in due modi:
-
Crea output di log usando la libreria
logging
Python standard e configura la tua funzione per JSON utilizzare la formattazione dei log. AWS Lambda quindi filtra gli output di log utilizzando la coppia chiave-valore «level» nell'JSONoggetto descritto in. Usare JSON log strutturati con Python Per informazioni su come configurare il formato di log della funzione, consulta la pagina Configurazione dei controlli di registrazione avanzati per le funzioni Lambda. -
Utilizzate un'altra libreria o metodo di registrazione per creare log JSON strutturati nel codice che includono una coppia chiave-valore «level» che definisce il livello dell'output del log. Ad esempio, puoi usare Powertools per generare output AWS Lambda di log JSON strutturati dal tuo codice.
È inoltre possibile utilizzare un'istruzione print per generare un JSON oggetto contenente un identificatore a livello di registro. La seguente istruzione print produce un output JSON formattato in cui è impostato il livello di registro. INFO AWS Lambda invierà l'JSONoggetto a CloudWatch Logs se il livello di registrazione della funzione è impostato suINFO, DEBUG o. TRACE
print('{"msg":"My log message", "level":"info"}')
Affinché Lambda filtri i log della tua funzione, devi includere anche una coppia di valori "timestamp"
chiave nell'output del log. JSON L'ora deve essere specificata in un formato timestamp RFC3339
Visualizzazione dei log nella console di Lambda
È possibile utilizzare la console Lambda per visualizzare l'output del log dopo aver richiamato una funzione Lambda.
Se il codice può essere testato dall'editor del codice incorporato, troverai i log nei risultati dell’esecuzione. Quando utilizzi la funzionalità di test della console per richiamare una funzione, troverai l’output del log nella sezione Dettagli.
Visualizzazione dei log nella console CloudWatch
Puoi utilizzare la CloudWatch console Amazon per visualizzare i log di tutte le chiamate di funzioni Lambda.
Per visualizzare i log sulla console CloudWatch
-
Apri la pagina Registra gruppi
sulla CloudWatch console. -
Scegli il gruppo di log per la tua funzione (/aws/lambda/
your-function-name
). -
Creare un flusso di log.
Ogni flusso di log corrisponde a un'istanza della funzione. Nuovi flussi di log vengono visualizzati quando aggiorni la funzione Lambda e quando vengono create istanze aggiuntive per gestire più chiamate simultanee. Per trovare i log per una chiamata specifica, ti consigliamo di strumentare la tua funzione con. AWS X-Ray X-Ray registra i dettagli sulla richiesta e il flusso di log nella traccia.
Visualizzazione dei log con AWS CLI
AWS CLI È uno strumento open source che consente di interagire con i AWS servizi utilizzando i comandi nella shell della riga di comando. Per completare le fasi riportate in questa sezione, è necessario:
È possibile utilizzare AWS CLI per recuperare i log per una chiamata utilizzando l'opzione di comando --log-type
. La risposta include un campo LogResult
che contiene fino a 4 KB di log con codifica base64 del richiamo.
Esempio recuperare un ID di log
Nell'esempio seguente viene illustrato come recuperare un ID di log dal LogResult
campo per una funzione denominata my-function
.
aws lambda invoke --function-name my-function out --log-type Tail
Verrà visualizzato l'output seguente:
{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
Esempio decodificare i log
Nello stesso prompt dei comandi, utilizzare l'base64
utilità per decodificare i log. Nell'esempio seguente viene illustrato come recuperare i log codificati in base64 per my-function
.
aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
L'cli-binary-formatopzione è obbligatoria se si utilizza la AWS CLI versione 2. Per rendere questa impostazione come predefinita, esegui aws configure set cli-binary-format raw-in-base64-out
. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.
Verrà visualizzato l'output seguente:
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB
L'utilità base64
è disponibile su Linux, macOS e Ubuntu su Windowsbase64 -D
.
Esempio Script get-logs.sh
Nello stesso prompt dei comandi, utilizzare lo script seguente per scaricare gli ultimi cinque eventi di log. Lo script utilizza sed
per rimuovere le virgolette dal file di output e rimane in sospensione per 15 secondi in attesa che i log diventino disponibili. L'output include la risposta di Lambda e l'output del comando get-log-events
.
Copiare il contenuto del seguente esempio di codice e salvare nella directory del progetto Lambda come get-logs.sh
.
L'cli-binary-formatopzione è obbligatoria se utilizzi la AWS CLI versione 2. Per rendere questa impostazione come predefinita, esegui aws configure set cli-binary-format raw-in-base64-out
. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.
#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/
my-function
--log-stream-namestream1
--limit 5
Esempio (solo) macOS e Linux
Nello stesso prompt dei comandi, gli utenti macOS e Linux potrebbero dover eseguire il seguente comando per assicurarsi che lo script sia eseguibile.
chmod -R 755 get-logs.sh
Esempio recuperare gli ultimi cinque eventi di log
Nello stesso prompt dei comandi, eseguire lo script seguente per ottenere gli ultimi cinque eventi di log.
./get-logs.sh
Verrà visualizzato l'output seguente:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }
Eliminazione dei log
I gruppi di log non vengono eliminati automaticamente quando si elimina una funzione. Per evitare di archiviare i log a tempo indeterminato, eliminare il gruppo di log o configurare un periodo di conservazione trascorso il quale i log vengono eliminati automaticamente.
Utilizzo di altri strumenti e librerie di registrazione
Powertools for AWS Lambda (Python
Acquisisci i campi chiave dal contesto Lambda, dall'avvio a freddo e dall'output di registrazione delle strutture come JSON
Registrazione degli eventi di chiamata Lambda quando richiesto (disabilitata per impostazione predefinita)
Stampa di tutti i log solo per una percentuale di chiamate tramite campionamento dei log (disabilitata per impostazione predefinita)
Aggiunta di chiavi supplementari al log strutturato in qualsiasi momento
Utilizza un formattatore di log personalizzato (Bring Your Own Formatter) per generare i log in una struttura compatibile con il Logging della tua organizzazione RFC
Utilizzo di Powertools per AWS Lambda (Python) AWS SAM e per la registrazione strutturata
Segui i passaggi riportati sotto per scaricare, creare e implementare un'applicazione Python Hello World di esempio con moduli Powertools per Pythonhello world
.
Prerequisiti
Per completare le fasi riportate in questa sezione, è necessario:
-
Python 3.9
-
AWS SAM CLIversione 1.75 o successiva. Se disponi di una versione precedente di AWS SAM CLI, consulta Aggiornamento di. AWS SAM CLI
Implementa un'applicazione di esempio AWS SAM
-
Inizializza l'applicazione utilizzando il modello Python Hello World.
sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.9 --no-tracing
-
Costruisci l'app.
cd sam-app && sam build
-
Distribuire l'app.
sam deploy --guided
-
Seguire le istruzioni visualizzate sullo schermo. Per accettare le opzioni predefinite fornite nell'esperienza interattiva, premi
Enter
.Nota
Perché HelloWorldFunction potrebbe non avere un'autorizzazione definita, va bene? , assicurati di entrare
y
. -
Scarica URL l'applicazione distribuita:
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
Invoca l'APIendpoint:
curl GET
<URL_FROM_PREVIOUS_STEP>
In caso di esito positivo, vedrai questa risposta:
{"message":"hello world"}
-
Per ottenere i log per la funzione, esegui sam logs. Per ulteriori informazioni, consulta l'argomento relativo all'utilizzo dei log nella Guida per sviluppatori AWS Serverless Application Model .
sam logs --stack-name sam-app
L'output del log ha la struttura seguente:
2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:50.371000 INIT_START Runtime Version: python:3.9.v16 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:07a48df201798d627f2b950f03bb227aab4a655a1d019c3296406f95937e2525 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.112000 START RequestId: d455cfc4-7704-46df-901b-2a5cce9405be Version: $LATEST 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.114000 { "level": "INFO", "location": "hello:23", "message": "Hello world API - HTTP 200", "timestamp": "2023-02-03 14:59:51,113+0000", "service": "PowertoolsHelloWorld", "cold_start": true, "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j", "function_memory_size": "128", "function_arn": "arn:aws:lambda:us-east-1:111122223333:function:sam-app-HelloWorldFunction-YBg8yfYtOc9j", "function_request_id": "d455cfc4-7704-46df-901b-2a5cce9405be", "correlation_id": "e73f8aef-5e07-436e-a30b-63e4b23f0047", "xray_trace_id": "1-63dd2166-434a12c22e1307ff2114f299" } 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.126000 { "_aws": { "Timestamp": 1675436391126, "CloudWatchMetrics": [ { "Namespace": "Powertools", "Dimensions": [ [ "function_name", "service" ] ], "Metrics": [ { "Name": "ColdStart", "Unit": "Count" } ] } ] }, "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j", "service": "PowertoolsHelloWorld", "ColdStart": [ 1.0 ] } 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.126000 { "_aws": { "Timestamp": 1675436391126, "CloudWatchMetrics": [ { "Namespace": "Powertools", "Dimensions": [ [ "service" ] ], "Metrics": [ { "Name": "HelloWorldInvocations", "Unit": "Count" } ] } ] }, "service": "PowertoolsHelloWorld", "HelloWorldInvocations": [ 1.0 ] } 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.128000 END RequestId: d455cfc4-7704-46df-901b-2a5cce9405be 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.128000 REPORT RequestId: d455cfc4-7704-46df-901b-2a5cce9405be Duration: 16.33 ms Billed Duration: 17 ms Memory Size: 128 MB Max Memory Used: 64 MB Init Duration: 739.46 ms XRAY TraceId: 1-63dd2166-434a12c22e1307ff2114f299 SegmentId: 3c5d18d735a1ced0 Sampled: true
-
Si tratta di un API endpoint pubblico accessibile tramite Internet. È consigliabile eliminare l'endpoint dopo il test.
sam delete
Gestione della conservazione dei log
I gruppi di log non vengono eliminati automaticamente quando si elimina una funzione. Per evitare di archiviare i log a tempo indeterminato, elimina il gruppo di log o configura un periodo di conservazione dopo il quale i log CloudWatch vengono eliminati automaticamente. Per configurare la conservazione dei log, aggiungi quanto segue al tuo modello: AWS SAM
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: # Omitting other properties LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}" RetentionInDays: 7
Utilizzo di Powertools per AWS Lambda (Python) AWS CDK e per la registrazione strutturata
Segui i passaggi seguenti per scaricare, creare e distribuire un'applicazione Hello World Python di esempio con i moduli Powertools for AWS Lambda (Python) integrati
Prerequisiti
Per completare le fasi riportate in questa sezione, è necessario:
-
Python 3.9
-
AWS SAM CLIversione 1.75 o successiva. Se disponi di una versione precedente di AWS SAM CLI, consulta Aggiornamento di. AWS SAM CLI
Implementa un'applicazione di esempio AWS CDK
-
Crea una directory di progetto per la nuova applicazione.
mkdir hello-world cd hello-world
-
Inizializza l'app.
cdk init app --language python
-
Installa le dipendenze di Python.
pip install -r requirements.txt
Crea una directory lambda_function nella cartella root.
mkdir lambda_function cd lambda_function
Crea un file app.py e aggiungi il seguente codice al file. Questo è il codice per la funzione Lambda.
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)
-
Apri la directory hello_world. Dovrebbe essere visualizzato un file denominato hello_world_stack.py.
cd .. cd hello_world
Apri hello_world_stack.py e aggiungi il seguente codice al file. Contiene il Lambda Constructor, che crea la funzione Lambda, configura le variabili di ambiente per Powertools e imposta la conservazione dei log su una settimana, e il costruttore 1, che crea il ApiGatewayv. REST API
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")
-
Distribuisci l'applicazione.
cd .. cdk deploy
-
Ottieni la versione dell'applicazione distribuita: URL
aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?OutputKey==`apiUrl`].OutputValue' --output text
-
Invoca l'APIendpoint:
curl GET
<URL_FROM_PREVIOUS_STEP>
In caso di esito positivo, vedrai questa risposta:
{"message":"hello world"}
-
Per ottenere i log per la funzione, esegui sam logs. Per ulteriori informazioni, consulta l'argomento relativo all'utilizzo dei log nella Guida per sviluppatori AWS Serverless Application Model .
sam logs --stack-name HelloWorldStack
L'output del log ha la struttura seguente:
2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:50.371000 INIT_START Runtime Version: python:3.9.v16 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:07a48df201798d627f2b950f03bb227aab4a655a1d019c3296406f95937e2525 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.112000 START RequestId: d455cfc4-7704-46df-901b-2a5cce9405be Version: $LATEST 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.114000 { "level": "INFO", "location": "hello:23", "message": "Hello world API - HTTP 200", "timestamp": "2023-02-03 14:59:51,113+0000", "service": "PowertoolsHelloWorld", "cold_start": true, "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j", "function_memory_size": "128", "function_arn": "arn:aws:lambda:us-east-1:111122223333:function:sam-app-HelloWorldFunction-YBg8yfYtOc9j", "function_request_id": "d455cfc4-7704-46df-901b-2a5cce9405be", "correlation_id": "e73f8aef-5e07-436e-a30b-63e4b23f0047", "xray_trace_id": "1-63dd2166-434a12c22e1307ff2114f299" } 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.126000 { "_aws": { "Timestamp": 1675436391126, "CloudWatchMetrics": [ { "Namespace": "Powertools", "Dimensions": [ [ "function_name", "service" ] ], "Metrics": [ { "Name": "ColdStart", "Unit": "Count" } ] } ] }, "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j", "service": "PowertoolsHelloWorld", "ColdStart": [ 1.0 ] } 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.126000 { "_aws": { "Timestamp": 1675436391126, "CloudWatchMetrics": [ { "Namespace": "Powertools", "Dimensions": [ [ "service" ] ], "Metrics": [ { "Name": "HelloWorldInvocations", "Unit": "Count" } ] } ] }, "service": "PowertoolsHelloWorld", "HelloWorldInvocations": [ 1.0 ] } 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.128000 END RequestId: d455cfc4-7704-46df-901b-2a5cce9405be 2023/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2023-02-03T14:59:51.128000 REPORT RequestId: d455cfc4-7704-46df-901b-2a5cce9405be Duration: 16.33 ms Billed Duration: 17 ms Memory Size: 128 MB Max Memory Used: 64 MB Init Duration: 739.46 ms XRAY TraceId: 1-63dd2166-434a12c22e1307ff2114f299 SegmentId: 3c5d18d735a1ced0 Sampled: true
-
Si tratta di un API endpoint pubblico accessibile tramite Internet. È consigliabile eliminare l'endpoint dopo il test.
cdk destroy